字符設備與塊設備

閱讀本文之前需要掌握基本的計算機體系結構,可以清楚的將馮諾依曼體系結構闡述清楚,明白系統分層的基本思想等,可閱讀文章《計算機體系結構變遷》瞭解。


1.概述

需要明白輸入輸出設備是非常多的,爲了更好的處理,通常會爲每一個設備設計設備控制器,這樣就屏蔽了各個硬件設備之間的差異,CPU直接通過對寄存器的讀寫來控制硬件(通過特殊彙編指令,如in/out實現),當然會有一些設備可能需要大批量寫入數據到內存,此時會在設備控制器上設置緩衝區(內存映射IO)的方法減少IO次數。而DMA的出現是爲了解決大量IO情況下CPU需要多次參與下發指令的問題,CPU通過對DMA控制器下發寫/讀指令之後,DMA控制器會負責完成相應操作,然後發中斷通知CPU。
由於各個設備控制器之間存在較大的差異,故先向上提供了更爲抽象的設備驅動程序來操作設備控制器,而當使用設備驅動程序的時候只需要使用insmod將對應驅動程序加載如內核就可以了。在這之後我們又期望文件系統可以較爲簡單的使用硬件資源而不用花費較大的功夫去設計和規劃,所以設計了通用設備層,這樣文件系統在調用相關操作時直接調用通用設備層的接口就可以了。然而以上所述仍然對用戶是不夠友好的,因爲文件系統可能也是較多的,所以在上面又封裝了一層VFS。

2.常見的字符設備驅動程序

輸入字符設備——鼠標

//linux-4.13.16\drivers\input\mouse\logibm.c
/*
 * Logitech Bus Mouse Driver for Linux
 */
module_init(logibm_init);
module_exit(logibm_exit);

輸出字符設備——打印機

/*
 * Generic parallel printer driver
linux-4.13.16\drivers\char\lp.c     */
module_init(lp_init_module);
module_exit(lp_cleanup_module);

3.打開字符設備要經過那些步驟

  • 使用insmod命令加載設備驅動程序模塊至內核(本質上就是向內核註冊設備驅動程序)
  • 使用mknod在/dev目錄之下創建一個設備文件,之後就可以基於fd像普通文件那樣去訪問對應的字符設備了。

4.設備驅動程序應該包含的內容

  • 頭文件
  • 定義相關的函數,用於處理內核模塊的主要邏輯。如打開,讀取等
  • 定義一個file_operations。實現和文件系統的關聯,當創建一個設備文件之後會將對應struct file上的file_operations指針指向對應設備驅動程序的file_operations。
  • 定義模塊的初始化與退出函數,用於加載和卸載的時候調用。
  • 定義module_init與module_exit函數(統一接口),分別指向上面的初始化與退出函數
  • 聲明lisense,調用MODULE_LICENSE

5.塊設備

所謂塊設備就是指硬盤、U盤等,它們常常會被格式化爲文件系統,這就是我們常常熟悉的ext3,4的來源。那麼它是怎樣做到的哩?其實它和字符設備都差不多的處理邏輯,只不過走的是不同的流水線罷了。

作爲軟件開發人員應該對塊設備瞭解的基本概念

  • 明白一個硬盤怎樣變爲我們熟悉的文件系統,又是怎樣掛載到某一個系統文件夾下的?
  • 內核是如何驅動硬盤(塊設備)的,即read/write系統調用更深層次的實現?

(1)如何將塊設備變爲熟悉的文件系統

  • 加載設備驅動程序
  • 在/dev下的devtmpfs中爲塊設備分配inode
  • 調用當前塊設備對應的文件系統的mount操作,如若爲ext4,則調用ext4_mount掛到某個文件夾下

(2)命令

  • /sys/block/*da/queue/scheduler可以查看磁盤的調度算法
  • iostat -d -x中的avgqu-sz表示設備平均IO隊列長度
  • 常見磁盤調度算法:noop(fifo)、deadline(避免飢餓算法)、cfs(完全公平)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章