網頁 貼吧 文章 作者 工作  
網頁搜尋
 
 愛PO吧 >> 玉山投票 >> 瀏覽文章
回覆 加入我的最愛 與好友分享

Device driver module的註冊

本被文章 0 次, 共有回覆 0  
0
 
0
鋼之鍊金術師 兄妹相姦[hr]
首先 、我們先來看看 、在系統上 /dev裏頭裝的 dev node 內容是什麼....

crw--------- 1 root root 4, 1 Apr 11 2002 ttys1

這是一個很典型的 uart port 、屬於字元格式.
依照 Major Number =4 、Minor Number = 1 的規劃 、
Major Numer =4 、屬於tty 的裝置 、至於Minor = 1、則是tty裝置裏頭 、編號為 1的裝置.
也就是說 、系統會依據Major Number 及Minor Number 來當做應用程式存許的索引.

但問題來了 、這號碼是那來的? 是自訂的 ? 還是系統給的?

兩個答案都對 、因為在Linux 2.4.xx版本中 、node 的Major/Minor number 可以讓使用者 、事前先透過Linux source 中的\Documentation/devices 檔案裏 、找尋沒人使用過的編號來使用. 但相對的 、檔案是較早期規劃的 、又或著是同一套系統中 、可能事前已經有其他同類型的Modeule註冊 、就可能會造成註冊時的錯誤.

有鑑於此 、在Linux 2.6版本 、加了一層devfs ,使用者可以透過dev的存取 、讓Major/Minor Number 交由系統指定.

認知律動為了等會系統上講解的方便 、我們統一採用Linux 2.6來論述.

我們先看一段code


int test_module_init(void)
{
dev_t dev;
inrt result=0;
int majornum = 0;
int minornum = 0;

result = alloc_chrdev_region(dev、dev_num、modele_name);

if(result >=0){

printk(KERN_ALERT "module register ok")
majornum = major(dev);
miornum = minor(dev);
}
else
printk(KERN_ALERT "error");
return result;
}



void test_module_exit(void)
{
unregister_chrdev_region(dev、first_devno、devnum);
printk(KERN_ALERT "module register goodbye");

}



module_init(test_module_init);
module_exit(test_module_exit)




透過module_init() and module_exit() 、當系統使用 "insmod" 、"rmmod" 、這兩指令時 、系統會主動將module_init裏的參數 、嵌到核心中. 而module/exit 、則是把module相關訊息 、全部由核心移除.

接下來的關觀鍵是 、因為我們不知道Major 、就無法完程整個module牽入作業. 所以我們透過下列指令來自動取得.

result = alloc_chrdev_region(dev、dev_num、modele_name); --- 自動配置Major)



if(result >=0){

printk(KERN_ALERT "module register ok")
majornum = major(dev); --- 我們知道分配
miornum = minor(dev);
}
else
printk(KERN_ALERT "error");

逛上一篇:   逛下一篇:

作者: dgmscjcwj
  (2011-12-06 12:23)
推薦文章: 將本文章推薦到【百度收藏】 將本文章推薦到【YouPush】 將本文章推薦到【udn共享書籤】 將本文章推薦到【Fiigo】書籤

 本文章共有回覆 0 篇,分 1 頁
 聲明:以上內容不代表本站立場,且內容由網友發表提供,若有爭議或違法由發表者承擔,本站將不負責連帶責任,謝謝。

 IPoBar  愛PK  愛遊戲  愛online
新手教學 客服中心 站務公告 交換連結 合作提案 關於我們
 
版權所有©ipobar Ltd., All Rights Reserved.
論壇內會員言論僅代表個人觀點,不代表本站同意其說法,本討論區不承擔由該言論所引起的法律責任