下面這張圖來自《深入理解計算機系統》:
io橋部分一般還分為北橋和南橋,北橋當然是靠上的了。
–主頻: cpu的時鐘頻率,核心工作的時鐘頻率
–外頻: 系統匯流排的工作頻率
–倍頻: cpu外頻與主頻相差的倍數
–前端匯流排: 將cpu連線到北橋晶元的匯流排
–匯流排頻率: 與外頻相同或者是外頻的倍數
–匯流排資料頻寬: (匯流排頻率 * 資料位寬)/ 8
likes:辨析主頻和外頻:
主頻指的是cpu的頻率,每乙個cpu時鐘週期執行一條指令。一般是ghz的量級。
外頻是匯流排工作頻率,其頻率遠遠小於cpu頻率,主要用來實現我們提到的時鐘,時鐘週期是程序排程的事件單位。每一次時鐘週期都會導致一次時間中斷,核心可以藉此排程程序。一般linux核心是100hz到1000hz(時鐘頻率越大,排程精度越高,但是中斷越頻繁,系統負擔越重),也就是乙個週期一般是ms。
由此可見在一次時鐘週期中可以執行大量的cpu指令。cpu時鐘週期和核心時鐘週期不是乙個概念,也不是乙個量級。
在x86平台上,硬碟是掛在ide、sata或scsi匯流排上的裝置,儲存在硬碟上的程式是不能被cpu直接取指令執行的,作業系統在執行程式時會把它從硬碟拷貝到記憶體,這樣cpu才能取指令執行,這個過程稱為載入(load)。程式載入到記憶體之後,成為作業系統排程執行的乙個任務,就稱為程序(process)。程序和程式不是一一對應的。乙個程式可以多次載入到記憶體,成為同時執行的多個程序,例如可以同時開多個終端視窗,每個視窗都執行乙個shell程序,而它們對應的程式都是磁碟上的/bin/bas**件。
作業系統(operatingsystem)本身也是一段儲存在磁碟上的程式,計算機在啟動時執行一段固定的啟動**(稱為bootloader)首先把作業系統從磁碟載入到記憶體,然後執行作業系統中的**把使用者需要的其它程式載入到記憶體。作業系統和其它使用者程式的不同之處在於:作業系統是常駐記憶體的,而其它使用者程式則不一定,使用者需要執行哪個程式,作業系統就把它載入到記憶體,使用者不需要哪個程式,作業系統就把它終止掉,釋放它所佔的記憶體。作業系統最核心的功能是管理程序排程、管理記憶體的分配使用和管理各種裝置,做這些工作的程式稱為核心(kernel),在某個系統上核心程式是/boot/vmlinuz-2.6.28-13-generic檔案,它在計算機啟動時載入到記憶體並常駐記憶體。廣義上作業系統的概念還包括一些必不可少的使用者程式,比如shell是每個linux系統必不可少的,而office辦公套件則是可有可無的,所以前者也屬於廣義上作業系統的範疇,而後者屬於應用軟體。
訪問裝置還有一點和訪問記憶體不同。記憶體只是儲存資料而不會產生新的資料,如果cpu不去讀它,它也不需要主動提供資料給cpu,所以記憶體總是被動地等待被讀或者被寫。而裝置往往會自己產生資料,並且需要主動通知cpu來讀這些資料,例如敲鍵盤產生乙個輸入字元,使用者希望計算機馬上響應自己的輸入,這就要求鍵盤裝置主動通知cpu來讀這個字元並做相應處理(硬中斷),給使用者響應。這是由中斷(interrupt)機制實現的,每個裝置都有一條中斷線,通過中斷控制器連線到cpu,當裝置需要主動通知cpu時就引發乙個中斷訊號,cpu正在執行的指令將被打斷,程式計數器會指向某個固定的位址(這個位址由體系結構定義),於是cpu從這個位址開始取指令(或者說跳轉到這個位址),執行中斷服務程式(isr,interruptservice routine),完成中斷處理之後再返回先前被打斷的地方執行後續指令。比如某種體系結構規定發生中斷時跳轉到位址0x00000010執行,那麼就要事先把一段isr程式載入到這個位址,isr程式是核心**的一部分,在這段**中首先判斷是哪個裝置引發了中斷,然後呼叫該裝置的中斷處理函式做進一步處理。由於各種裝置的操作方法各不相同,每種裝置都需要專門的裝置驅動程式(devicedriver),乙個作業系統為了支援廣泛的裝置就需要有大量的裝置驅動程式,事實上linux核心源**中絕大部分是裝置驅動程式。裝置驅動程式通常是核心裡的一組函式,通過讀寫裝置暫存器實現對裝置的初始化、讀、寫等操作,有些裝置還要提供乙個中斷處理函式供isr呼叫。
mmu(memorymanagement unit)將va對映到pa是以頁(page)為單位的,32位處理器的頁尺寸通常是4kb。例如,mmu可以通過乙個對映項將va的一頁0xb7001000~0xb7001fff對映到pa的一頁0x2000~0x2fff,如果cpu執行單元要訪問虛擬位址0xb7001008,則實際訪問到的實體地址是0x2008。物理記憶體中的頁稱為物理頁面或者頁幀(pageframe)。虛擬記憶體的哪個頁面對映到物理記憶體的哪個頁幀是通過頁表(pagetable)來描述的,頁表儲存在物理記憶體中,mmu會查詢頁表來確定乙個va應該對映到什麼pa。
作業系統和mmu是這樣配合的:
1.作業系統在初始化或分配、釋放記憶體時會執行一些指令在物理記憶體中填寫頁表,然後用指令
設定mmu,告訴mmu頁表在物理記憶體中的什麼位置。
2.設定好之後,cpu每次執行訪問記憶體的指令都會自動引發mmu做查表和位址轉換操作,位址轉換操作由硬體自動完成,不需要用指令控制mmu去做。
我們在程式中使用的變數和函式都有各自的位址,程式被編譯後,這些位址就成了指令中的位址,
指令中的位址被cpu解釋執行,就成了cpu執行單元發出的記憶體位址,所以在啟用mmu的情況下,程式中使用的位址都是虛擬位址,都會引發mmu做查表和位址轉換操作。
mmu除了做位址轉換之外,還提供記憶體保護機制。各種體系結構都有使用者模式(usermode)和特權模式(privilegedmode)之分,作業系統可以在頁表中設定每個記憶體頁面的訪問許可權,有些頁面不允許訪問,有些頁面只有在cpu處於特權模式時才允許訪問,有些頁面在使用者模式和特權模式都可以訪問,訪問許可權又分為可讀、可寫和可執行三種。這樣設定好之後,當cpu要訪問乙個va時,mmu會檢查cpu當前處於使用者模式還是特權模式,訪問記憶體的目的是讀資料、寫資料還是取指令,如果和作業系統設定的頁面許可權相符,就允許訪問,把它轉換成pa,否則不允許訪問,產生乙個異常(exception)。異常的處理過程和中斷類似,不同的是中斷由外部裝置產生而異常由cpu內部產生,中斷產生的原因和cpu當前執行的指令無關,而異常的產生就是由於cpu當前執行的指令出了問題,例如訪問記憶體的指令被mmu檢查出許可權錯誤,除法指令的除數為0等都會產生異常。
通常作業系統把虛擬位址空間劃分為使用者空間和核心空間,例如x86平台的linux系統虛擬位址空間是0x00000000~0xffffffff
,前3gb
(0x00000000~0xbfffffff)是使用者空間,
後1gb
(0xc0000000~0xffffffff)是核心空間。使用者程式載入到使用者空間,在使用者模式下執行,不能訪問核心中的資料,也不能跳轉到核心**中執行。這樣可以保護核心,如果乙個程序訪問了非法位址,頂多這乙個程序崩潰,而不會影響到核心和整個系統的穩定性。cpu在產生中斷或異常時不僅會跳轉到中斷或異常服務程式,還會自動切換模式,從使用者模式切換到特權模式,因此從中斷或異常服務程式可以跳轉到核心**中執行。事實上,整個核心就是由各種中斷和異常處理程式組成的。總結一下:在正常情況下處理器在使用者模式執行使用者程式,在中斷或異常情況下處理器切換到特權模式執行核心程式,處理完中斷或異常之後再返回使用者模式繼續執行使用者程式.
段錯誤是這樣產生的:
1.使用者程式要訪問的乙個va,經mmu檢查無權訪問。
2.mmu產生乙個異常,cpu從使用者模式切換到特權模式,跳轉到核心**中執行異常服務程式。
3.核心把這個異常解釋為段錯誤,把引發異常的程序終止掉。
movl $1, %eax
movl $4, %ebx
int $0x80
int指令稱為軟中斷指令,可以用這條指令故意產生乙個異常,異常的處理和中斷類似,cpu從使用者模式切換到特權模式,然後跳轉到核心**中執行異常處理程式。int指令中的立即數0x80(0~255)是乙個引數,在異常處理程式中要根據這個引數決定如何處理,在linux核心中int$0x80這種異常稱為系統呼叫(systemcall)。核心提供了很多系統服務供使用者程式使用,但這些系統服務不能像庫函式(比如printf)那樣呼叫,因為在執行使用者程式時cpu處於使用者模式,不能直接呼叫核心函式,所以需要通過系統呼叫切換cpu模式,經由異常處理程式進入核心,使用者程式只能通過暫存器傳幾個引數,之後就要按核心設計好的**路線走,而不能由使用者程式隨心所欲,想調哪個核心函式就調哪個核心函式,這樣可以保證系統服務被安全地呼叫。在呼叫結束之後,cpu再切換回使用者模式,繼續執行int$0x80的下一條指令,在使用者程式看來就像函式呼叫和返回一樣。eax和ebx的值是傳遞給系統呼叫的兩個引數。eax的值是系統呼叫號,linux的各種系統呼叫都是由int$0x80指令引發的,核心需要通過eax判斷使用者要調哪個系統呼叫,_exit的系統調 用號是1。ebx的值是傳給_exit的引數,表示退出狀態。大多數系統呼叫完成之後會返回使用者空間繼續執行後面的指令,而_exit系統呼叫比較特殊,它會終止掉當前程序,而不是返回使用者空間繼續執行。可以說如read,write這樣的系統呼叫的底層實現都是利用了這3條彙編指令,系統呼叫只是進入核心程式的乙個介面,核心呼叫核心函式(如中斷異常服務程式,實現各種普通檔案操作的核心函式,各種裝置驅動程式等)進行服務.
計算機體系結構基礎
現代計算機都是基於von neumann體系結構的,不管是嵌入式系統 pc還是伺服器。這種體系結構的主要特點是 cpu cpu,central processing unit,處理器,或簡稱處理器processor 和記憶體 memory 是計算機的兩個主要組成部分,記憶體中儲存著資料和指令,cpu...
計算機體系結構
計算機體系結構 計算機體系機構指計算機中部件和部件之間的聯絡 一 馮 諾依曼體系 1 計算機處理的資料和指令用二進位制數表示 2 採用儲存程式方式,指令和資料儲存在同乙個儲存器中。3 指令由操作碼和位址組成。操作碼指明指令的操作型別,位址指明運算元和位址。4 以運算器為中心,i o裝置與儲存器間的資...
計算機體系結構
2.計算機體系結構 經典計算機體系結構概念的實質是計算機系統中軟硬體介面的確定,其介面之上的是軟體的功能,介面之下的是硬體和韌體的功能。廣義 現代 的計算機體系結的構概念,它除了包括經典的計算機體系結構的概念範疇 指令集結構 還包括計算機組成和計算機實現的內容。計算機體系結構是程式設計師所看到的計算...