最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

淺淺講解字符設(shè)備編號的注冊分配!

2022-08-19 15:12 作者:補給站Linux內(nèi)核  | 我要投稿

內(nèi)核中所有已分配的字符設(shè)備編號都記錄在一個名為 chrdevs 散列表里。該散列表中的每一個元素是一個 char_device_struct 結(jié)構(gòu),它的定義如下:

注 意,內(nèi)核并不是為每一個字符設(shè)備編號定義一個 char_device_struct 結(jié)構(gòu),而是為一組對應(yīng)同一個字符設(shè)備驅(qū)動的設(shè)備編號范圍定義一個 char_device_struct 結(jié)構(gòu)。chrdevs 散列表的大小是 255,散列算法是把每組字符設(shè)備編號范圍的主設(shè)備號以 255 取模插入相應(yīng)的散列桶中。同一個散列桶中的字符設(shè)備編號范圍是按起始次設(shè)備號遞增排序的。

注冊內(nèi)核提供了三個函數(shù) 來注冊一組字符設(shè)備編號,這三個函數(shù)分別是 register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()。這三個函數(shù)都會調(diào)用一個共用的 __register_chrdev_region() 函數(shù)來注冊一組設(shè)備編號范圍(即一個 char_device_struct 結(jié)構(gòu))。所以下面先來看一下 __register_chrdev_region() 函數(shù)的實現(xiàn)代碼。


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)??


函數(shù) __register_chrdev_region() 主要執(zhí)行以下步驟:

  1. 分配一個新的 char_device_struct 結(jié)構(gòu),并用 0 填充。

  2. 如果申請的設(shè)備編號范圍的主設(shè)備號為 0,那么表示設(shè)備驅(qū)動程序請求動態(tài)分配一個主設(shè)備號。動態(tài)分配主設(shè)備號的原則是從散列表的最后一個桶向前尋找,那個桶是空的,主設(shè)備號就是相應(yīng)散列桶的序 號。所以動態(tài)分配的主設(shè)備號總是小于 256,如果每個桶都有字符設(shè)備編號了,那動態(tài)分配就會失敗。

  3. 根據(jù)參數(shù)設(shè)置 char_device_struct 結(jié)構(gòu)中的初始設(shè)備號,范圍大小及設(shè)備驅(qū)動名稱。

  4. 計算出主設(shè)備號所對應(yīng)的散列桶,為新的 char_device_struct 結(jié)構(gòu)尋找正確的位置。同時,如果設(shè)備編號范圍有重復(fù)的話,則出錯返回。

  5. 將新的 char_device_struct 結(jié)構(gòu)插入散列表中,并返回 char_device_struct 結(jié)構(gòu)的地址。

分析完 __register_chrdev_region() 后,我們來一個個看那三個注冊函數(shù)。首先是 register_chrdev_region()。

register_chrdev_region() 函數(shù)用于分配指定的設(shè)備編號范圍。如果申請的設(shè)備編號范圍跨越了主設(shè)備號,它會把分配范圍內(nèi)的編號按主設(shè)備號分割成較小的子范圍,并在每個子范圍上調(diào)用 __register_chrdev_region() 。如果其中有一次分配失敗的話,那會把之前成功分配的都全部退回。

alloc_chrdev_region() 函數(shù)用于動態(tài)申請設(shè)備編號范圍,這個函數(shù)好像并沒有檢查范圍過大的情況,不過動態(tài)分配總是找個空的散列桶,所以問題也不大。通過指針參數(shù)返回實際獲得的起始設(shè)備編號。

最 后一個 register_chrdev() 是一個老式分配設(shè)備編號范圍的函數(shù)。它分配一個單獨主設(shè)備號和 0 ~ 255 的次設(shè)備號范圍。如果申請的主設(shè)備號為 0 則動態(tài)分配一個。該函數(shù)還需傳入一個 file_operations 結(jié)構(gòu)的指針,函數(shù)內(nèi)部自動分配了一個新的 cdev 結(jié)構(gòu)。關(guān)于這些,在后續(xù)講字符設(shè)備驅(qū)動的注冊時會說明。

注銷和 注冊分配字符設(shè)備編號范圍類似,內(nèi)核提供了兩個注銷字符設(shè)備編號范圍的函數(shù),分別是 unregister_chrdev_region() 和 unregister_chrdev() 。它們都調(diào)用了 __unregister_chrdev_region() 函數(shù)。由于比較簡單,就不加說明了,只把代碼貼出來。

注意, unregister_chrdev() 會把 register_chrdev() 中自動分配的 cdev 給注銷掉。


淺淺講解字符設(shè)備編號的注冊分配!的評論 (共 條)

分享到微博請遵守國家法律
双鸭山市| 瑞安市| 青岛市| 江都市| 虞城县| 尼木县| 万荣县| 仁化县| 金川县| 旬邑县| 蓬溪县| 涞源县| 湘乡市| 荥经县| 宁陕县| 西丰县| 曲水县| 文昌市| 高平市| 荃湾区| 大新县| 宜川县| 宁阳县| 新疆| 阿城市| 大丰市| 梁平县| 水城县| 金山区| 汕头市| 资源县| 长海县| 西平县| 和林格尔县| 高雄市| 兴城市| 敖汉旗| 丘北县| 霍山县| 和龙市| 苍山县|