設備是純粹由硬體決定的塊設備還是字元設備?
來自https://unix.stackexchange.com/a/472920/674
“字元設備”和“塊設備”是抽象概念,通常在 Unix 風格的系統中用於對各種設備進行分類。
設備是由硬體(設備或設備控制器)、設備驅動程序、文件系統、OS 核心 I/O 子系統和/或其他東西確定的塊設備還是字元設備?
我認為它們是純硬體(設備或設備控制器)的概念,獨立於設備驅動程序、文件系統和作業系統核心 I/O 子系統。
唯一真正可見的區別是塊設備使用緩衝區記憶體而字元設備不使用。(並且一些塊設備驅動程序可能會提供基於每個文件繞過緩衝區記憶體的選項)。
塊設備使用的緩衝區記憶體是由設備驅動程序、文件系統還是由硬體(設備或設備控制器)提供的?如果通過硬體,那麼這是否意味著作為塊或字元設備的設備完全由硬體(設備或設備控制器)確定?
謝謝。
不,它由作業系統決定。
FreeBSD 架構手冊日期為 2018-09-23 11:38:04。
9.4 塊設備(已消失)
其他 UNIX® 系統可能支持第二種類型的磁碟設備,稱為塊設備。塊設備是核心為其提供記憶體的磁碟設備
$$ … $$作為磁碟 I/O 基礎設施現代化的一部分,FreeBSD 放棄了對記憶體磁碟設備的支持。
FreeBSD 仍然有“原始”設備,它們是允許讀寫磁碟塊的字元設備。
不要被名稱所迷惑。塊設備提供緩衝——它允許您以字節為單位進行讀寫。原始設備是一種字元設備 - 但它們要求您以塊為單位進行讀寫。塊大小取決於特定的磁碟硬體。
“字元設備”可能最初以電傳終端命名,它一次物理地工作一個字元。塊設備是一種特殊情況,
read()
它與write()
緩衝區記憶體互動,而不是直接與設備驅動程序互動。字元設備成為一般情況,用於所有其他設備文件。該介面很靈活,因為除了設備特定的read()
和write()
之外,它還可以支持帶有ioctl()
.https://en.wikipedia.org/wiki/Device_file#Block_devices
大多數係統都創建塊設備和字元設備來表示硬碟等硬體。FreeBSD 和 Linux 尤其沒有;前者已刪除對塊設備的支持,$$ 6 $$而後者只創建塊設備。
O_DIRECT
在 Linux 中,要為磁碟獲取字元設備,必須使用“原始”驅動程序,儘管通過使用 Linux 特定標誌打開塊設備可以獲得與打開字元設備相同的效果。塊特殊文件或塊設備提供對硬體設備的緩衝訪問,並從它們的細節中提供一些抽象。
$$ 5 $$與字元設備不同,塊設備將始終允許程序員讀取或寫入任何大小(包括單個字元/字節)和任何對齊方式的塊。不利的一面是,由於塊設備是緩衝的,程序員不知道寫入數據從核心緩衝區傳遞到實際設備需要多長時間,或者實際上兩個單獨的寫入將以什麼順序到達物理設備。此外,如果相同的硬體同時暴露了字元設備和塊設備,則由於使用字元設備的客戶端不知道塊設備的緩衝區中所做的更改,因此存在數據損壞的風險。