天天看點

Linux Device Drivers讀書筆記01-03章01章 An Introduction to Device Drivers02章 Building and Running Modules03章 Char Drivers

英文第三版 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

繼續閱讀