天天看點

linux核心--裝置驅動程式(學習筆記)

字元裝置驅動

linux核心--裝置驅動程式(學習筆記)

一個字元裝置要能夠工作,需要三部配置設定合:

  1. 有一個裝置驅動程式的ko子產品,包含中斷處理函數、裝置操作函數。子產品初始化時,将裝置号注冊到核心的全局資料結構cdev_map中。
  2. /dev目錄下有一個檔案表示該裝置,這個檔案在特殊的devtmpfs檔案系統上,有相應的dentry和inode。inode中有裝置号,通過裝置号可以在cdev_map中找到裝置驅動程式。
  3. 使用者可以打開一個字元裝置檔案,類似打開一個普通檔案。字元裝置檔案的相關操作file_operations會指向裝置驅動中的裝置操作函數。

中斷處理程式

linux核心--裝置驅動程式(學習筆記)

外部裝置發起的中斷,叫做外部中斷。外部中斷,會到達中斷控制器,中斷控制器會發送中斷向量給CPU。

每一個CPU,有一個idt_table,裡面存放了不同的中斷向量的處理函數。硬體終端的處理函數由do_IRQ統一處理,do_IRQ根據中斷向量查找裝置驅動程式中注冊的中斷處理函數。

塊裝置驅動

linux核心--裝置驅動程式(學習筆記)
  1. 所有的塊裝置被一個map結構管理從dev_t到gendisk的映射
  2. /dev/xxx在devtmpfs檔案系統上,存放有塊裝置号和dev_t。
  3. mount一個裝置,就是把僞檔案系統bdev中的block_device資訊,放到具體檔案系統的super_block中
  4. gendisk中存放有block_device_operations,可以進行塊裝置操作

    注意兩個檔案系統:devtmpfs和僞檔案系統bdev。

    通過devtmpfs中的裝置号dev_t在僞檔案系統bdev中找到block_device。

    通過bdev中的block_device,找到主流檔案系統的super_block中,接下來就可以

    通過主流檔案系統(如ext4)的file_operations對塊裝置進行操作了。

    由于主流檔案系統有很多,而且未來可能推出新的,寫作業系統核心時不可能每次都針對新的檔案系統進行更改,是以devtmpfs和僞檔案系統隻是為了擷取和打開block_device,最終對block_device進行讀寫是交給主流檔案系統的。

參考:

https://time.geekbang.org/column/article/101719

繼續閱讀