1. 程式人生 > >linux核心 80x86保護模式及其程式設計

linux核心 80x86保護模式及其程式設計

這一章涉及intel8086系列cpu的保護模式程式設計,應該是學習核心程式設計,驅動程式設計及嵌入式程式設計一些基礎知識。不過對於沒接觸過底層程式設計的我來說,感覺還是好複雜難過

  不過裡面也有許多以前彙編學過的東西,大部分還是能看懂的微笑。我覺得圖表就能說明大部分內容了,細節東西,不能都做筆記,所以大部分筆記都是圖表- -。

1,首先是關於8086cpu的各個標誌暫存器,其內容如下: 

2,記憶體管理的暫存器,主要用於實現分段記憶體管理機制,GDTR是全域性段描述符表暫存器,IDTR是中斷向量表暫存器,TR是任務暫存器,LDTR是區域性描述符表暫存器。

  其中,GDTR的內容基本上是不變的,一個系統一般只有一個全域性段描述符表。LDTR則是在切換任務時重新載入,每個任務都有自己的區域性描述符表。

  

3,控制暫存器,cr0~cr3,很重要的暫存器,控制cpu操作模式及當前任務的特性等等。具體各個暫存器的用法內容太多,還是看書吧 =  =.

  CR0:含有控制處理器操作模式和狀態的系統控制標誌。

        CR1:保留不用。。。

  CR2:含有導致頁錯誤的線性地址,用於分頁機制。

  CR3:含有頁目錄表實體記憶體地址,也被稱為頁目錄基地址暫存器PDBR。

  

  用於操作以上暫存器的指令列表:

    

  

4,記憶體定址方面,8086彙編都有講過了。這裡主要是分段管理機制與分頁管理機制。

  

  

  分段機制中,每個段的大小不是固定的,因此使用段時必需通過查詢段描述符表來獲得段的資訊。而分頁機制中頁的大小剛是固定的,每個頁大小為4KB,。

  分頁儲存是實現虛擬記憶體的關鍵,沒有使用分頁的話,要將整個段在主存與磁碟的虛擬記憶體之間移動,在效率及實現上都是不可接受的,通過分頁,每次移4KB的資料是較好的方式。

  由於線性地址為4GB,可分為1024*1024個頁面,每個記錄頁表資訊的頁表項大小為4B,總共需要4MB的記憶體空間,這在早期實體記憶體只有可憐的幾MB的計算機上是不允許的。所以又採用了二級頁表的方式,通過一個4KB的頁目錄表可定址到1024個頁表,每個頁表4KB存放1024個頁表項。這樣做並沒有減少使用的記憶體總量,反而還多了4KB,之所以這樣做是因為可以將二級頁表整個移動到虛擬記憶體空間中,同一時間內只有幾個活動的頁表,可以節省大量的空間(對那個時候來說,0.12版只能支援最大16MB的主存 =  =)。

  沒有使用分頁機制的話,計算出來的線性地址將直接作為實體記憶體的地址。

  分段跟分頁都可以有保護機制,分頁的保護比分段更底層,分段保證對段的訪問有正確的許可權及範圍,而分頁由圖可以看出在分段保護通過後還會再進行分頁機制的保護,保護內容主要是讀寫及訪問許可權。保護有任務之間的保護,保證任務不會訪問到其他任務的記憶體空間,還有特權級的保護,控制系統任務與使用者任務之間的訪問關係。

5,分段的細節:

  內容太多了,還是弄弄圖就好了。

  

  

  

  

  段與段之間並不一定是完全分開的,有可能交叉甚至重疊。

  訪問段,通過選擇符定位找到段描述符表中的一個描述符,再通過段描述符訪問具體的段。一個描述符表只有2^13=8192個描述符,所以選擇符前三個位不用於定位,前兩位用於表示特權級,第三位用於表示要訪問的段是在全域性描述符表中還是區域性描述符表中。

  區域性描述符表也作為一個段,其段描述符儲存在全域性描述符表中

相關推薦

linux核心 80x86保護模式及其程式設計

這一章涉及intel8086系列cpu的保護模式程式設計,應該是學習核心程式設計,驅動程式設計及嵌入式程式設計一些基礎知識。不過對於沒接觸過底層程式設計的我來說,感覺還是好複雜。   不過裡面也有許多以前彙編學過的東西,大部分還是能看懂的。我覺得圖表就能說明大部分內容了,細

保護模式及其程式設計——中斷和異常處理

摘要:為了提高CPU的利用效率,我們採用了中斷策略來處理某些外部事件。同時,軟體也需要觸發某些中斷和異常,例如除零中斷/page Fault異常等。和子程式呼叫相比,中斷和異常的發生往往是不可預料的,中斷/異常和輪詢相比,能夠顯著提高CPU的工作效率。中斷髮生在任何時刻,相

保護模式及其程式設計——真實模式保護模式的切換

機器上電,CPU進入真實模式,從實體地址0xFFFFFFFF0處開始執行初始化程式碼,設定基本系統功能操作必要的資料結構資訊,例如處理中斷和異常的IDT表。接下來,如果繼續在保護模式工作,需要載入作業系統模組;如果要進入真實模式,那麼需要進行模式切換。 1.進入保護模式時的初始化操作 處理器能夠進入到保護模

保護模式及其程式設計——分頁機制

摘要:分頁機制是實現虛擬儲存的關鍵,但是它的實現比較簡單。傳統的頁都是<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">4K</span&g

