Rust-x86_64库
原因
最近在学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位:
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 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 sdww0的博客!
评论