




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1說(shuō)在前面說(shuō)在前面Linux設(shè)備驅(qū)動(dòng)只有專著,沒(méi)有教材,高校幾乎均未設(shè)備驅(qū)動(dòng)只有專著,沒(méi)有教材,高校幾乎均未開(kāi)設(shè)此課,僅少數(shù)社會(huì)培訓(xùn)機(jī)構(gòu)開(kāi)展過(guò)培訓(xùn),培訓(xùn)費(fèi)開(kāi)設(shè)此課,僅少數(shù)社會(huì)培訓(xùn)機(jī)構(gòu)開(kāi)展過(guò)培訓(xùn),培訓(xùn)費(fèi)天價(jià)天價(jià)涉及內(nèi)核,內(nèi)容多,難理解,難表達(dá),屬費(fèi)力不討好涉及內(nèi)核,內(nèi)容多,難理解,難表達(dá),屬費(fèi)力不討好的課,中國(guó)高校往往重科研輕教學(xué),象這類需花費(fèi)太的課,中國(guó)高校往往重科研輕教學(xué),象這類需花費(fèi)太多力氣的課沒(méi)人愿開(kāi)多力氣的課沒(méi)人愿開(kāi)嵌入式系統(tǒng)的價(jià)值在軟件,軟件的核心在驅(qū)動(dòng)嵌入式系統(tǒng)的價(jià)值在軟件,軟件的核心在驅(qū)動(dòng)嵌入式系統(tǒng)方向不開(kāi)嵌入式系統(tǒng)方向不開(kāi)Linux設(shè)備驅(qū)動(dòng)不夠深入,前幾設(shè)備驅(qū)動(dòng)不夠深入,前幾屆
2、未開(kāi)主要缺人手,看到部分同學(xué)自學(xué)時(shí)總感到遺憾屆未開(kāi)主要缺人手,看到部分同學(xué)自學(xué)時(shí)總感到遺憾課難,要有思想準(zhǔn)備,有不懂正常,不求全懂,先打課難,要有思想準(zhǔn)備,有不懂正常,不求全懂,先打下點(diǎn)基礎(chǔ),以后有機(jī)再深入進(jìn)去下點(diǎn)基礎(chǔ),以后有機(jī)再深入進(jìn)去2說(shuō)在前面說(shuō)在前面強(qiáng)調(diào)強(qiáng)調(diào)Linux內(nèi)核基礎(chǔ)知識(shí)與驅(qū)動(dòng)程序設(shè)計(jì)方法,不在內(nèi)核基礎(chǔ)知識(shí)與驅(qū)動(dòng)程序設(shè)計(jì)方法,不在于某一具體設(shè)備的驅(qū)動(dòng)程序的編寫(xiě),授人以于某一具體設(shè)備的驅(qū)動(dòng)程序的編寫(xiě),授人以“漁漁”,而不是授人以而不是授人以“魚(yú)魚(yú)”如以太網(wǎng)卡、如以太網(wǎng)卡、USB等設(shè)備,數(shù)據(jù)手冊(cè)上百頁(yè),寄存器等設(shè)備,數(shù)據(jù)手冊(cè)上百頁(yè),寄存器上百個(gè),講透一個(gè)設(shè)備的驅(qū)動(dòng)就需一門(mén)課時(shí)間上百個(gè)
3、,講透一個(gè)設(shè)備的驅(qū)動(dòng)就需一門(mén)課時(shí)間本書(shū)使用本書(shū)使用“虛擬設(shè)備虛擬設(shè)備”,避開(kāi)處理復(fù)雜的實(shí)際設(shè)備,避開(kāi)處理復(fù)雜的實(shí)際設(shè)備,將重點(diǎn)放在內(nèi)核知識(shí)與驅(qū)動(dòng)設(shè)計(jì)方法上將重點(diǎn)放在內(nèi)核知識(shí)與驅(qū)動(dòng)設(shè)計(jì)方法上本書(shū)是一本公認(rèn)的非常權(quán)威的專著,翻譯也不錯(cuò),跟本書(shū)是一本公認(rèn)的非常權(quán)威的專著,翻譯也不錯(cuò),跟著書(shū)走總不會(huì)錯(cuò)著書(shū)走總不會(huì)錯(cuò)要讀書(shū),讀懂過(guò)的書(shū)即使要讀書(shū),讀懂過(guò)的書(shū)即使10年也能輕易重新拾起年也能輕易重新拾起增加隨堂考試,課堂討論,課堂讀書(shū)增加隨堂考試,課堂討論,課堂讀書(shū)3參考書(shū)參考書(shū)深入理解深入理解Linux內(nèi)核,第內(nèi)核,第3版,陳莉君等譯版,陳莉君等譯深入理解深入理解Linux內(nèi)核架構(gòu),郭旭譯內(nèi)核架構(gòu),郭旭譯
4、Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn),陳莉君等譯內(nèi)核設(shè)計(jì)與實(shí)現(xiàn),陳莉君等譯精通精通Linux設(shè)備驅(qū)動(dòng)程開(kāi)發(fā),宋寶華等譯設(shè)備驅(qū)動(dòng)程開(kāi)發(fā),宋寶華等譯Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解,宋寶華編著設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解,宋寶華編著4第第1章章 設(shè)備驅(qū)動(dòng)程序簡(jiǎn)介設(shè)備驅(qū)動(dòng)程序簡(jiǎn)介什么是設(shè)備驅(qū)動(dòng)程序什么是設(shè)備驅(qū)動(dòng)程序內(nèi)核功能劃分內(nèi)核功能劃分可裝載模塊可裝載模塊設(shè)備和模塊的分類設(shè)備和模塊的分類5什么是設(shè)備驅(qū)動(dòng)程什么是設(shè)備驅(qū)動(dòng)程設(shè)備驅(qū)動(dòng)程序是對(duì)設(shè)備直接進(jìn)行設(shè)備驅(qū)動(dòng)程序是對(duì)設(shè)備直接進(jìn)行操作操作控制的控制的程程序序操作包括初始化、讀、寫(xiě)等操作包括初始化、讀、寫(xiě)等LED1LED2PB9PB10VDD3344B0X6LED1LED2PB9PB
5、10VDD3344B0XrPDATBrPDATB=0 x1FF;LED1=0 x1FF;LED1、LED2LED2亮亮rPDATBrPDATB=0 x7FF;LED1=0 x7FF;LED1、LED2LED2滅滅#define rPCONB#define rPCONB ( (* *(volatile unsigned (volatile unsigned * *)0 x1d20008)0 x1d20008)#define rPDATB#define rPDATB ( (* *(volatile unsigned (volatile unsigned * *)0 x1d2000c)0 x1d20
6、00c)1.LED底層驅(qū)動(dòng)底層驅(qū)動(dòng)/裸驅(qū)裸驅(qū)初始化初始化leds_on()封裝封裝leds_off()封裝封裝控制(寫(xiě))控制(寫(xiě))rPCONB=rPCONB&B1010; B10=0,設(shè)為輸出,設(shè)為輸出rPCONB=rPCONB&B99 ; B9=0 ,設(shè)為輸出,設(shè)為輸出什么是設(shè)備驅(qū)動(dòng)程什么是設(shè)備驅(qū)動(dòng)程7(1)雙亮驅(qū)動(dòng)雙亮驅(qū)動(dòng)void leds_on()Led_Display(0 x3);rPDATBrPDATB=0 x1FF;=0 x1FF;LED1LED2PB9PB10VDD3344B0X什么是設(shè)備驅(qū)動(dòng)程什么是設(shè)備驅(qū)動(dòng)程8(2)雙滅驅(qū)動(dòng)雙滅驅(qū)動(dòng)void leds_off()Led_Disp
7、lay(0 x0);rPDATBrPDATB=0 x7FF;=0 x7FF;LED1LED2PB9PB10VDD3344B0X什么是設(shè)備驅(qū)動(dòng)程什么是設(shè)備驅(qū)動(dòng)程9void Led_Display(int LedStatus)led_state = LedStatus;if(LedStatus&0 x01)=0 x01)rPDATB=rPDATB&0 x5ff;elserPDATB=rPDATB|0 x200;if(LedStatus&0 x02)=0 x02)rPDATB=rPDATB&0 x3ff;elserPDATB=rPDATB|0 x400;LED1LED2PB9PB10VDD3344B
8、0X什么是設(shè)備驅(qū)動(dòng)程什么是設(shè)備驅(qū)動(dòng)程10void led1_on()led_state = led_state | 0 x1;Led_Display(led_state);void led2_on()led_state = led_state | 0 x2;Led_Display(led_state);什么是設(shè)備驅(qū)動(dòng)程什么是設(shè)備驅(qū)動(dòng)程11void led1_off()led_state = led_state & 0 xfe;Led_Display(led_state);void led2_off()led_state = led_state & 0 xfd;Led_Display(led_s
9、tate);什么是設(shè)備驅(qū)動(dòng)程什么是設(shè)備驅(qū)動(dòng)程12void Main(void) sys_init(); for( ; ; )/while(1) Led_Test();void Led_Test()leds_off();Delay(1000);led1_on();Delay(1000);led1_off();led2_on();Delay(1000);leds_on();Delay(1000);led2_off();Delay(1000);led1_off();什么是設(shè)備驅(qū)動(dòng)程什么是設(shè)備驅(qū)動(dòng)程13應(yīng)用程序應(yīng)用程序底層驅(qū)動(dòng)程序底層驅(qū)動(dòng)程序LEDdrive硬件硬件LEDLCD8LEDLCDdrive
10、8LEDdrive前前/后臺(tái)結(jié)構(gòu)后臺(tái)結(jié)構(gòu)單任務(wù)結(jié)構(gòu)單任務(wù)結(jié)構(gòu)大循環(huán)結(jié)構(gòu)大循環(huán)結(jié)構(gòu)void Main(void) sys_init(); for( ; ; )/while(1) Led_Test();無(wú)核結(jié)構(gòu)無(wú)核結(jié)構(gòu)無(wú)操作系統(tǒng)時(shí),應(yīng)用程序直接調(diào)無(wú)操作系統(tǒng)時(shí),應(yīng)用程序直接調(diào)用底層驅(qū)動(dòng)程序!用底層驅(qū)動(dòng)程序!什么是設(shè)備驅(qū)動(dòng)程什么是設(shè)備驅(qū)動(dòng)程14底層驅(qū)動(dòng)程序底層驅(qū)動(dòng)程序LEDdrive硬件硬件LEDLCD8LEDLCDdrive8LEDdrive應(yīng)用程序應(yīng)用程序Key應(yīng)用編程接口應(yīng)用編程接口(API)操作系統(tǒng)內(nèi)核操作系統(tǒng)內(nèi)核設(shè)備驅(qū)動(dòng)設(shè)備驅(qū)動(dòng)(接口接口)open() read()write() ioctl
11、() close()有操作系統(tǒng)時(shí),有操作系統(tǒng)時(shí),應(yīng)用程序通過(guò)操應(yīng)用程序通過(guò)操系統(tǒng)的系統(tǒng)的API調(diào)用底調(diào)用底層驅(qū)動(dòng)程序!層驅(qū)動(dòng)程序!Linux驅(qū)動(dòng)程序的驅(qū)動(dòng)程序的任務(wù)就是實(shí)現(xiàn)設(shè)任務(wù)就是實(shí)現(xiàn)設(shè)備的備的API及底層驅(qū)及底層驅(qū)動(dòng)動(dòng)2.LED驅(qū)動(dòng)驅(qū)動(dòng)什么是設(shè)備驅(qū)動(dòng)程什么是設(shè)備驅(qū)動(dòng)程(有核)(有核)15int main(int argc, char *argv) fd = open(“/dev/leds”, 0); / 打開(kāi)設(shè)備打開(kāi)設(shè)備 . if (!strcmp(argv2, on) ioctl(fd, IOCTL_LED_ON, led_no); else if (!strcmp(argv2, off
12、) ioctl(fd, IOCTL_LED_OFF, led_no); else goto err; close(fd); return 0; 什么是設(shè)備驅(qū)動(dòng)程什么是設(shè)備驅(qū)動(dòng)程底層驅(qū)動(dòng)程序底層驅(qū)動(dòng)程序LEDdrive硬件硬件LED8LED8LEDdriveopen() read() write() ioctl()應(yīng)用程序應(yīng)用程序操作系統(tǒng)內(nèi)核操作系統(tǒng)內(nèi)核LCDLCDdrive硬件硬件16static struct file_operations s3c24xx_leds_fops = .owner = THIS_MODULE, .open = s3c24xx_leds_open, .ioctl
13、= s3c24xx_leds_ioctl, .;什么是設(shè)備驅(qū)動(dòng)程什么是設(shè)備驅(qū)動(dòng)程17static int s3c24xx_leds_open(struct inode *inode, struct file *file) int i; / 設(shè)置設(shè)置GPIO引腳的功能,本驅(qū)動(dòng)中引腳的功能,本驅(qū)動(dòng)中LED所涉及的所涉及的 GPIO引腳引腳 設(shè)為輸出功能設(shè)為輸出功能 for (i = 0; i 2; i+) s3c2410_gpio_cfgpin(led_tablei, led_cfg_tablei); return 0; 應(yīng)用程序?qū)υO(shè)備文件應(yīng)用程序?qū)υO(shè)備文件/dev/leds執(zhí)行執(zhí)行open(.)
14、時(shí),時(shí),就會(huì)調(diào)用就會(huì)調(diào)用s3c24xx_leds_open函數(shù)函數(shù)rPCONB=rPCONB&B1010; B10=0rPCONB=rPCONB&B9 4) return -EINVAL; switch(cmd) case IOCTL_LED_ON: / 設(shè)置指定引腳的輸出電平為設(shè)置指定引腳的輸出電平為0 s3c2410_gpio_setpin(led_tablearg, 0); return 0; case IOCTL_LED_OFF: / 設(shè)置指定引腳的輸出電平為設(shè)置指定引腳的輸出電平為1 s3c2410_gpio_setpin(led_tablearg, 1); return 0; de
15、fault: return -EINVAL; 應(yīng)用程序?qū)υO(shè)備文件應(yīng)用程序?qū)υO(shè)備文件/dev/leds執(zhí)行執(zhí)行ioclt(.)時(shí),時(shí), 就會(huì)調(diào)用此函數(shù)就會(huì)調(diào)用此函數(shù) leds_onleds_on() or led1_on()or led2_on()() or led1_on()or led2_on()leds_offleds_off() or led1_off() or led2_off()() or led1_off() or led2_off()什么是設(shè)備驅(qū)動(dòng)程什么是設(shè)備驅(qū)動(dòng)程19/* 注冊(cè)函數(shù)注冊(cè)函數(shù) */*執(zhí)行執(zhí)行“insmod s3c24xx_leds.ko”命令時(shí)就會(huì)調(diào)用這個(gè)函數(shù)命令
16、時(shí)就會(huì)調(diào)用這個(gè)函數(shù) */static int _init s3c24xx_leds_init(void) int ret; ret = register_chrdev(LED_MAJOR, DEVICE_NAME, &s3c24xx_leds_fops); if (ret 0) printk(DEVICE_NAME cant register major numbern); return ret; printk(DEVICE_NAME initializedn); return 0;什么是設(shè)備驅(qū)動(dòng)程什么是設(shè)備驅(qū)動(dòng)程20/* 執(zhí)行執(zhí)行”rmmod s3c24xx_leds.ko”命令時(shí)就會(huì)調(diào)用這
17、個(gè)函命令時(shí)就會(huì)調(diào)用這個(gè)函數(shù)數(shù) */static void _exit s3c24xx_leds_exit(void) unregister_chrdev(LED_MAJOR, DEVICE_NAME);/* 卸載函數(shù)卸載函數(shù) */什么是設(shè)備驅(qū)動(dòng)程什么是設(shè)備驅(qū)動(dòng)程21/* 這兩行指定驅(qū)動(dòng)程序的初始化函數(shù)和卸載函數(shù)這兩行指定驅(qū)動(dòng)程序的初始化函數(shù)和卸載函數(shù) */module_init(s3c24xx_leds_init);module_exit(s3c24xx_leds_exit);/* 描述驅(qū)動(dòng)程序的一些信息,不是必須的描述驅(qū)動(dòng)程序的一些信息,不是必須的 */MODULE_AUTHOR(“http
18、:/”); MODULE_DESCRIPTION(“S3C2410/S3C2440 LED Driver”); MODULE_LICENSE(GPL); / 遵循的協(xié)議遵循的協(xié)議什么是設(shè)備驅(qū)動(dòng)程什么是設(shè)備驅(qū)動(dòng)程22設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)中直接控制硬件設(shè)備設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)中直接控制硬件設(shè)備的程序,是內(nèi)核的一部分,約占的程序,是內(nèi)核的一部分,約占Linux內(nèi)核源內(nèi)核源程序的程序的60%80% Linux內(nèi)核采用可加載的模塊化設(shè)計(jì)(內(nèi)核采用可加載的模塊化設(shè)計(jì)(LKMs,Loadable Kernel Modules)。將最基本的)。將最基本的核心代碼編譯在內(nèi)核中,其他的代碼則往往編核心代碼編譯
19、在內(nèi)核中,其他的代碼則往往編譯為內(nèi)核模塊,在需要時(shí)才動(dòng)態(tài)加載到內(nèi)核中譯為內(nèi)核模塊,在需要時(shí)才動(dòng)態(tài)加載到內(nèi)核中通常通常CPU、PCI、TCP/IP、APM、VFS等的驅(qū)動(dòng)直接等的驅(qū)動(dòng)直接編譯在內(nèi)核文件中,其它驅(qū)動(dòng)(聲卡、網(wǎng)卡等)則作編譯在內(nèi)核文件中,其它驅(qū)動(dòng)(聲卡、網(wǎng)卡等)則作為模塊動(dòng)態(tài)加載。為模塊動(dòng)態(tài)加載。什么是設(shè)備驅(qū)動(dòng)程什么是設(shè)備驅(qū)動(dòng)程23設(shè)備驅(qū)動(dòng)程的作用在于提供機(jī)制,而不是策略設(shè)備驅(qū)動(dòng)程的作用在于提供機(jī)制,而不是策略機(jī)制機(jī)制- 功能功能策略策略-如何使用功能如何使用功能驅(qū)動(dòng)程序應(yīng)該處理如何使硬件可用的問(wèn)題,而驅(qū)動(dòng)程序應(yīng)該處理如何使硬件可用的問(wèn)題,而將怎樣使用硬件的問(wèn)題留給上層應(yīng)用程序?qū)⒃鯓?/p>
20、使用硬件的問(wèn)題留給上層應(yīng)用程序什么是設(shè)備驅(qū)動(dòng)程什么是設(shè)備驅(qū)動(dòng)程24第第1章章 設(shè)備驅(qū)動(dòng)程序簡(jiǎn)介設(shè)備驅(qū)動(dòng)程序簡(jiǎn)介什么是設(shè)備驅(qū)動(dòng)程序什么是設(shè)備驅(qū)動(dòng)程序內(nèi)核功能劃分內(nèi)核功能劃分可裝載模塊可裝載模塊設(shè)備和模塊的分類設(shè)備和模塊的分類25進(jìn)程管理進(jìn)程管理:CPU是計(jì)算機(jī)系統(tǒng)是計(jì)算機(jī)系統(tǒng)中的最重要的中的最重要的資源,進(jìn)程管資源,進(jìn)程管理也稱理也稱CPU管管理,進(jìn)程管理理,進(jìn)程管理的任務(wù)包括進(jìn)的任務(wù)包括進(jìn)程的創(chuàng)建、銷程的創(chuàng)建、銷毀、阻塞、調(diào)毀、阻塞、調(diào)度及進(jìn)程間的度及進(jìn)程間的通信等通信等內(nèi)存管理內(nèi)存管理:內(nèi)存內(nèi)存也是計(jì)算機(jī)系也是計(jì)算機(jī)系統(tǒng)中的主要資統(tǒng)中的主要資源源, 內(nèi)存管理內(nèi)存管理的任務(wù)主要是的任務(wù)主要是內(nèi)
21、存的分配與內(nèi)存的分配與回收及虛擬內(nèi)回收及虛擬內(nèi)存的實(shí)現(xiàn)存的實(shí)現(xiàn)26文件系統(tǒng)文件系統(tǒng): 文件文件系統(tǒng)是計(jì)算機(jī)系統(tǒng)是計(jì)算機(jī)中的軟件資源中的軟件資源,Linux中將中將設(shè)備也當(dāng)作文設(shè)備也當(dāng)作文件處理,幾乎件處理,幾乎是是“一切皆文一切皆文件件”設(shè)備控制設(shè)備控制: 幾乎幾乎每個(gè)系統(tǒng)操作每個(gè)系統(tǒng)操作最終都會(huì)映射最終都會(huì)映射到物理設(shè)備上到物理設(shè)備上。 內(nèi)核必須為內(nèi)核必須為系統(tǒng)中的每件系統(tǒng)中的每件外設(shè)嵌入相應(yīng)外設(shè)嵌入相應(yīng)的驅(qū)動(dòng)程序,的驅(qū)動(dòng)程序,這包括硬盤(pán)驅(qū)這包括硬盤(pán)驅(qū)動(dòng)器、鍵盤(pán)和動(dòng)器、鍵盤(pán)和磁帶驅(qū)動(dòng)器等磁帶驅(qū)動(dòng)器等27網(wǎng)絡(luò)功能網(wǎng)絡(luò)功能:網(wǎng)絡(luò)網(wǎng)絡(luò)功能也必須由功能也必須由操作系統(tǒng)來(lái)管操作系統(tǒng)來(lái)管理理, 因?yàn)榇蟛?/p>
22、分因?yàn)榇蟛糠志W(wǎng)絡(luò)操作和具網(wǎng)絡(luò)操作和具體進(jìn)程無(wú)關(guān)體進(jìn)程無(wú)關(guān): 進(jìn)進(jìn)入系統(tǒng)的報(bào)文入系統(tǒng)的報(bào)文是異步事件是異步事件. 報(bào)報(bào)文在某一個(gè)進(jìn)文在某一個(gè)進(jìn)程接手之前必程接手之前必須被收集須被收集, 識(shí)別識(shí)別, 分發(fā)分發(fā). 系統(tǒng)負(fù)系統(tǒng)負(fù)責(zé)在程序和網(wǎng)責(zé)在程序和網(wǎng)絡(luò)接口之間遞絡(luò)接口之間遞送數(shù)據(jù)報(bào)文送數(shù)據(jù)報(bào)文, 它它必須根據(jù)程序必須根據(jù)程序的網(wǎng)絡(luò)活動(dòng)來(lái)的網(wǎng)絡(luò)活動(dòng)來(lái)控制程序的執(zhí)控制程序的執(zhí)行行. 另外另外, 所有所有的路由和地址的路由和地址解析問(wèn)題都在解析問(wèn)題都在內(nèi)核中實(shí)現(xiàn)內(nèi)核中實(shí)現(xiàn)28第第1章章 設(shè)備驅(qū)動(dòng)程序簡(jiǎn)介設(shè)備驅(qū)動(dòng)程序簡(jiǎn)介什么是設(shè)備驅(qū)動(dòng)程序什么是設(shè)備驅(qū)動(dòng)程序內(nèi)核功能劃分內(nèi)核功能劃分可裝載模塊可裝載模塊設(shè)備和模
23、塊的分類設(shè)備和模塊的分類29可裝載模塊可裝載模塊可裝載模塊是可裝載模塊是Linux 最吸引人的一個(gè)特性,用最吸引人的一個(gè)特性,用戶可將一時(shí)不用或很少使用的功能(包括設(shè)備戶可將一時(shí)不用或很少使用的功能(包括設(shè)備驅(qū)動(dòng)程序)編譯為模塊,需要時(shí)再裝載,不用驅(qū)動(dòng)程序)編譯為模塊,需要時(shí)再裝載,不用時(shí)卸載,這樣可以有效地減小內(nèi)核。時(shí)卸載,這樣可以有效地減小內(nèi)核。當(dāng)操作系統(tǒng)內(nèi)核需要的擴(kuò)展功能不存在時(shí),內(nèi)當(dāng)操作系統(tǒng)內(nèi)核需要的擴(kuò)展功能不存在時(shí),內(nèi)核模塊管理守護(hù)進(jìn)程核模塊管理守護(hù)進(jìn)程kmod自動(dòng)執(zhí)行自動(dòng)執(zhí)行modprobe命令加載所需的內(nèi)核模塊命令加載所需的內(nèi)核模塊 用戶也可在命令行執(zhí)行用戶也可在命令行執(zhí)行mod
24、probe/insmod 命命令將模塊連接到運(yùn)行中的內(nèi)核中(裝載),執(zhí)令將模塊連接到運(yùn)行中的內(nèi)核中(裝載),執(zhí)行行 rmmod 程序移除連接(卸載)程序移除連接(卸載)30第第1章章 設(shè)備驅(qū)動(dòng)程序簡(jiǎn)介設(shè)備驅(qū)動(dòng)程序簡(jiǎn)介什么是設(shè)備驅(qū)動(dòng)程序什么是設(shè)備驅(qū)動(dòng)程序內(nèi)核功能劃分內(nèi)核功能劃分可裝載模塊可裝載模塊設(shè)備和模塊的分類設(shè)備和模塊的分類31設(shè)備和模塊的分類設(shè)備和模塊的分類 Linux 設(shè)備可分為設(shè)備可分為 3 種基本類型:字符設(shè)備、塊設(shè)種基本類型:字符設(shè)備、塊設(shè)備與網(wǎng)絡(luò)接口,相應(yīng)地,設(shè)備驅(qū)動(dòng)模塊也有備與網(wǎng)絡(luò)接口,相應(yīng)地,設(shè)備驅(qū)動(dòng)模塊也有3種類型種類型字符設(shè)備字符設(shè)備 字符字符( char ) 設(shè)備是一種
25、可以當(dāng)作字節(jié)流來(lái)存取的設(shè)備設(shè)備是一種可以當(dāng)作字節(jié)流來(lái)存取的設(shè)備( 如同一個(gè)文件如同一個(gè)文件 ); 字符驅(qū)動(dòng)負(fù)責(zé)實(shí)現(xiàn)這種行為。字符驅(qū)動(dòng)負(fù)責(zé)實(shí)現(xiàn)這種行為。 這樣的驅(qū)這樣的驅(qū)動(dòng)常常至少實(shí)現(xiàn)動(dòng)常常至少實(shí)現(xiàn) open, close,read, 和和 write 系統(tǒng)調(diào)用系統(tǒng)調(diào)用 字符終端字符終端( /dev/console )和串口和串口( /dev/ttyS0 等等 )是字符是字符設(shè)備的例子設(shè)備的例子, 因?yàn)樗鼈兒芎玫卣宫F(xiàn)了流的抽象因?yàn)樗鼈兒芎玫卣宫F(xiàn)了流的抽象 字符設(shè)備通過(guò)文件系統(tǒng)結(jié)點(diǎn)來(lái)存取字符設(shè)備通過(guò)文件系統(tǒng)結(jié)點(diǎn)來(lái)存取, 例如例如 /dev/tty1 和和 /dev/lp0 字符設(shè)備文件和普通文件之
26、間的唯一不同在于對(duì)普通文字符設(shè)備文件和普通文件之間的唯一不同在于對(duì)普通文件的訪問(wèn)可以前后移動(dòng)位置,件的訪問(wèn)可以前后移動(dòng)位置, 但是大部分字符設(shè)備只能但是大部分字符設(shè)備只能順序存取順序存取32設(shè)備和模塊的分類設(shè)備和模塊的分類塊設(shè)備塊設(shè)備與字符設(shè)備類似與字符設(shè)備類似, 塊設(shè)備也通過(guò)位于塊設(shè)備也通過(guò)位于 /dev 目錄目錄下的文件系統(tǒng)結(jié)點(diǎn)來(lái)存取。但塊設(shè)備下的文件系統(tǒng)結(jié)點(diǎn)來(lái)存取。但塊設(shè)備(例如一個(gè)例如一個(gè)磁盤(pán)磁盤(pán))上能夠容納文件系統(tǒng)。上能夠容納文件系統(tǒng)。 在在Unix 系統(tǒng)系統(tǒng), 進(jìn)行進(jìn)行I/O 操作時(shí)塊設(shè)備每次只能傳操作時(shí)塊設(shè)備每次只能傳送一個(gè)或多個(gè)完整的塊,每塊包含送一個(gè)或多個(gè)完整的塊,每塊包含
27、512 字節(jié)字節(jié)( 或或一個(gè)更大的一個(gè)更大的 2 的冪的數(shù)據(jù)的冪的數(shù)據(jù) )的整塊。的整塊。 Linux可以可以讓?xiě)?yīng)用程序象讀寫(xiě)字符設(shè)備一樣地讀寫(xiě)塊設(shè)備讓?xiě)?yīng)用程序象讀寫(xiě)字符設(shè)備一樣地讀寫(xiě)塊設(shè)備,一次可傳送任意數(shù)目的字節(jié)。,一次可傳送任意數(shù)目的字節(jié)。 因而塊和字符因而塊和字符設(shè)備的區(qū)別僅僅在于內(nèi)核內(nèi)部管理數(shù)據(jù)的方式設(shè)備的區(qū)別僅僅在于內(nèi)核內(nèi)部管理數(shù)據(jù)的方式, 也就是在于內(nèi)核與驅(qū)動(dòng)程序之間的軟件接口上也就是在于內(nèi)核與驅(qū)動(dòng)程序之間的軟件接口上,即塊驅(qū)動(dòng)和字符驅(qū)動(dòng)的不同在內(nèi)核接口上,即塊驅(qū)動(dòng)和字符驅(qū)動(dòng)的不同在內(nèi)核接口上.33設(shè)備和模塊的分類設(shè)備和模塊的分類網(wǎng)絡(luò)接口網(wǎng)絡(luò)接口 任何網(wǎng)絡(luò)事務(wù)都通過(guò)一個(gè)網(wǎng)絡(luò)接口來(lái)
28、進(jìn)行。任何網(wǎng)絡(luò)事務(wù)都通過(guò)一個(gè)網(wǎng)絡(luò)接口來(lái)進(jìn)行。 網(wǎng)網(wǎng)絡(luò)接口是絡(luò)接口是 一個(gè)能夠與其他主機(jī)交換數(shù)據(jù)的設(shè)備一個(gè)能夠與其他主機(jī)交換數(shù)據(jù)的設(shè)備。通常。通常, 網(wǎng)絡(luò)接口是個(gè)硬件設(shè)備網(wǎng)絡(luò)接口是個(gè)硬件設(shè)備, 但是也可能是但是也可能是個(gè)純軟件設(shè)備,比如環(huán)回(個(gè)純軟件設(shè)備,比如環(huán)回(loopback)接口。接口。網(wǎng)絡(luò)接口負(fù)責(zé)發(fā)送和接收數(shù)據(jù)報(bào)文網(wǎng)絡(luò)接口負(fù)責(zé)發(fā)送和接收數(shù)據(jù)報(bào)文, 在內(nèi)核網(wǎng)絡(luò)在內(nèi)核網(wǎng)絡(luò)子系統(tǒng)的驅(qū)動(dòng)下子系統(tǒng)的驅(qū)動(dòng)下, 不必知道單個(gè)事務(wù)是如何映射不必知道單個(gè)事務(wù)是如何映射到實(shí)際的被發(fā)送的報(bào)文上的。到實(shí)際的被發(fā)送的報(bào)文上的。 很多網(wǎng)絡(luò)連接很多網(wǎng)絡(luò)連接( 特特別那些使用別那些使用 TCP 的的)是面向流的是面向
29、流的, 但是網(wǎng)絡(luò)設(shè)備但是網(wǎng)絡(luò)設(shè)備卻常常設(shè)計(jì)成處理報(bào)文的發(fā)送和接收。一個(gè)網(wǎng)卻常常設(shè)計(jì)成處理報(bào)文的發(fā)送和接收。一個(gè)網(wǎng)絡(luò)驅(qū)動(dòng)對(duì)單個(gè)連接一無(wú)所知,它只處理報(bào)文絡(luò)驅(qū)動(dòng)對(duì)單個(gè)連接一無(wú)所知,它只處理報(bào)文. 34設(shè)備和模塊的分類設(shè)備和模塊的分類既然不是一個(gè)面向流的設(shè)備既然不是一個(gè)面向流的設(shè)備, 一個(gè)網(wǎng)絡(luò)接口就不一個(gè)網(wǎng)絡(luò)接口就不能象能象 /dev/tty1 那樣容易映射到文件系統(tǒng)的一個(gè)那樣容易映射到文件系統(tǒng)的一個(gè)結(jié)點(diǎn)上。結(jié)點(diǎn)上。 Unix 提供的對(duì)接口的存取的方式仍然提供的對(duì)接口的存取的方式仍然是通過(guò)分配一個(gè)名字給它們是通過(guò)分配一個(gè)名字給它們( 例如例如 eth0 ), 但是但是這這個(gè)名字在文件系統(tǒng)中沒(méi)有對(duì)應(yīng)的
30、入口個(gè)名字在文件系統(tǒng)中沒(méi)有對(duì)應(yīng)的入口. 內(nèi)核與網(wǎng)內(nèi)核與網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)間的通訊與字符和塊設(shè)備驅(qū)動(dòng)所用的絡(luò)設(shè)備驅(qū)動(dòng)間的通訊與字符和塊設(shè)備驅(qū)動(dòng)所用的完全不同。完全不同。 內(nèi)核調(diào)用一套和報(bào)文傳遞相關(guān)的函內(nèi)核調(diào)用一套和報(bào)文傳遞相關(guān)的函數(shù)而不是數(shù)而不是 read 和和 write.35安全問(wèn)題安全問(wèn)題驅(qū)動(dòng)程序?qū)儆趦?nèi)核,如果內(nèi)核有安全漏洞,整驅(qū)動(dòng)程序?qū)儆趦?nèi)核,如果內(nèi)核有安全漏洞,整個(gè)系統(tǒng)就會(huì)有安全漏洞,故只有授權(quán)用戶才能個(gè)系統(tǒng)就會(huì)有安全漏洞,故只有授權(quán)用戶才能裝載模塊裝載模塊驅(qū)動(dòng)程序中容易產(chǎn)生安全隱患的地方驅(qū)動(dòng)程序中容易產(chǎn)生安全隱患的地方緩沖區(qū)溢出緩沖區(qū)溢出使用未初始化的內(nèi)存使用未初始化的內(nèi)存中斷中斷使用第三方軟件使用第三方軟件競(jìng)態(tài)競(jìng)態(tài)36許可證條款許可證條款Linux 遵守遵守 GNU 通用公共許可證(通用公共許可證( General Public License, GPL )版本版本 2 。GPL由自自由軟件基金會(huì)的由自自由軟件基金會(huì)的 GNU 項(xiàng)目設(shè)計(jì),它允許項(xiàng)目設(shè)計(jì),它允許任何人重新發(fā)布任何人重新發(fā)布, 甚至是銷售由甚至
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 老板培訓(xùn)大綱
- 辦公樓安全考試題及答案
- 公司員工網(wǎng)絡(luò)信息安全培訓(xùn)
- 中專升學(xué)試題及答案
- java算法與數(shù)據(jù)結(jié)構(gòu)面試題及答案
- 婚姻經(jīng)濟(jì)學(xué)考試題及答案
- 曠視科技java校招面試題及答案
- 注會(huì)會(huì)計(jì)試題及答案
- 會(huì)議實(shí)務(wù)考試題及答案
- 模擬談判試題及答案
- 2025克拉瑪依市輔警考試試卷真題
- 2024北京朝陽(yáng)區(qū)四年級(jí)(下)期末數(shù)學(xué)試題及答案
- 鉆井基礎(chǔ)知識(shí)
- 職工之家建設(shè)方案
- 【初中信息】農(nóng)業(yè)生產(chǎn)新模式課件+2024-2025學(xué)年人教版(2024)初中信息科技八年級(jí)全一冊(cè)
- 鄉(xiāng)村振興項(xiàng)目投資估算與資金籌措
- 高速公路機(jī)電工程施組-主要施工方案
- 第四代住宅白皮書(shū)-HZS
- 監(jiān)理質(zhì)量安全工作匯報(bào)
- 高處作業(yè)安全帶正確使用
- 初中語(yǔ)文學(xué)習(xí)規(guī)劃及方法
評(píng)論
0/150
提交評(píng)論