Linux核心模組程式設計--替代printk系列(轉)
代替 printk
在本書開始的時候,我說過 X 和核心模組程式設計不能混合。在開發核心模組時那是對的,但在實際使用中你想可以向任何向模組傳送命令的終端(Teletype, 最初是用於和Unix系統溝通的鍵盤和印表機的組合,而今天它是用於Unix程式的文字流的抽象,無論它是一個物理的終端、X顯示器上的 xterm 還是用telnet 的網路連線,等等。)傳送訊息。這對在核心模組被釋放後識別錯誤是很重要的,因為它將被所有模組使用。
實現這個的一個辦法是使用指向當前執行作業的指標 current得到當前作業的終端結構。然後我們在那個終端結構裡面找指向字串寫函式的指標,我們可以用它向終端寫字串。
範例 printk.c
/* printk.c - 向你正在執行的終端輸出文字,無論它是否透過 X11, telnet, 等等。 *//* Copyright (C) 1998 by Ori Pomerantz *//* 必要標頭檔案 *//* 標準標頭檔案 */#include /* 核心工作 */#include /* 明確指定是模組 *//* 處理 CONFIG_MODVERSIONS */#if CONFIG_MODVERSIONS==1#define MODVERSIONS#include#endif/* 必要的 */#include /* 為了 current */#include /* 為了終端宣告 *//* 向當前作業使用的終端列印字串 */void print_string(char *str){struct tty_struct *my_tty;/* 當前作業終端 */my_tty = current->tty;/* 如果 my_tty 為 NULL則意味著當前作用沒有你可以列印的終端。* (這是可能的,例如它是一個守護程式)* 在這中情況下我們不能做任何事。 */if (my_tty != NULL) {/* my_tty->driver 是包含終端函式的結構,它們中的一個(寫)用於向終端寫字串。* 它可以用於從使用者記憶體段或核心記憶體段取字串。** 函式的第一個引數是要寫向的終端,因為同一函式通常用於所有的屬某種型別的終端。* 第二個引數控制是從核心記憶體段(false,0)還是從使用者記憶體段(true,非零)接收字串。* 第三個引數是指向字串的指標,第四個是字串的長度。*/(*(my_tty->driver).write)(my_tty, /* 終端自己 */0, /* 我們不從使用者空間取字串 */str, /* 字串 */strlen(str)); /* 長度 *//* 終端是最初的硬體裝置,它(通常)嚴格的堅持 ASCII 標準。* 根據 ASCII,換行需要兩個字元,回車和走行。另一方面,在Unix 中,* ASCII 走行符用於這兩個目的-因此我們不能僅僅用 ,因為它沒有回車,* 下一行將在上面那行後的走行符的右邊的那列開始而非行首。** 順便說一下,這就是為什麼 Unix 和 Windows的文字檔案不同的原因。* 在 CP/M 和它的派生產品,例如 MS-DOS 和 Windows, ASCII 被嚴格的堅持,因此* 新行需要走行和回車。*/(*(my_tty->driver).write)(my_tty,0,"1512",2);}}/* 初始化和清除模組 ****************** *//* 初始化模組-登記 proc 檔案 */int init_module(){print_string("Module Inserted");return 0;}/* 清除 - 從/proc中登出我們的檔案 */void cleanup_module(){print_string("Module Removed");}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-940220/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux核心模組Linux
- Linux核心模組編譯Linux編譯
- Linux核心模組學習Linux
- 【轉載】Linux核心除錯之使用模組引數Linux除錯
- Linux核心net模組引入了Rust程式碼 - PhoronixLinuxRust
- 深入學習 Linux 核心模組Linux
- 使用GDK7除錯Linux核心之printk函式除錯Linux函式
- 高效學習Linux核心——核心模組編譯Linux編譯
- JS模組化程式設計JS程式設計
- javascript 模組化程式設計JavaScript程式設計
- Java9系列第8篇-Module模組化程式設計Java程式設計
- 《程式設計時間簡史系列》JavaScript 模組化的歷史程式程式設計JavaScript
- 【linux】驅動-2-核心模組Linux
- 解讀 Node 核心模組 Stream 系列一( Readable )
- Spring-boot模組化程式設計Springboot程式設計
- 如何使用cgdb + qemu除錯linux核心模組除錯Linux
- 【Linux網路程式設計】位元組序Linux程式設計
- Python中常用網路程式設計模組Python程式設計
- 簡述JavaScript模組化程式設計(二)JavaScript程式設計
- QT QML模組的程式設計藝術QT程式設計
- 商品模組設計
- 【設計模式】如何用組合替代繼承設計模式繼承
- windows核心程式設計--程式Windows程式設計
- 解讀Node核心模組Stream系列一(Writable和pipe)
- C++模組2:物件導向程式設計C++物件程式設計
- windows核心程式設計--核心物件Windows程式設計物件
- linux核心設計與實現Linux
- Linux核心模組驅動載入與dmesg除錯Linux除錯
- node核心模組-vm
- toa 核心模組分析
- 深入小程式系列之一:小程式核心原理及模擬
- 用函式實現模組化程式設計二函式程式設計
- 用函式實現模組化程式設計三函式程式設計
- 用函式實現模組化程式設計一函式程式設計
- 使用面向 Aspect 的程式設計改進模組性程式設計
- Python程式設計時候,匯入模組失敗Python程式設計
- Windows核心程式設計_HookWindows程式設計Hook
- C++核心程式設計C++程式設計
- 設計模式系列 – 組合模式設計模式