《Linux Device Drivers》第二章 構造和運行模塊——note

1     代碼是一個完整的 "hello world"模塊:

  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. MODULE_LICENSE("Dual BSD/GPL");
  4.  
  5. static int hello_init(void)
  6. {
  7.     printk(KERN_ALERT "Hello, world\n");
  8.     return 0;
  9. }
  10.  
  11. static void hello_exit(void)
  12. {
  13.     printk(KERN_ALERT "Goodbye, cruel world\n");
  14. }
  15.  
  16. module_init(hello_init);
  17. module_exit(hello_exit);

這個模塊定義了兩個函數, 一個在模塊加載到內核時被調用( hello_init )以及 一個在模塊被去除時被調用( hello_exit ). moudle_init 和 module_exit 這幾 行使用了特別的內核宏來指出這兩個函數的角色. 另一個特別的宏 (MODULE_LICENSE) 是用來告知內核, 該模塊帶有一個自由的許可證; 沒有這樣 的說明, 在模塊加載時內核會抱怨


2     核心模塊與應用程序的基本區別

(1)驅動程序類似事件驅動編程,它初始化時候,註冊一些設施,服務於系統調用

(2)應用程序運行在用戶空間,驅動程序運行在內核空間

(3)應用程序可使用標準的庫函數,而驅動程序連接到內核,只能使用內核導出的符號和函數

(4)應用程序錯誤,一般只會殺死進程,而驅動程序錯誤,會造成系統不穩定,或者崩潰

(5)應用程序擁有很大的棧空間,而內核棧很小,一般只有4KB


3     內核中併發的來源

(1)對稱多處理器

(2)可延時機制timer、tasklet、workqueue

(3)大多數設備能夠中斷處理器,而中斷處理程序異步運行


4     當前進程

(1)asm.current.h,current

(2)linux/sched.h,struct task_struct


5     一些細節

(1)具有前綴__的函數名稱通常是接口的底層組件,應謹慎使用

(2)內核代碼不能實現浮點數運算


6     編譯和裝載模塊

(1)/proc/modules

(2)/sys/module

(3)編譯模塊

 (4)Makefile

   module-objs :=file1.o file2.o 

   obj-m := module.o

   make -C /usr/src/kernels/2.6.10/ M=`pwd` modules


7 裝載和卸載模塊

(1)insmod和ld有些類似,將模塊的代碼和數據裝入內核,然後使用內核的符號表解析模塊中任何未解析的符號

(2)與鏈接器不同,內核不會修改模塊的磁盤文件,而僅僅修改內存中的副本

(3)依賴定義在kernel/module.c中的一個系統調用

(4)sys_init_module給模塊分配內核內存

(5)只有系統調用的名字前帶有sys_前綴

(7)modprobe

(8)rmmod

(9)lsmod

(10)lsusb


8     版本依賴

(1)linux/versi(2)linux/module.h

UTS_RELEASE

LINUX_VERSION_CODE

KERNEL_VERSION(major,minor, release)


9     內核符號表

(1) Linux內核頭文件提供了一個方便的方法來管理符號對模塊外部的可見性,從而減少了可能造成的名字空間污染

(2)EXPORT_SYMBOL(name);

(3)EXPORT_SYMBOL_GPL(name);


10     其他知識

(1)頭文件:函數、數據類型和變量的定義

(2)所有模塊代碼中都包含的代碼

                  #include<linux/module.h>

                  #include<linux/init.h>

module.h包含有可裝載模塊需要的大量符號和函數的定義

init.h的目的是指定初始化和清除函數

內核能夠識別的許可證

      • GPL
      • GPL v2
      • GPL and additional rights
      • Dual BSD/GPL
      • Dual MPL/GPL
      • Proprietary

如果一個模塊沒有地標記爲上述內核可識別的許可證,則會被假定是專有的

 (3) 描述性定義

      • MODULE_AUTHOR
      • MODULE_DESCRIPTION
      • MODULE_VERSION
      • MODULE_ALIAS
      • MODULE_DEVICE_TABLE

(4)模塊參數

    • moduleparam.h
      • module_param
      • 變量的名稱、類型以及用於sysfs入口項的訪問許可掩碼
    • 內核支持的模塊參數類型
      • bool
      • invbool
      • charp
      • int
      • long
      • short
      • uint
      • ulong
      • ushort
    • module_param_array(name, type, num, perm);

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章