歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 淺談Linux2.6內核的編譯步驟及模塊動態加載

淺談Linux2.6內核的編譯步驟及模塊動態加載

日期:2017/2/25 10:36:22   编辑:Linux教程

可見,已經生成模塊文件hello.ko.
  然後,就可以加載該模塊:
  debian:/home/david # insmod hello.ko
  查看模塊是否加載進內核:
  debian:/home/david # lsmod
  Module Size Used by
  hello 1344 0
  nfs 219468 0
  nfsd 202224 17
  …… ……
  其中Module名為hello的即為我們所加載的模塊.
  卸載模塊:
  debian:/home/david # rmmod hello
  同樣可以通過lsmod來查看該模塊是否被卸載.
  這裡有兩個問題,其一就是printk()輸出的問題.LDD3上也說,在加載和卸載模塊的時候都會有信息輸出在屏幕上,如果在 Windows 下通過終端仿真器(我們常用的虛擬機算是一種),則在屏幕上看不到任何輸出.我同時在虛擬機和和物理機都運行了該模塊,均未看到有"Hello, world"(加載模塊時printk的輸出)或"Goodby, cruel world"(卸載模塊時printk的輸出). 這個不知道是我操作系統發行版的原因還是系統配置的問題,請了解這個問題的朋友指點一下.
  其二,書上講到如果屏幕上看不到信息,可能輸出在某個日志文件裡面了,並說可能在/var/log/messages文件中.並且看到網上很多網友也說是輸出到這個文件裡面.我不知道有沒有發現輸出在其他日志文件裡的,不過我的這個信息輸出在/var/log/syslog裡面.在加載和卸載完該模塊後, 執行命令:
  debian:/home/david # cat /var/log/syslog | grep world
  可以看到有兩行內容.當然,也可以不用grep world, 應該會出現在最後兩行.
  Jul 20 14:15:29 localhost kernel: Hello, world
  Jul 20 14:15:34 localhost kernel: Goodbye, cruel world
  這就是printk應該輸出的信息.
  這裡有另外一個方法,可以實現printk的信息輸出在屏幕上,即更改printk輸出的優先級.例子中的優先級為:KERN_ALERT,優先級為<1>,如果將優先級改為KERN_EMERG即<0>,則可以看到屏幕的輸出信息.
  修改的方法只是修改一下hello.c中兩句printk()的內容,修改後的hello.c如下:

#include
#include
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_EMERG "Hello, world\n"); /*改動部分*/
return 0;
}
static void hello_exit(void)
{
printk(KERN_EMERG"Goodbye, cruel world\n"); /*改動部分*/
}
module_init(hello_init);
module_exit(hello_exit);   同樣的方法編譯生成模塊,再次用insmod和rmmod,則在屏幕上看到的輸出信息為:

debian:/home/david# insmod hello.ko
debian:/home/david#
Message from syslogd@localhost at Fri Jul 20 14:27:32 2007 ...
localhost kernel: Hello, world
debian:/home/david# rmmod ello
debian:/home/david#
Message from syslogd@localhost at Fri Jul 20 14:27:42 2007 ...
localhost kernel: Goodbye, cruel world
debian:/home/david   但是,是否能夠將printk()的優先級改為KERN_EMERG值得商榷.因為在Linux Kernel Development中,對該優先級的描述為: An emergency condition; the system is probably dead.
  以上就是整個2.6內核編譯步驟以及模塊動態加載的方法.理解和解釋有誤的地方,也請各位浏覽本文的朋友指點,也希望能和對內核和驅動感興趣的朋友交流。

Copyright © Linux教程網 All Rights Reserved