以內(nèi)核模塊加載的linux驅(qū)動(dòng)程序編寫
出處:互聯(lián)網(wǎng) 發(fā)布于:2011-09-04 13:04:43
linux中的大部分驅(qū)動(dòng)程序,是以模塊的形式編寫的。這些驅(qū)動(dòng)程序源碼可以修改到內(nèi)核中,也可以把他們編譯成模塊形勢(shì),在需要的時(shí)候動(dòng)態(tài)加載。Linux內(nèi)核是一個(gè)整體是結(jié)構(gòu),因此向內(nèi)核添加任何東西,或者刪除某些功能,都十分困難。為了解決這個(gè)問題引入了內(nèi)核機(jī)制。
然而模塊一旦被插入內(nèi)核,他就和內(nèi)核其他部分一樣。這樣一來就會(huì)曾家一部分系統(tǒng)開銷。同時(shí),如果模塊出現(xiàn)問題,也許會(huì)帶來系統(tǒng)的崩潰。從而可以動(dòng)態(tài)的想內(nèi)核中添加或者刪除模塊。模塊不被編譯在內(nèi)核中,因而控制了內(nèi)核的大小。
一個(gè)典型的驅(qū)動(dòng)程序,大體上可以分為這么幾個(gè)部分:
1、注冊(cè)設(shè)備
在系統(tǒng)初啟,或者模塊加載時(shí)候,必須將設(shè)備登記到相應(yīng)的設(shè)備數(shù)組,并返回設(shè)備的主驅(qū)動(dòng)號(hào),例如:對(duì)快設(shè)備來說調(diào)用refister_blkdec()將設(shè)備添加到數(shù)組blkdev中。并且獲得該設(shè)備號(hào)。并利用這些設(shè)備號(hào)對(duì)此數(shù)組進(jìn)行索引。對(duì)于字符驅(qū)動(dòng)設(shè)備來說,要使用module_register_chrdev()來獲得祝設(shè)備的驅(qū)動(dòng)號(hào)。然后對(duì)這個(gè)設(shè)備的所有調(diào)用都用這個(gè)設(shè)備號(hào)來實(shí)現(xiàn)。
2、定義功能函數(shù)
對(duì)于每一個(gè)驅(qū)動(dòng)函數(shù)來說。都有一些和此設(shè)備密切相關(guān)的功能函數(shù)。那常用的塊設(shè)備或者字符設(shè)備來說。都存在著諸如 open() read() write() ioctrol()這一類的操作。當(dāng)系統(tǒng)社用這些調(diào)用時(shí)。將自動(dòng)的使用驅(qū)動(dòng)函數(shù)中特定的模塊。來實(shí)現(xiàn)具體的操作。而對(duì)于特定的設(shè)備。上面的系統(tǒng)調(diào)用對(duì)應(yīng)的函數(shù)是一定的。
如:在塊驅(qū)動(dòng)設(shè)備中。當(dāng)系統(tǒng)試圖讀取這個(gè)設(shè)備(即調(diào)用read()時(shí)),就會(huì)運(yùn)行驅(qū)動(dòng)程序中的block_read() 這個(gè)函數(shù)。 打開新設(shè)備時(shí)會(huì)調(diào)用這個(gè)設(shè)備驅(qū)動(dòng)程序的device_open() 這個(gè)函數(shù)。
3、卸載模塊
在不用這個(gè)設(shè)備時(shí),可以將他卸載。主要是從/proc 中取消這個(gè)設(shè)備的特殊文件??捎锰囟ǖ暮瘮?shù)實(shí)現(xiàn)。
下面我們列舉一個(gè)字符設(shè)備驅(qū)動(dòng)程序的框架。來說明這個(gè)過程。
/* a module of a character device */
/* some include files*/
#include “param.h”
#include “user.h”
#include “tty.h”
#include “dir.h”
#include “fs.h”
/* the include files modules need*/
#include “l(fā)inux/kernel.h”
#include “l(fā)inux/module.h”
define MODBERSIONS
#include“ linux.modversions.h”
#endif
#difine devicename mydevice
/* the init funcion*/
int init_module()
{
int tag=module_register_chrdev(0,mydevice,&Fops);
if (tag<0)
{
printk(“the device init is erro!\n”);
return 1;
}
return 0;
}
/*the funcion which the device will be used */
int device_open ()
{
……
}
int device_read ()
{
……
}
int device_write ()
{
……
}
int device_ioctl ()
{
……
}
……
/* the deltter function of this module*/
int cleanup_module()
{
int re=module_unregister_chrdev(tag,mydevice);
if( re<0)
{
printk(“erro unregister the module !!\n”);
return 1;
}
return 0;
}
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://m.58mhw.cn,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- ARM技術(shù)架構(gòu)與應(yīng)用開發(fā)實(shí)踐指南2026/1/6 10:40:19
- 嵌入式實(shí)時(shí)操作系統(tǒng)(RTOS)選型與移植技術(shù)指南2025/12/31 10:42:31
- 工業(yè)嵌入式系統(tǒng):通信接口技術(shù)選型與抗干擾設(shè)計(jì)實(shí)踐2025/12/15 14:36:53
- 深入解析嵌入式 OPENAMP 框架:開啟異核通信新時(shí)代2025/7/22 16:27:29
- 一文快速了解OPENWRT基礎(chǔ)知識(shí)2025/7/14 16:59:04









