歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> 基於i386的Linux實現特點剖析——基礎的基礎

基於i386的Linux實現特點剖析——基礎的基礎

日期:2017/2/27 14:24:39   编辑:更多Linux
  摘要  本文討論的是Linux在i386體系的cpu上實現特點。通過介紹i386cpu的保護方式下的中斷機制、存儲器的段頁式管理以及任務切換而提供的硬件機制,比較Linux的具體實現的特點與i386的設計意圖之間的差異。描述了Linux中斷向量表的設置過程,中斷請求隊列的初始化以及如何將特定的中斷服務程序掛入指定的中斷請求隊列中。跟蹤Linux中從邏輯地址到線性地址再到物理地址的變換過程,著重於線性地址到物理地址的頁式變換,並結合i386cpu分析地址變換的效率。  基於i386體系結構的Linux實現特點剖析  一 前言  本文討論的是linux在i386體系的cpu上實現特點。通過介紹i386cpu的保護方式下的中斷機制、存儲器的段頁式管理以及任務切換而提供的硬件機制,比較Linux的具體實現的特點與i386的設計意圖之間的差異。描述了Linux中斷向量表的設置過程,中斷請求隊列的初始化以及如何將特定的中斷服務程序掛入指定的中斷請求隊列中。跟蹤Linux中從邏輯地址到線性地址再到物理地址的變換過程,著重於線性地址到物理地址的頁式變換,並結合i386cpu分析地址變換的效率。  二 80386 保護方式  80386有兩種工作方式:實方式和保護方式。盡管實方式下80386的功能較Intel先前的微處理器有很大的提高,但只有在保護方式下,80386才能真正發揮作用。在保護方式下,全部32根地址有效,可尋址達4G字節的物理空間;擴充的存儲器分段管理機制和可選的存儲器分頁管理機制,不僅為存儲器共享和保護提供了硬件支持,而且為實現虛擬存儲器提供了硬件支持;支持多任務,能快速的進行任務切換和任務保護環境;4個特權級和完善的特權檢查機制,既能實現資源共享又能保證代碼及數據的安全和保密及任務的隔離;支持虛擬8086方式,便於執行8086代碼。  1、80386 保護方式的尋址  在保護方式下,當尋址擴展內存中的數據和程序時,仍然使用偏移地址訪問位於存儲器內的信息,但保護方式下的段地址不再像實方式那樣有段寄存器提供,而是在原來放段地址的段寄存器裡含有一個選擇子,用於選擇描述符表內的一個描述符。描述符描述存儲器的位置、長度和訪問權限。  保護方式下有兩個描述符表:全局描述符表和局部描述符表。全局描述符表包含適用於所有程序的段定義,而局部描述符表通常用於唯一的應用程序。每個描述符表包含8129個描述符,所以任何時刻應用程序最多可用16384個描述符。  每個描述符長8字節,全局和局部描述符表每個最長為64kb。  80386描述符格式:  這裡有表格   描述符的基地址指示存儲段的起始位置,32位的基地址允許段其始於4GB存儲器的任何地方。  段界限包含該段中最後的偏移地址,20位的段界限使得段的長度為1KB至1MB之間或者4KB至4GB之間。描述符中特征位:G位(粒度位),若G=0,說明段的界限為0000H到FFFFFH(從0到1MB),若G=1,段的界限值要乘4K段的長度為4KB到4GB。  若D=0,則指令是16位的,意味著使用16位偏移地址和默認的16位寄存器;若D=1,則指令就位32位。  訪問權限字節具體如下:  有表格    P=0 描述符沒有定義 P=1 段包含有效基地址和界限值   DPL 描述符的優先級    S=0 系統描述符 S=1 代碼或數據段描述符   E=0 描述符描述數據段    ED=0 段向上擴展(數據段) ED=1 段向下擴展(堆棧段)    W=0 數據不能被寫入 W=1 數據可以被寫入   E=1 描述符描述代碼段    C=0 忽視描述符的優先級 C=1 遵循描述符的優先級   R=0 代碼段不能被讀 R=1 代碼段可以被讀   A=0 段未被訪問 A=1 段已經被訪問  保護方式操作期間段寄存器的內容:  有表格   選擇子從8192個全局或局部描述符表,為了訪問和指定這些表的地址,微處理器中包含了一些程序不可見寄存器。在保護方式下,這些寄存器控制著微處理器。  在保護方式下,每個段寄存器都含有一個程序不可見區域,通常稱為告訴緩沖器。每當段寄存器中的內容改變時,基地址、界限和訪問權限就裝入段寄存器中的不可見區域。這就允許微處理器重復訪問一個段時,不必每次都去查詢段描述符表。    有表格   全局描述符表的基地址和界限包含愛GDTR(全局描述符表寄存器)中。全局描述符表的最大長度為64K,因此描述符表的界限為16位。要使微處理器工作與保護方式,全局描述表的基地址和界限要裝入GDTR。    有表格   而局部描述符表的位置是從全局描述符表中選擇。為了尋址局部描述符表,必須建立一個全局描述符。為了訪問局部描述符表,必須將選擇子裝入LDTR(局部描述符表寄存器),如同選擇子裝入段寄存器一樣。這個選擇子訪問全局描述符表,並且將局部描述符表的基地址、界限和訪問權限裝入LDTR的告訴緩沖存儲區。    有表格   分頁機制式存儲管理機制的第二部分。分頁機制在段機制之後進行操作,以完成虛擬地址到物理地址的轉換。段機制把虛擬地址轉換為線性地址,分頁機制進一步把線性地址轉換為物理地址。     分頁機制由微處理器中控制寄存器的內容控制。分頁機制由CRO中的PG位啟用。若PG=1,啟用分頁機制。PG=0,緊用分頁機制,直接把段機制生成的線性地址當作物理地址。       CR1 保留未用   CR2 中存放出現頁故障時的線性地址   CR3 中的PCD和PWT位控制微處理器PCD和PWT引腳的操作。  如果PCD置位,則PCD引腳在非分頁總線周期變為邏輯1,這  就允許外部硬件控制二級高速緩沖存儲器。PWT位也在非分  頁周期出現在PWT引腳上,用於控制寫直達系統中的高速緩  沖存儲器。CR3還包含頁目錄基地址(CR3的高10位),用於  定位頁轉換部件的頁目錄。這個基地址將頁目錄定位於任何  以4KB為邊界的存儲器中。  由軟件生成的線性地址分為三部分,分別用於尋址頁目錄項、頁表項和頁偏移地址。  線性地址: 有表格   頁目錄表存儲在一個4k字節的頁中。頁目錄表共有1024個表項,每個頁目錄表項為4字節長,並指向一個頁表。線性地址的高10位用量產生對頁目錄表的索引,由索引得到的表項重,指定並選擇了1024個4字節的表項,每個表項用以選擇對應的物理頁。  頁目錄和頁表項:  有表格   頁目錄和頁表項高20位包含物理地址的高20位,而低12位包含頁的屬性。  有表格   P 存在位,該位表示表項對地址轉換有效(P=1)或無效(P=0)。在頁轉換期間,遇到無效表項,都會產生異常。若P=0,表項中的其余各位80386不對其做解釋,可供軟件使用。事實上,Linux在頁面交換時就采用這種方法。當一個頁面在內存中時,頁面表中的表項的P位為,表示頁面在內存中,而其余各位表示頁面的各種屬性。當一個頁面被交換到了磁盤上,則相應的表項不再指向一個物理頁面,而變成了一個磁盤頁面,指示這個頁面的去向。由於此時最低位為0,表示頁面不再內存中,所以微處理器中的MMU單元對其各位都忽略不顧,而Linux內核中,就用它來唯一的確定一個頁面在磁盤上的位置,包括在哪個文件或設備,以及頁面在此文件匯中的位置。   R/M 該/寫位。若該位為1,對頁表指定的頁可進行讀、寫或執行;若該位為0,該頁可讀或執行,但不能對該頁進行寫操作。然而讀寫位並不總起作用。但微處理器在超級特權級之一(0、1或2級)執行時,R/M位被忽略。在目錄表項中的R/M位,應用於該目錄表項所映射的所有頁。   U/S 用戶/系統位。若該委為1,頁表指定的頁可由在任何特權級下執行的程序訪問;若該位為0,則該頁只能在超級特權級執行阿程序訪問。在目錄表項中的U/S位,應用於該目錄表項映射的所有各頁。   PMT 寫直達位。控制用寫直達或寫回策略應用於頁表或頁面緩存管理。若該位為1,頁表或頁面采用寫直達的緩存策略;若該位為0,采用寫回策略。   PCD 禁用高速緩沖位。若該位為1,頁表和頁面不用高速緩存;若該位為0,則可用高速緩存。當CRO中的CD位(Cache Disable)被置位,微處理器將忽略PCD位。   A 訪問位。若該位為1,表明指向的頁表和頁面已經被訪問過(讀或寫);反之,指向的頁表和頁面未被訪問。   D 表明該頁是否被寫過。內存管理機制把某頁調入物理內存時,將該位復位;當微處理器對其有寫操作時,該位將會被置位。   AVL 供軟件使用。   線性地址最低的12位和從頁表項中的物理地址(高20位)形成了最後的物理地址。  2 保護方式下的中斷  保護方式使用一組存儲在中斷描述符表(IDT,interrupt descriptor table)中的256個中斷描述符取代實方式下的中斷向量。中斷描述符表為256*8(2K)字節長,每個描述符長8字節。中斷描述符表由中斷描述符表地址寄存器(IDTR)定位於系統中任一存儲單元。IDTR長48位,其中32位的基地址規定IDT的基地址,16位的界限規定IDT的段界限。由於80386只支持最多256個中斷/異常,所以IDT表最大長度是2K,以字節單位的段界限為7FFH。  描述符項又稱為“門”,意思是當中斷發生時必須通過這些門,才能進入相應的服務程序。但是,這樣的門並不是光為中斷而設的,只要想切換CPU的運行狀態,即其優先級別,例如從用戶的3級進入系統的0級,就都要通過一道門。而從用戶態進入系統態的途徑也不只限於中斷(或異常,或陷阱),還可以通過子程序調用指令CALL和轉移指令JMP來達到目的。  按不同的用途和目的,CPU一共有四種門,即任務門(task gate)、中斷門(interrupt gate)、陷阱門(trap gate)和調用門(call gate)。除任務門外,其他三種門的結構基本相同,不過調用門




Copyright © Linux教程網 All Rights Reserved