時(shí)間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)
驅(qū)動(dòng)程序編寫基本流程:
1.首先是一些版本信息,沒什么用,但是不能少
#define __NO_VERSION__
#include
#include
char kernel_version[] = UTS_RELEASE;
2.為了把系統(tǒng)調(diào)用和驅(qū)動(dòng)程序關(guān)聯(lián)起來,需要一個(gè)非常關(guān)鍵的數(shù)據(jù)結(jié)構(gòu):struct file_operations。file_operations結(jié)構(gòu)的每一個(gè)成員的名字都對(duì)應(yīng)著一個(gè)系統(tǒng)調(diào)用。用戶進(jìn)程利用系統(tǒng)調(diào)用在對(duì)設(shè)備文件進(jìn)行諸如read/write操作時(shí),系統(tǒng)調(diào)用通過設(shè)備文件的主設(shè)備號(hào)找到相應(yīng)的設(shè)備驅(qū)動(dòng)程序,然后讀取這個(gè)數(shù)據(jù)結(jié)構(gòu)相應(yīng)的函數(shù)指針,接著把控制權(quán)交給該函數(shù)。這是linux的設(shè)備驅(qū)動(dòng)程序工作的基本原理。編寫設(shè)備驅(qū)動(dòng)程序的主要工作就是編寫子函數(shù),并填充file_operations的各個(gè)域
3.簡(jiǎn)單驅(qū)動(dòng)程序的編寫(test.c):
a.包含一些基本的頭文件。
b.編寫一些功能函數(shù),比如read(),write()等。這些函數(shù)被調(diào)用時(shí)系統(tǒng)進(jìn)入和心態(tài)。
c.定義struct file_operations結(jié)構(gòu)的對(duì)象,填充結(jié)構(gòu)體。結(jié)構(gòu)體中功能的順序不能改變,若一些功能沒有實(shí)現(xiàn)就用NULL填充,已經(jīng)實(shí)現(xiàn)的功能如read()、write()分別添加到對(duì)應(yīng)的位置。這步實(shí)現(xiàn)的是函數(shù)的注冊(cè)。到這里驅(qū)動(dòng)程序的主體可以說是寫好了。現(xiàn)在需要把驅(qū)動(dòng)程序嵌入內(nèi)核。
d.注冊(cè)設(shè)備驅(qū)動(dòng)程序,使用register_chrdev注冊(cè)字符型設(shè)備。函數(shù)原型為:
int register_chrdev(0, "test_name", &test_file_operations)
函數(shù)返回主設(shè)備號(hào),若注冊(cè)成功返回值大于0。
第一個(gè)參數(shù):主設(shè)備號(hào)。第二個(gè)參數(shù):注冊(cè)的設(shè)備名。第三個(gè)參數(shù):結(jié)構(gòu)體名(設(shè)備相關(guān)操作方式,驅(qū)動(dòng)程序?qū)嶋H執(zhí)行操作的函數(shù)的指針)。
這個(gè)函數(shù)由int init_module(void)函數(shù)調(diào)用,這個(gè)函數(shù)在系統(tǒng)啟動(dòng)時(shí)注冊(cè)到內(nèi)核時(shí)調(diào)用。
e.在用rmmod卸載模塊時(shí),cleanup_module函數(shù)被調(diào)用,它釋放字符設(shè)備test在系統(tǒng)字符設(shè)備表中占有的表項(xiàng)。
void cleanup_module(void)
{
unregister_chrdev(test_major, "test");
}
到這里test.c基本就編寫完成了。一個(gè)簡(jiǎn)單的字符設(shè)備可以說寫好了。
4.編譯
$ gcc -O2 -DMODULE -D__KERNEL__ -c test.o test.c
得到文件test.o就是一個(gè)設(shè)備驅(qū)動(dòng)程序。
如果設(shè)備驅(qū)動(dòng)程序有多個(gè)文件,把每個(gè)文件按上面的命令行編譯,然后
ld -r file1.o file2.o -o modulename
驅(qū)動(dòng)程序已經(jīng)編譯好了,現(xiàn)在把它安裝到系統(tǒng)中去。
$ insmod -f test.o
安裝成功在/proc/devices文件中就可以看到設(shè)備test,并可以看到主設(shè)備號(hào)。要卸載運(yùn)行:
$ rmmod test
5.創(chuàng)建設(shè)備節(jié)點(diǎn)
mkmod /dev/test c major minor
c是指字符設(shè)備,major是主設(shè)備號(hào),minor是從設(shè)備號(hào),一般可以設(shè)置為0
以上就是linux驅(qū)動(dòng)編寫的基本過程了,可能有遺漏的地方,這個(gè)我只是按我理解的整理的。具體問題還要在實(shí)踐中再進(jìn)行研究。
關(guān)鍵詞標(biāo)簽:Linux字符設(shè)備驅(qū)動(dòng)程序
相關(guān)閱讀
熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 多種操作系統(tǒng)NTP客戶端配置 Linux操作系統(tǒng)修改IP
人氣排行 Linux下獲取CPUID、硬盤序列號(hào)與MAC地址 dmidecode命令查看內(nèi)存型號(hào) linux tc實(shí)現(xiàn)ip流量限制 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 linux下解壓rar文件 lcx.exe、nc.exe、sc.exe入侵中的使用方法 Ubuntu linux 關(guān)機(jī)、重啟、注銷 命令 查看linux服務(wù)器硬盤IO讀寫負(fù)載