全域性描述符表解析
概念
全域性描述符表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