回覆列表
  • 1 # 使用者4869054127496

    其實問題就在這裡:對於磁碟操作都是透過DMA,系統呼叫層層向下,直到裝置驅動程式,它會向DMA傳遞核心快取區地址,這個地址用來快取DMA從裝置讀取的資料/寫入裝置的資料,還向DMA傳遞讀取/寫入的資料量。DMA在完成指定資料量的傳遞之後,例如將裝置中的資料寫入核心快取之後,產生一箇中斷,CPU按這個中斷的中斷號執行對應的中斷服務程式。這個過程有一個問題:DMA會將資料讀到核心快取,那麼DMA中斷之後中斷服務程式【驅動程式】怎麼知道誰需要核心快取中的內容呢,換句話來說,驅動程式該把核心快取中的資料寫到哪個程序的地址空間中呢?真正需要這些資料的程序現在正在等待佇列裡休眠,那麼驅動程式怎麼知道該要喚醒哪個程序,將他從等待佇列中刪除,加入可執行程序佇列呢?難道等待某個裝置上的資料的程序都休眠在與這個裝置中斷號關聯的一個FIFO佇列中麼?這樣,當資料傳輸完成時,裝置發出中斷,中斷服務程式【驅動程式】知道自己關聯上的中斷號,然後它就可以去喚醒佇列頭上的程序...感覺這樣也解釋不通:1.怎麼知道該把核心快取中的資料傳遞到程序地址空間的哪個地址呢?2.要是一個裝置正在做DMA,這時候,又有一個程序需要向這個裝置傳遞資料怎麼辦?要將這個裝置掛起嗎?可掛起之後怎麼喚醒他,就算能喚醒他,喚醒之後等到他被排程,那他不就回到使用者態了嗎,這不就讀不到任何資料了麼?----------如果核心會為驅動程式建立一個驅動程序【驅動上下文】,那一切就解釋得通了----------中斷處理程式的疑惑不過我目前並沒有聽說過驅動程序這一個概念...,希望知道這個詞的童鞋解釋一下。-----------------------------------------------------------------------------------------------------------------------------------------中斷處理分為上部和下部,上部的處理比較關鍵,必須保證在關中斷的狀態下完成,佔用非常少的時間。下部的處理則可以允許中斷巢狀,如果下部的處理是不允許阻塞的,那就使用tasklet,如果允許執行阻塞式的I/O操作,則使用工作佇列,工作佇列可以把工作推後,交由一個核心執行緒去執行——這個下部總是在程序上下文中執行,所以允許重新排程甚至睡眠。【linux核心設計與實現.第7章.下半部和推後執行的工作】

  • 中秋節和大豐收的關聯?
  • 爆發性分手如何挽回,縱使對方態度非常決絕?