1. 程式人生 > >全域性描述符表解析

全域性描述符表解析

概念

全域性描述符表GDT是為了實現32位模式的分段,跟16位模式的分段是一個概念。只是實現方式不一樣。
在32位中,描述一個段需要以下資訊:

  • 段的大小(至少1M,即20位)

  • 段的起始地址(4G, 即32位)

  • 段的屬性(禁止寫入,禁止執行, 系統專用等,12位)

  我們用64位(8位元組)來標識一個段的基地址,及其屬性。可是CPU並沒有一個這樣的64位段暫存器,我們能是用的依然只有16位的段暫存器。而且由於CPU設計缺陷,段暫存器的低3位還不能用。

所以我們就需要做一個13位到64位的對映。段暫存器的13位最多能標識 8192 個段,那麼就把 這8192個 8位元組整齊的排列在記憶體裡。並將起始地址儲存在GDTR暫存器中。
如果想訪問第1000個段,其段地址 = (GDTR + 1000 * 8) 中的 段起始地址的值

程式碼實現

這裡寫圖片描述

    set_segmdesc(gdt + 1, 0xffffffff, 0x00000000, 0x4092);
    set_segmdesc(gdt + 2, 0x0007ffff, 0x00280000, 0x409a);
    load_gdtr(0xffff, 0x00270000);
