Linux核心模組程式設計--替代printk系列(轉)

worldblog發表於2007-08-10
Linux核心模組程式設計--替代printk系列(轉)[@more@]

  代替 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章