這是一條出色的學習曲線,似乎幫助我培養了有關操作系統和內核基本奧秘的理論/法律的更多理論和概念思想。我假定,我對OSS的工作方式有一個很好的想法。但是,與僅閱讀相比,創建自己的操作系統絕對更明確。以我本身的誠實意見。這是我對內核模式和用戶模式上想要混亂的軟件有更好理解的一種方式。
在開始之前,即使內核和操作系統為32位。我也將在64位中解釋概念,顯然其中一個是長模式。
模式
中斷
描述符
分頁
在Intel®64和IA-32架構軟件開發人員手冊3A:系統編程指南,第1部分中閱讀更多有關保護模式的信息;第3章 *
什麼是中斷
您可以將中斷視為由鍵盤,固態驅動器,硬驅動器或鼠標和軟件等設備發送的信號或數據,這些設備告訴CPU發生了事件發生,並且需要立即停止其當前正在做的事情,以繼續將其發送到中斷。
例如,當您移動/單擊鼠標時,鼠標控制器會將中斷發送到CPU中斷控制器時,CPU的注意將立即轉移到鼠標中斷,並將繼續執行例程(鼠標運動或單擊)。鼠標中斷後,CPU將在中斷之前繼續執行任何操作,或者如果已發出信號,則將其管理另一個中斷。
+------------------------+ +------------+
| TYPES OF INTERRUPTS |------------| Exceptions |
+------------------------+ +------------+
/
/
/
+------------+ +------------+
| HARDWARE | | SOFTWARE |
| INTERRUPTS | | INTERRUPTS |
+------------+ +------------+
IRQ線或基於PIN的IRQ:這些通常在芯片組上靜態路由。電線或線路從芯片組上的設備運行到IRQ控制器,該電線序列地將設備發送的中斷請求序列化,並將其發送到CPU,以防止比賽。在許多情況下,IRQ控制器將根據設備的優先級一次將多個IRQ發送到CPU。一個非常眾所周知的IRQ控制器的一個示例是Intel 8259控制器鏈,該控制器鏈中存在於所有IBM-PC兼容芯片組上,將兩個控制器鏈接在一起,每個控制器提供8個輸入引腳,總共16個可用的IRQ信號銷在傳統IBM-PC上。
基於消息的中斷:這些是通過為保留的內存位置編寫值,以提供有關中斷設備,中斷本身和矢量信息的信息的信號。該設備被分配了通過固件或內核軟件寫入的位置。然後,使用設備特定於設備總線的仲裁協議生成IRQ。提供基於消息的中斷功能的總線的一個示例是PCI總線。 wiki.osdev -https://wiki.osdev.org/interrupts
條目 -該條目定義了內存中的一個區域,以及區域的限制以及與條目相關的訪問特權。訪問特權如告訴處理器是否在系統(環0)或應用程序(環3)中運行的處理器。它可以防止應用程序或USERMODE可以訪問某些寄存器/操作數和助記符。例如CR登記冊和CLI/STI。
限制 -段描述符的大小
細分選擇器 -它們是保存描述符索引的寄存器
更明確地,索引不是選擇器
細分寄存器所擁有的事情:
訪問描述符表也具有特權,這稱為每個寄存器的RPL(請求特權級別),但對於cs稱為CPL(當前特權級別)。它們都有不同的目的,您可以在英特爾或AMD手冊中找到這些目的。
用於研究的表。一個表是GDT,另一個是LDT。
從概念上想像選擇器的使用的非正式規則:因此,非正式規則是:
selector = index + table_to_use +特權table_to_use + index = discriptor =有關要使用的內存段的所有信息
加號不是算術操作
段選擇器寄存器的位字段:
15 3 2 0
+--------------------------------------------------+----+--------+
| Index | TI | RPL |
+--------------------------------------------------+----+--------+
TI = Table Indicator: 0 = GDT, 1 = LDT
The TI specify if the Descriptor were dealing with is a GDT or LDT
IF(TI == 0) THEN
... THE DESCRIPTOR IS A GDT
ELSEIF(TI == 1) THEN
... THE DESCRIPTOR IS A LDT
GDT為1:1,邏輯地址是與選擇器一起使用的GDT的一個示例:
<---- Selector ----> +----- Segment Selector Register
+-------+----+-----+ v
| Index | TI | RPL | = DS
+-------+----+-----+ GDT LDT
| | +---------------------+ +---------------------+
| +------------>| Null Descriptor | | Null Descriptor |
| +---------------------+ +---------------------+
| | Descriptor 1 | | Descriptor 1 |
| +---------------------+ +---------------------+
| | | | |
| ... ... ... ... ... ... ... ...
| | |
| +---------------------+
+------------------->| Descriptor K |
+---------------------+
| |
... ... ... ...
RPL (Request Privilege Level) describes the privilege for accessing the descriptor
我們將所有GDT基礎(地址)和限制(我們的GDT的大小)存儲在GDTR中。 GDTR指向我們在內存中的所有GDT條目,從基地開始。在那之後,然後加載了lgdt Mnemonic:
typedef union _gdt_descriptor
{
struct
{
uint64_t limit_low : 16 ;
uint64_t base_low : 16 ;
uint64_t base_middle : 8 ;
uint64_t access : 8 ;
uint64_t granularity : 8 ;
uint64_t base_high : 8 ;
};
} __attribute__((packed)) gdt_entry_t ;
gdt_entry_t gdt_entrys[ 256 ];
/* The GDTR (GDT Register) */
struct gdtr
{
uint16_t limit;
uint32_t base;
} __attribute__((packed)) gdtr;
...
gdtr.base = &gdt_entrys;
gdtr.limit = ( sizeof (gdt_descr) * 256 ) - 1 )
在AMD64 Architecture編程器手冊中閱讀更多信息,第2卷,第4.7節(第84-90頁{+})
引用此內容並開始。 https://notes.shichao.io/utlk/ch2/#paging-in-hardware這是迄今為止我最有趣的,一旦我理解它,我就會感到非常興奮。
X86 OS舊版Paggage虛擬地址,帶有4KB頁面:
x86 OS CR4.PAE分頁虛擬地址,帶有4KB頁面:
X86_64(IA-32E)OS CR4.lme/cr4.pae Paging虛擬地址,帶4KB頁面:
•控制寄存器CR0中的WP和PG標誌分別(位16和位31)。
•在控制寄存器CR4中的PSE,PAE,PGE,PCIDE,SMEP,SMAP和PKE標誌分別分別(位4,BIT 5,BIT 7,BIT 17,BIT 20,BIT 21和BIT 22)。
•IA32_EFER MSR中的LME和NXE標誌(分別為8和位11)。 •Eflags寄存器中的交流標誌(位18)。通過Intel®64和IA-32的第4章架構軟件開發人員手冊3A:系統編程指南,第1部分;第4章
•IA32_EFER MSR中的LME和NXE標誌(分別為8和位11)。 •Eflags寄存器中的交流標誌(位18)。 Intel®64和IA-32的第4章架構軟件開發人員手冊3A:系統編程指南,第1部分;第4章
如果將Cr4.pae和/或Cr4.lme設置為1,則PSE被完全忽略。
未添加終端
cd smkrnl; make run
為了激發我對這個項目的持續努力的靈感/支持,並幫助我了解內核/OS開發中的某些概念。 =)