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的博客!
评论









