英文第三版 http://books.google.com/books?id=M7RHMACEkg4C&printsec=frontcover#v=onepage&q&f=false
01章 An Introduction to Device Drivers
驅動的角色
policy: how to use capability Gnome ftp http
mechanism: what to be provided X Serv TCP/IP
核心介紹:任務,記憶體,檔案管理,驅動,網絡
子產品:char module:open, close, read, and write system calls
block module
network module.
安全與版本
02章 Building and Running Modules
2.1建立純淨的核心環境
2.2helloworld,注意makefile的寫法:
include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world/n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world/n");
}
module_init(hello_init);
module_exit(hello_exit);
obj-m:=hello.o
KERNELDIR:=/lib/modules/2.6.26-2-686/build
PWD :=$(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
2.3驅動和應用程式的差別:初始化與退出,隻能調用核心函數,不調用庫,唯一的例外是頭檔案<stdarg.h>,核心函數定義在核心源碼樹linux/include下
使用者空間和核心空間
核心并發:擷取目前程序current <linux/sched.h>
一些細節:由于核心棧很小(4096B),需要自己申請記憶體,不支援浮點運算
2.4編譯和加載
講解helloworld的makefile
裝載解除安裝子產品 insmod=ld 注意kernel/module.c中為insmod安排記憶體,調用子產品并初始化
sys_為系統調用字首
lsmod =cat /proc//modules =ls /sys/module
版本依賴 必須為每個核心樹重新編譯,否則helloworld也會出錯。vermagic.o檢查是否match
簡介version.h裡面的宏
平台依賴 vermagic.o
2.5 核心符号表 其他子產品可使用新子產品輸出的變量,由此形成子產品堆疊(module stack),如USB驅動都在usbcore的基礎上
2.6預備知識 #include <linux/module.h> <linux/init.h> //向子產品傳遞參數<linux/moduleparam.h>
MODULE_AUTHOR,MODULE_DESCRIPTION,MODULE_VERSION,MODULE_ALIAS,MODULE_DEVICE_TABLE
2.7初始化和退出
聲明static int __init functionA(void) //加static,這樣子產品外就不可見
module_init(initialization_function); //定義初始化函數
退出:static void __exit functionB(void)
module_exit(cleanup_function);
初始化時的錯誤處理:goto語句的使用,錯誤處理函數
2.8子產品參數 加入參數
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
static char *whom = "world";
static int howmany = 2;
module_param(howmany, int, S_IRUGO);
module_param(whom, charp, S_IRUGO);
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
int i=0;
while(i<howmany){
printk(KERN_ALERT"%s world!/n", whom);
i++;
}
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world/n");
}
module_init(hello_init);
module_exit(hello_exit);
[email protected]~:#insmod hello.ko howmany=5 whom="hello "
2.9 使用者模式(非核心模式)驅動:優點和缺點,如可使用庫,不受核心棧限制
03章 Char Drivers
3.1 scull設計 幾種類型的驅動,本章讨論scull0-3,後文讨論scullpipe與scull的其他通路控制類型
3.2 major&minor編号
3.2.1 裝置編号的内部表示 <linux/types.h> dev_t get/set major&minor
3.2.2 申請和釋放裝置編号
3.2.3 major的動态配置設定 alloc_chrdev_region 使用bash腳本,使用動态配置設定,但留有更改major的選項,如通過insmod傳遞參數,更改宏定義
3.3 一些資料結構<linux/fs.h> file_operations,file,node
3.3.1 檔案操作 解釋file_operations的定義
3.3.2 檔案結構 file的定義
3.3.3 inode結構
3.4字元裝置注冊 <linux/cdev.h> cdev的初始化操作
3.4.1 scull的裝置注冊
3.4.2 老方法
3.5open&release
3.5.1 自定義的device_open
3.5.2 自定義的device_release/close
3.6 scull的記憶體使用<linux/slab.h>
*kmalloc和 kfree ,更好的記憶體配置設定方法參見08章節
3.7 read&write readv&writev
使用者态:read
copy_to_user/copy_from_user
3.8 使用新裝置
如何測試scull