《自己动手写操作系统 》第九章 一 简易硬盘驱动的实现
生活随笔
收集整理的這篇文章主要介紹了
《自己动手写操作系统 》第九章 一 简易硬盘驱动的实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
摘要:我們都知道磁盤由控制器、磁頭等組件組成。我們在終端編輯文件的時候,文件內容是如何從內存到達磁盤的呢?磁盤驅動主要完成哪些工作?硬盤中斷是如何觸發的?等等,這些都是硬盤工作的基本原理。本文主要從“自己動手寫操作系統” 出發,通過實現一個簡單的硬盤驅動,來解釋硬盤工作的基本原理。
1.程序執行流程:
1)task_hd()作為一個守護進程,初始化硬盤,然后一直運行,等待接收來自其他進程的消息2)如果收到打開設備的消息,那么將執行identify(0);否則,出錯信息提示
3)identify(0):想硬盤發送IDENTIFY命令,等待中斷的到來,中斷到來后,從數據寄存器中讀取硬盤的信息
4)打印步驟3)中得到的硬盤信息
5)中斷處理程序的內容:讀取硬盤忙的狀態;通知驅動程序
*6)文件系統向驅動程序發送“打開設備”的命令
2.疑問解答
2.1.硬盤能夠接收哪些命令?有什么樣的處理結果?
硬盤能夠接受很多命令(都是硬件定義的,和系統無關)。這里,我們用到了IDENTIFY DEVICE 命令,下面解釋一下:參考手冊:AT Attachment with packet Interface 文檔P113:
The IDENTIFY DEVICE command enables the host to receive parameter information from the device.Some devices may have to read the media in order to complete this command.
When the command is issued, the device sets the BSY bit to one, prepares to transfer the 256 words of device
identification data to the host, sets the DRQ bit to one, clears the BSY bit to zero, and asserts INTRQ if nIEN
is cleared to zero. The host may then transfer the data by reading the Data register. Table 27 defines the
arrangement and meaning of the parameter words in the buffer. All reserved bits or words shall be zero.
Some parameters are defined as a 16-bit value. A word that is defined as a 16-bit value places the most
significant bit of the value on signal line DD15 and the least significant bit on signal line DD0 (see 3.2.9).
Some parameters are defined as 32-bit values (e.g., words (61:60)). Such fields are transferred using two
successive word transfers. The device shall first transfer the least significant bits, bits (15:0) of the value, on
signal lines DD(15:0) respectively. After the least significant bits have been transferred, the most significant
bits, bits (31:16) of the value, shall be transferred on DD(15:0) respectively (see 3.2.9).
Some parameters are defined as a string of ACSII characters. Such fields are transferred as defined in 3.2.9.
2.2.如何通知驅動程序?
參見inform_int()相關代碼
3.其他要注意的事項
一個進程擁有哪些資源?需要到哪里注冊?PCB中的相關信息!我們添加一個任務之后,需要到task_table或者其他地方進行注冊。
3.1不要忘記在proc_tabel等的相關更新
4.關于port_read:不可預取類型
? ? IO操作有兩種類型,可預取類型和不可預取類型,前者主要是RAM,后者主要是設備寄存器。你有沒有對這個port_read函數感到奇怪呢?為什么連續讀取多次,就能讀取到不同的信息?——這是因為設備寄存器本身就是FIFO隊列的接口,是一種不可預取類型。其中,insw指令的用法如下:
INS m8, DX
從 DX 指定的 I/O 端口將字節輸入 ES:(E)DI 指定的內存位置
INS m16, DX
從 DX 指定的 I/O 端口將字輸入 ES:(E)DI 指定的內存位置
INS m32, DX
從 DX 指定的 I/O 端口將雙字輸入 ES:(E)DI 指定的內存位置
INSB
從 DX 指定的 I/O 端口將字節輸入 ES:(E)DI 指定的內存位置
INSW
從 DX 指定的 I/O 端口將字輸入 ES:(E)DI 指定的內存位置
INSD
從 DX 指定的 I/O 端口將雙字輸入 ES:(E)DI 指定的內存位置
?
?這里,如果我們一定要記得導出port_read函數,不然這個函數無法被外部模塊使用。
5.硬盤中斷是如何同驅動程序交互的呢?
這里有一個非常重要的函數:hd_identify(),里面的關鍵過程如下:hd_cmd_out();
interrup_wait();
port_read();
向硬盤發送命令——等待中斷到來——讀取數據端口
6.硬盤的構造和工作原理
硬盤內部結構由固定面板、控制電路和板、磁頭、盤片、主軸、電機、接口及其它附件組成,其中磁頭盤片組件是構成硬盤的核心,它封裝在硬盤的凈化腔體內,包括有浮動磁頭組件、磁頭驅動機構、盤片、主軸驅動裝置及前置讀寫控制電路這幾個部份。我們向硬盤發送一個命令之后,硬盤控制器接受到命令,然后開始執行,命令執行完畢之后,將觸發硬盤中斷,通知驅動程序,數據已經準備完畢。
7.總結
? ? ? ? 現在,你腦海里有沒有硬盤工作的清晰圖景呢?BIOS開機檢測到硬盤,將硬盤的基本信息讀取到內存的特定位置,通過PCIE配置,給硬盤寄存器分配對應的端口號碼;操作系統將硬盤中斷綁定特定的中斷處理程序(主要是驅動程序);驅動程序運行,文件系統運行,文件系統向驅動程序發送讀取硬盤信息的請求,硬盤驅動向硬盤發送相應操作命令并等待硬盤中斷的回應;收到硬盤中斷回應之后,驅動程序讀取端口數據到緩沖區,交給文件系統進行處理。總結
以上是生活随笔為你收集整理的《自己动手写操作系统 》第九章 一 简易硬盘驱动的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(2345):uniapp学习
- 下一篇: 前端学习(2130):编译作用域的概念