作業系統實踐之第二章(LDT的使用)

2021-07-24 15:31:50 字數 2632 閱讀 1209

前面我們已經使用過gdt了,本節主要體驗一下ldt的使用。

首先ldt也是描述符表,跟gdt的區別主要在於g(global)和l(local)上的不同。那麼我們如何在**中使用ldt呢?下面將給出示例。

使用ldt的主要**框架如下:

[section .gdt]

…label_desc_ldt: descriptor 0, ldtlen - 1, da_ldt ; ldt

…selectorldt equ label_desc_ldt - label_gdt

…[section .s16]

…; 初始化 ldt 在 gdt 中的描述符

xor eax, eax

mov ax, ds

shl eax, 4

add eax, label_ldt

mov word [label_desc_ldt + 2], ax

shr eax, 16

mov byte [label_desc_ldt + 4], al

mov byte [label_desc_ldt + 7], ah

; 初始化 ldt 中的描述符

xor eax, eax

mov ax, ds

shl eax, 4

add eax, label_code_a

mov word [label_ldt_desc_codea + 2], ax

shr eax, 16

mov byte [label_ldt_desc_codea + 4], al

mov byte [label_ldt_desc_codea + 7], ah

…[section .s32]; 32 位**段. 由實模式跳入.

…; load ldt

mov ax, selectorldt

lldt ax

jmp selectorldtcodea:0 ; 跳入區域性任務

…; ldt

[section .ldt]

align 32

label_ldt:

; 段基址 段界限 屬性

label_ldt_desc_codea: descriptor 0, codealen - 1, da_c + da_32 ; code, 32 位

ldtlen equ $ - label_ldt

; ldt 選擇子

selectorldtcodea equ label_ldt_desc_codea - label_ldt + sa_til

; end of [section .ldt]

; codea (ldt, 32 位**段)

[section .la]

align 32

[bits 32]

label_code_a:

mov ax, selectorvideo

mov edi, (80 * 12 + 0) * 2 ; 螢幕第 10 行, 第 0 列。

mov ah, 0ch ; 0000: 黑底 1100: 紅字

mov al, 'l'

mov [gs:edi], ax

; 準備經由16位**段跳回實模式

jmp selectorcode16:0

codealen equ $ - label_code_a

; end of [section .la]

**的結構很清晰。我們先在gdt中增加了乙個描述符來表示對應的ldt,然後定義了ldt選擇子,後面又對描述符進行了初始化。另外我們在**中還增加了兩個節,其中乙個是新的描述符表,即ldt;另乙個是**段,對應新增的ldt中的乙個描述符。

其中有一段用於載入ldt,指令為lldt,對照它的兄弟lgdt我想大家就知道它的用途了。它負責載入ldtr暫存器,它的運算元是乙個選擇子,這個選擇子對應的就是用來描述ldt的那個描述符。

ldt中的描述符和我們先前用的gdt中的描述符的差別在於後面又加了乙個sa_til屬性。該屬性在pm.inc中定義如下:

sa_til  equ  4
根據選擇子的結構我們可以知道,sa_til屬性的作用就是將選擇子中的ti位置為1。ti位為1時,作業系統會從當前ldt中去尋找相應的描述符。

ldt的使用總體來說並不複雜,我們可以總結一下使用ldt的流程。

1.   定義我們所需的ldt,指定相應的描述符。

2.   定義ldt中描述符對應的選擇子。

3.   在gdt中新增ldt對應的描述符。

4.   為gdt中的ldt定義選擇子。

5.   初始化ldt在gdt中的描述符。

6.   初始化ldt中定義的描述符。

7.   使用lldt載入ldt選擇子指定的內容。

8.   用jmp等指令來執行相關的區域性操作。

程式執行的流程像這樣:首先根據gdt中ldt描述符對應的選擇子將其載入到ldtr暫存器中;當我們在使用ldt中選擇子的時候,由於其ti位為1,系統知道應該從ldtr所指的記憶體中(即指定的ldt中)查詢相應的描述符;也可以將gdt和ldt之間的關係看成乙個二級索引,gdt就是第一級索引,而ldt就是第二級索引,最後ldt選擇子指向的描述符就是索引項。

第二章 作業系統

考試題型分析 選擇題 考試時間 上午試題型別 選擇題分值 6 8分 分值佔比 舉例 包餃子。前驅圖表示出了有些任務是有先後順序的,有些任務是可以並行操作的,箭頭表示約束。首次適應法 最佳適應法 最差適應法 迴圈首次適應法 邏輯位址與實體地址轉換 那麼如何根據邏輯位址求實體地址呢?我們得首先知道那一部...

作業系統 第二章 作業系統基礎操作

計算機體系結構概述 計算機記憶體和硬碟布局 開機順序 背景中斷 異常和系統呼叫相比較 中斷和異常處理機制 系統呼叫概念 系統呼叫的實現 程式呼叫與系統呼叫的不同之處開銷 2 disk 存放os 3 bios 存放i o處理系統 4 bios 載入os到記憶體中。5 post 加電自檢 尋找顯示卡和執...

第二章 作業系統歷史

標籤 空格分隔 作業系統之哲學原理 作業系統的演變就是我們對計算機硬體進行粉飾的過程 所謂狀態機作業系統實際上算不上是我們現在通常定義的作業系統,而是一種簡單的狀態轉換程式 根據特定的輸入和現在的特定狀態進行轉換 驅動這一階段作業系統的動力是個人英雄主義。這個階段沒有作業系統,硬要說有的話,就是人。...