操作系統學習(一)、80x86保護模式內存管理

分享 共享棧 問題 代碼 就會 空間 階段 logs ima 整理的不好,湊合著看吧 目錄 1.內存及尋址 2.地址變換 3.分段機制 4.分頁機制 5.保護 6.去到底部 一、內存及尋址 返回目錄 二、地址變換 80X86 從 邏輯地址 到 物理地址 的轉換

80x86保護模式下特權級轉移

80386搞的這個保護模式,最大的特點就是加入了安全檢查,不再像真實模式下那樣,程式程式碼可以隨意jmp,隨意call了,受到了特權級的約束,關於特權級的概念我看無數的資料,各種大牛的解釋,反覆理解了好多次,這回我要再次整理一下。CPL:當前CPU正在處理的程式碼段的特權級

80x86保護模式

logs 都是 alt pos 使用 itl 偏移 top 段描述符 什麽是保護模式? 通過對程序使用的存儲區采用分段、分頁的存儲管理機制, 達到分組使用、互不幹擾的保護目的。能為每個任務提供一臺虛擬處理器,使每個任務單獨執行,快速切換。 所以,內存地址由段基地址、偏移地址

Linux核心模組程式設計

Linux核心模組程式設計 (作者:Baron_wu 禁止轉載) 首先,建立一個核心模組並插入Linux核心中。這是實驗第一部分 首先檢視當前核心模組使用情概況:lsmod Module:模組名 Size:模組大小 Used by:這些模組在哪被使用 接下來編寫一個simple.c

linux 核心模組程式設計之LED驅動程式(六)

我使用的是tiny6410的核心板,板子如下,淘寶可以買到 為了不與板子上的任何驅動發生IO衝突,我使用CON1那一排沒用到的IO口,引腳如下   LED1 LED2 LED3 LED4

linux 核心模組程式設計核心符號匯出(五)

/proc/kallsyms 記錄了核心中所有匯出的符號的名字與地址 我們需要編譯2個核心模組,然後其中一個核心模組去呼叫另一個核心模組中的函式 hello.c程式碼如下 #include <linux/module.h> #include <linux/in

linux 核心模組程式設計之模組引數(四)

通過巨集module_param指定模組引數,模組引數用於在載入模組時傳遞給模組。 module_param(name, type, perm) name是模組引數的名字 type是這個引數的型別,常見值:bool、int、charp(字串型) perm是模組

linux 核心模組程式設計之編譯多個原始檔(三)

編譯擁有多個原始檔的核心模組的方式和編譯一個原始檔的方式差不多,我們先來看下我們需要的檔案都有哪些。 首先是main.c檔案 #include <linux/module.h> #include <linux/init.h> MODULE_LICENSE

linux 核心模組程式設計之hello word(二)

我們的目的是要編譯個hello.ko的檔案,然後安裝到核心中。 先來看下需要的程式碼,hello.c檔案如下 #include <linux/module.h> #include <linux/init.h> static int hello_init(vo

linux 核心模組程式設計之環境搭建(一)

這裡介紹些關於Tiny6410開發板核心的編譯,為後期驅動開發做前期的準備。 開發環境:64位的Ubuntu 14.01虛擬機器 目標機:友善之臂Tiny6410開發板 核心:linux-2.6.38-20110325.tar.gz 核心原始碼下載地址 htt

Linux核心模組程式設計——Hello World

一、實驗環境: 環境配置:VMware® Workstation 15 Pro、ubuntu Desktop 18.10、記憶體 2GB、處理器數量2、每個處理器核心數量1、硬碟大小30GB……還有一個就是用的咱Xidian的源(因為校內不需要流量啊,而且還很快!) 二、知識儲備

Linux核心模組程式設計系列1

1.準備工作 使用如下命令檢視自己Linux的核心版本 uname -a 結果如下: Linux VM-73-203-debian 4.9.0-6-amd64 #1 SMP Debian 4.9.88-1+deb9u1 (2018-05-07) x86_64 GNU/Lin

《Java多執行緒程式設計實戰》——第2章 設計模式及其作用

設計模式與三十六計 多執行緒設計模式簡介 不使用鎖的情況下保證執行緒安全 Immutable Object(不可變物件)模式 Thread Specific Storage(執行緒特有儲存)模式 Serial Thread Confinement(序列執行緒封

如何通過編譯Linux核心開啟IPVS(LVS)的debug模式

前言 為了定位keepalived VIP的問題, 一步一步定位到IPVS, IPVS預設是沒有開啟Debug模式的, 若需要開啟Debug模式需要重新編譯IPVS模組載入後才行, 最好的方式當然是僅僅編譯IPVS模組就行, 但是實踐過程中發現單獨編譯IPVS模組存在諸多問題, 暫且先放一放, 後續再整理整

linux核心程式設計讀書筆記【第三章程序管理】

第三章程序管理 應專業選修Linux程式設計老師的要求,記錄讀書筆記 3.1程序 1)程序:處於執行期的程式(目標碼存放在某種介質上),包含程式碼段還包含其他資源(開啟的檔案、核心內部資料、存放全域性變數的資料段),是正在執行的程式程式碼的實時結果,Linux通

3---Linux核心核心程式設計

什麼是作業系統? 指在系統中負責完成最基本功能和系統管理的部分, 作業系統有哪些組成部分? 核心------作業系統的內在核心 裝置驅動程式 啟動載入程式 命令列shell 其他種類的使用者介面----作業系統的外在表象 基本的檔案管理工具和系統工具