//設定全域性描述符表
void set_segmdesc(struct SEGMENT_DESCRIPTOR *sd, unsigned int limit, int base, int ar)
{
    if(limit > 0xfffff){    //如果段大小 > 1M,則G_bit 置 1。該段定義為4G空間
ar |= 0x8000; limit /= 0x1000; } sd->limit_low = limit & 0xffff; // limit 低16位 sd->base_low = base& 0xffff; // base 低16位 sd->base_mid = (base >> 16) & 0xff; // base 中8位 sd->access_right = ar & 0xff; // 屬性低8位
sd->limit_high = ((limit >> 16) & 0xf) | ((ar >> 8) & 0xf0); // limit高4位 | 屬性高8位 sd-base_high = (base >> 24) & 0xff; // base 高8位 }

void load_gdtr(int limit, int addr) 函式無法用C語言實現,只能求助彙編了

_load_gdtr:     ; void load_gdtr(int limit, int addr);
        MOV     AX,[ESP+4]      ; limit
        MOV     [ESP+6],AX
        LGDT    [ESP+6]
        RET

中斷描述符

中斷描述符 和 全域性描述符 的實現方式相似
這裡寫圖片描述

//設定全域性描述符表
void set_segmdesc(struct SEGMENT_DESCRIPTOR *sd, unsigned int limit, int base, int ar)
{
    if(limit > 0xfffff){    //如果段大小 > 1M,?G_bit 置 1。?段定??4G空?
        ar | 0x8000;
        limit /= 0x1000;
    }
    sd->limit_low = limit & 0xffff;             // limit 低16位
    sd->base_low = base& 0xffff;                // base 低16位
    sd->base_mid = (base >> 16) & 0xff;         // base 中8位
    sd->access_right = ar & 0xff;               // 屬性低8位
    sd->limit_high = ((limit >> 16) & 0xf) | ((ar >> 8) & 0xf0);    // limit高4位 | 屬性高8位
    sd->base_high = (base >> 24) & 0xff;            // base 高8位
    return;
}
_load_idtr:     ; void load_idtr(int limit, int addr);
        MOV     AX,[ESP+4]      ; limit
        MOV     [ESP+6],AX
        LIDT    [ESP+6]
        RET 

相關推薦

全域性描述解析

概念 全域性描述符表GDT是為了實現32位模式的分段,跟16位模式的分段是一個概念。只是實現方式不一樣。 在32位中,描述一個段需要以下資訊: 段的大小(至少1M,即20位) 段的起始地址(4G, 即32位) 段的屬性(禁止寫入,禁止執行, 系統專用等,

全域性描述 GDT

全域性描述符表GDT 全域性描述符表主要是為了讓計算機從真實模式到保護模式. 在真實模式下面訪問的地址都是真實的實體地址, 這樣的話每個程式都能直接的訪問實體地址, 並修改實體地址會很容易的造成系統的崩潰, 宕機. 所以為了讓使用者不能直接的訪問實體地址創造了虛擬地址,

全域性描述GDT和區域性描述LDT

段描述符        IA-32架構的處理器訪問記憶體都是採用“段基址:段內偏移地址”的形式,即使到了保護模式也不例外。其次,真實模式脆弱的安全性也是保護模式推出的重要原因。為了記憶體安全性,必須為記憶體段新增一些額外的安全屬性,如特權級、段界限、段型別等。描述記憶體段屬

【OS學習筆記】十三 保護模式一:全域性描述(GDT)

上一篇文章,我們大致領略了現代處理器的結構和特點。點解連結檢視上一篇文章:現代處理器的結構和特點 本篇文章開始,學習保護模式下的的各種機制。什麼是保護模式呢? 一般來說,作業系統負責整個計算機軟硬體的的管理,它做任何事情都是可以的。但是使用者程式就應當有所限制,使用者程式它只能訪

GDT全域性描述

GDT全域性描述符表 什麼是GDT全域性描述符表 GDT全稱為Global Descriptor Table,全域性描述符表。 保護模式的定址方式不在使用暫存器分段的方式直接定址方式了。而採用的是使用GDT(全域性分段描述表)來定址。從而使用更多的記憶體地址。 建立GDT全域性描述符表使用到一個48位

Bran的核心開發教程(bkerndev)-06 全域性描述(GDT)

全域性描述符表(GDT)   在386平臺各種保護措施中最重要的就是全域性描述符表(GDT)。GDT為記憶體的某些部分定義了基本的訪問許可權。我們可以使用GDT中的一個索引來生成段衝突異常, 讓核心終止執行異常的程序。現代作業系統大多使用"分頁"的記憶體模式來實現該功能, 它更具通用性和靈活性。GDT還定義了

GDT全局描述

位操作 不能 glob 全局 建立 數據加載 ... 內存地址 信息 GDT全局描述符表 什麽是GDT全局描述符表 GDT全稱為Global Descriptor Table,全局描述符表。 保護模式的尋址方式不在使用寄存器分段的方式直接尋址方式了。而采用的是使用GDT(全

驅動開發(10)直接I/O和記憶體描述

在上篇博文中,我們實現了在驅動程式中處理裝置收到讀寫I/O請求,這個請求我們是使用緩衝I/O處理的。 在上一篇中,我已經詳細解釋了使用緩衝I/O的原因,在這裡簡單重複一下,如果要看詳細解釋請看上一篇博文。 當我們呼叫ReadFile(Ex)和WriteFile(Ex)讀寫

段選擇,段描述描述

段描述符(8位元組)存放於 GDT/LDT 段選擇符(16位) + 偏移量(32位) = 邏輯地址 段暫存器僅僅存放段選擇符,段暫存器中的段選擇符指定非程式設計段暫存器中的段描述符。 關於描述符,描述符表,段選擇符的區別。 1、描述符      描述符是一個八位元組

80386簡介--描述描述

Intel 80386 微處理器的基本結構 Intel 80386 微處理器功能結構如圖,它是三部分組成:中央處理部件CPU、儲存管理部件MMU、匯流排介面部件BIU。 1.中央處理部件CPU:它由指令部件和執行部件組成。 (1)指令部件包括指令預取和指令譯碼兩部分,

檔案描述,開啟檔案,索引節點

 下圖是一個例項,其中描述符1和4通過不同的開啟檔案表表項來引用兩個不同的檔案,這是一種典型的情況,沒有檔案共享,並且每個描述符對應一個不同的檔案:       多個描述符也可以通過不同的檔案表表項來引用同一個檔案。例如,如果以同一個檔名呼叫open函式2次,就會發生這種情況。關鍵思想是每個檔案描

Bran的核心開發教程(bkerndev)-07 中斷描述(IDT)

中斷描述符表(IDT)   中斷描述符表(IDT)用於告訴處理器呼叫哪個中斷服務程式(ISR)來處理異常或彙編中的"int"指令。每當裝置完成請求並需要服務事, 中斷請求也會呼叫IDT條目。異常和ISR將在下一節進行詳細的說明。   每一項IDT都與GDT相似, 兩者都有一個基地址, 一個訪問標誌, 而且都長

HID用作滑鼠的報告描述解析

const uint8_t HID_ReportDescriptor[] = { USAGE_PAGE(Generic Desktop)             //全域性專案,用途頁用作通用桌面 USAGE (Mouse)                       

Unix環境程式設計之二:檔案描述、開啟檔案、v節點關係詳解

一、檔案描述符概念 Linux 系統中,把一切都看做是檔案,當程序開啟現有檔案或建立新檔案時,核心向程序返回一個檔案描述符,檔案描述符就是核心為了高效管理已被開啟的檔案所建立的索引,用來指向被開啟的檔案,所有執行I/O操作的系統呼叫都會通過檔案描述符。 二、檔案

Linux原始碼解析-記憶體描述(mm_struct)(轉)

轉自 1.簡介 一個程序的虛擬地址空間主要由兩個資料結構來描述。一個是最高層次的:mm_struct(定義在mm_types.h中),一個是較高層次的:vm_area_structs。最高層次的mm_struct結構描述了一個程序的整個虛擬地址空間。較高層次的結構vm

Linux的開啟檔案:開啟檔案、檔案描述、開啟的檔案控制代碼以及i-node之間的關係

    在Linux系統中一切皆可以看成是檔案,檔案又可分為:普通檔案、目錄檔案、連結檔案和裝置檔案。檔案描述符(file descriptor)是核心為了高效管理已被開啟的檔案所建立的索引,其是一個非負整數(通常是小整數),用於指代被開啟的檔案,所有執行I/O操作的系統呼叫都通過檔案描述符。程式剛剛啟動的

檔案描述、檔案項、V節點項的一些總結

         看書的時候對這三樣東西把握得不太清楚,嗯,所以寫篇blog來總結一下。 檔案描述符(程序級別):        1)、在每個程序表中都有一個記錄項,記錄項中包含有一張開啟檔案描述符表,可將其視察為一個向量(陣列),每個描述符佔用一項。與每個檔案描述符相

HID報告描述解析_筆記

要了解報告描述符,需要兩份資料:《device class definition for human interface device (HID)》, 《Universal Serial Bus HI

段選擇,段描述,80x86的頁定址機制

段選擇符指示著段的描述符,在段描述符中包含有定義段所用的全部資訊,包括: (1)索引欄位:是由13位組成.利用索引欄位可以從擁有8192個段描述符的段描述符表中選出任何一個段描述符來。處理機用8(8是段描述符的欄位數)乘以索引值再加上描述符的基地址(來自全域性描述符暫存器,或

uvc攝像頭程式碼解析描述

module_init(uvc_init); //1.模組入口 2.初始化函式 static int __init uvc_init(void) // 2.初始化函式 { int result; result = usb_register(&uvc_driver.driver); // 3