原创 4異常處理

80x86處理器發佈了大約20種不同的異常。內核必須爲每種異常提供一個專門的異常處理程序。對於某些異常,CPU控制單元在開始執行異常處理程序前會產生一個硬件的錯誤碼(hardware error code),並且壓入內核態堆棧。 下面列表

原创 2Linux內存佈局

在上一篇博文裏,我們已經看到Linux如何有效地利用80x86的分段和分頁硬件單元把邏輯地址轉換爲線性地址,在由線性地址轉換到物理地址。那麼我們的應用程序如何使用這些邏輯地址,整個內存的地址佈局又是怎樣的?打一個比方,內存就像一座城市,而

原创 3Linux頁框管理

在前面的博文裏,我們講解了基於80x86體系的Linux內核分段和分頁機制,並詳細地討論了Linux的內存佈局。有了這些基本概念以後,我們就來詳細討論內核如何動態地管理那些可用的內存空間。   對於80386這種32位的處理器結構,Li

原创 3中斷描述符表

好了,現在,我們知道了80x86微處理器在硬件級對中斷和異常做了些什麼,接下來,我們繼續關注的是如何初始化中斷描述符表。 內核啓用中斷以前,必須把IDT表的初始地址裝到idtr寄存器,並初始化表中的每一項。這項工作是在初始化系統時完成的

原创 6中斷處理(續)

上一篇博文我們把中斷原理和中斷處理所需要的數據結構清理了一遍,現在,我們就該看看中斷處理的具體動作是怎樣的了。   當CPU接收一箇中斷時,就開始執行相應的中斷處理程序代碼,前面介紹過了,該代碼的地址存放在IDT的相應門中。於是,與其他

原创 5中斷處理

上一篇博文裏,我們談到了異常處理,現在我們開始研究一下中斷處理的情況。中斷處理比異常處理複雜得多,這是因爲:   第一,中斷的發生對於正在運行的進程無關,被調用的中斷處理函數叫做中斷服務程序,它運行在內核態並處於系統上下文中(使用內核頁

原创 7下半部分

我們在前面的“中斷處理”博文中提到,在由內核執行的幾個中斷任務之間有些不是緊急的:在必要情況下它們可以延遲一段時間。回憶一下,一箇中斷處理程序是急迫的,調用do_IRQ將幾個中斷服務例程串行執行,並且通常在一箇中斷的處理程序結束前,不應

原创 8定時器中斷

走到這裏,大家肯定對Linux的中斷處理有概念了,下面我們通過一個具體的實例,來了解Linux內核處理中斷的全過程,那就是定時器中斷。在詳細分析這個過程之前,我們把Linux時間管理的概念先縷一縷。   在當前的80x86體系結構上,內

原创 2中斷的硬件環境

1 IRQ 講到中斷的硬件環境,我們先從著名的IRQ信號談起。每個能夠發出中斷請求的硬件設備控制器都有一條名爲IRQ的輸出線。所有現有的IRQ線都與一個名爲可編程中斷控制器(PIC)的硬件電路的輸入引腳相連,可編程中斷控制器執行下列動

原创 1中斷的分類

這是我們瘋狂內核系列的中斷處理專題開山之作,中斷,廣義的來說通常被定義爲一個事件,該事件觸發改變處理器執行指令的順序。狹義地來說,針對80x86體系,中斷被分爲中斷和異常,又叫同步中斷和異步中斷。注意廣義的中斷和狹義的中斷千萬不要混淆,以

原创 1基於80x86的Linux的分段和分頁機制

0386的兩種工作模式:80386的工作模式包括實地址模式和虛地址模式(保護模式)。Linux主要工作在保護模式下。 在保護模式下,80386虛地址

原创 4夥伴系統算法

講了這麼多了,很多人肯定會一頭霧水,前邊提到的都是些數據結構或者是些概念性的東西,真正對動態頁面的管理機制在哪裏?換句話說,如何將每個節點,每個區中的頁框分配給進程?要理清這個思路,我們首先必須學習一種算法 —— 夥伴系統算法。   內

原创 20 處理非連續內存區訪問

回憶一下“缺頁異常處理程序”,當出現缺頁異常,並且是進程處於內核態,即do_page_fault()中的那個if (unlikely(address >= TASK_SIZE))分支語句後,將通過vmal

原创 13 分配線性地址區間

前面講了那麼多線性區底層分配的細節,現在讓我們討論怎樣分配一個新的線性地址區間。爲了做到這點,do_mmap()函數爲當前進程創建並初始化一個新的線性區。不過,分配成功之後,可以把這個新的線性區與進程已有的其他線性區進行合併。 stat

原创 18 請求調頁

上一篇博文引出了“請求調頁”技術,術語“請求調頁”指的是一種動態內存分配技術,它把頁框的分配推遲到不能再推遲爲止,也就是說,一直推遲到進程要訪問的頁不在物理RAM中時爲止,由此引起一個缺頁異常。   請求調頁技術背後的動機是:進程開始運