原因

最近在学x86_64的操作系统, blog os中用到了x86_64这个库, 看了一下里面蛮多东西都已经写好了, 可以直接用, 所以总结一下(由于里面的寄存器或者指令等可能不会用到,所以这篇会跟RISCV CSV详解那一张一样随时更新), 总结的同时也能了解一下x86的一些东西

首先列出来每个rs文件的作用, 之后会细讲里面的一些东西:

根目录

文件名 作用 备注
addr.rs 包含物理地址以及虚拟地址的结构体
lib.rs 库的lib, 包含一个特权级的enum

structures

文件名 作用 备注
gdt.rs 二级中断表, 指定每个中断入口函数后load启用 GlobalDescriptorTable
idt.rs 一级中断表, 指定每个中断入口函数后load启用 InterruptDescriptorTable
mod.rs mod
port.rs 两个trait, 用于读写IO端口 提供给instructions包用的
tss.rs 用于描述一个TaskStateSegment 64位与32位有点区别,参见下面的表格与图片

64位:

Field Type
(reserved) u32
Privilege Stack Table [u64; 3]
(reserved) u64
Interrupt Stack Table [u64; 7]
(reserved) u64
(reserved) u16
I/O Map Base Address u16

32位:

img

paging

文件名 作用 备注
frame_alloc.rs 一个trait, FrameAllocator 用于分配一个页的物理内存
frame.rs 用于描述物理页,包含PhysFrame等结构体
mod.rs mod
page_table.rs 用于描述一个页表, PageTable(N个PTE) 还包含PTE的结构体以及index等
page.rs 用于描述一个虚拟页 包含大页等

mapper

此包下包含一些已经实现的页表, 不用自己来具体设置如何映射, 只需要传入一些参数调用里面的一些方法即可

文件名 作用 备注
mapped_page_table.rs 一个页表的实现, 只需要实现一个虚拟地址如何和物理地址转换的函数 其他具体的页表基础
mod.rs 包含一些trait, translate等
offset_page_table.rs 位移页表
recursive_page_table.rs 递归页表

registers

文件名 作用 备注
control.rs 包含寄存器Cr0,Cr2,Cr3,Cr4 control registers
debug.rs 包含寄存器Dr0,Dr1,Dr2,Dr3,Dr6,Dr7 debug registers
mod.rs mod
model_specific.rs 包含一系列MSR寄存器如Star,LStar,SFMask等
mxcsr.rs MxCsr寄存器
rflags.rs RFlags寄存器
segmentation.rs 貌似是一些分段寄存器,包含SS,DS,ES,FS,GS
xcontrol.rs extended system registers, 包含Xr0