2012年3月21日 星期三

Linux驅動程式--chapter 2

這一章節簡單的給了個module的入門,一個只是用來insmod跟rmmod的moduule

#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int __init hello_init(void){
  printk(KERN_ALERT "Hello, world\n");
  return 0;
}
static void __exit hello exit(void){
  printk("KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
與一般user space不同,由於module運行於kernel space,所以並不連結一般的lib,所以類似printf就不能使用,只能使用printk,KERN_ALERT是一個macro,後面沒有逗點,module_init點出insmod module就運行的function,相對的module_exit則是rmmod的時候

設計module必須考量到

  • 是kernel space or user space(有些驅動程式是可以為user space,但是有好有壞)
  • module變數的race condition
  • module必須是reentrant
  • module的lifetime幾乎等同kernel,從insmod到rmmod(往往就是開機到關機),中間變數一直存在,並不隨著被服務的process結束而結束
  • module的記憶體有限,堆疊不可能配置太大的空間
  • module往往跟目前服務的process有很大的關係,可以使用struct task_struct中的current指向目前的process
  • module的相依性處理不完全在於程式,在於管理者必須知道使用modprobe來追蹤,但是這也表示module往往跟版本有很大的關係


在headers內定義了許多macro是供給modinfo用的

  • MODULE_LICENSE : 是使用GPL or BSD還是其他
  • MODULE_AUTHOR : 作者資訊
  • MODULE_VERSION : 版本,通常表示支援的kernel version等等
  • MODULE_DESCRIPTION : 描述
  • MODULE_ALIAS : alias name
  • MODULE_DEVICE_TABLE : 支援的device


有些關鍵字是C語言內沒有的,例如__init跟__exit,這是給compiler用的,分別表明該函數是初始化以及結束時該呼叫的,另外還有__initdata與__exitdata表示初始配置資料的函數跟離開時後歸還空間的函數,往往用於hotplug

其他關於編譯的細節以及一些版本號碼控管有空再說,本身這是一章節談論到很多關於kernel module的觀念

這本書每章節後面都會簡單的summary這章節的內容,蠻有幫助的


沒有留言:

張貼留言