这是一条出色的学习曲线,似乎帮助我培养了有关操作系统和内核基本奥秘的理论/法律的更多理论和概念思想。我假定,我对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开发中的某些概念。 =)