我们花费了好大力气完成了全局描述符表,中断描述符表,TSS,PIC等结构和对应功能的代码,在本章中我们根据之前编写的GDT,IDT结构以及对应的方法来完成GDT,IDT的加载
明确一下目标
我们现在的项目结构是这样的
.
├── kernel
│ ├── Cargo.lock
│ ├── Cargo.toml
│ ├── Makefile
│ ├── src
│ │ ├── main.rs
│ │ └── vga.rs
│ └── x86-64.json
└── lib
├── Cargo.lock
├── Cargo.toml
└── src
├── bits
│ └── mod.rs
├── ia_32e
│ ├── addr.rs
│ ├── cpu
│ │ ├── mod.rs
│ │ ├── pic.rs
│ │ └── port.rs
│ ├── descriptor
│ │ ├── gdt.rs
│ │ ├── idt.rs
│ │ ├── mod.rs
│ │ └── tss.rs
│ ├── instructions
│ │ ├── interrupt.rs
│ │ ├── mod.rs
│ │ ├── port.rs
│ │ ├── segmention.rs
│ │ └── tables.rs
│ └── mod.rs
├── lib.rs
├── mutex.rs
└── tests.rs
kernel.toml的内容如下
[dependencies.lazy_static]
version = "1.0"
features = ["spin_no_std"]
[dependencies]
# 用于系统引导
bootloader = "0.8.0"
# 我们自己写的
system={path="../lib/",version="0.1.0"}
我们需要明确接下来的工作,主要的工作有这些:
- 使用
lazy_static
初始化TSS,GDT,IDT - 使用IDT,GDT的load来加载IDT,GDT
- 使用
set_cs
来设置内核运行代码段,使用set_tss
函数加载tss - 初始化PIC并使用
initialize
来初始化8259A - 使用
sti
指令开启中断
经过以上步骤我们可以完成描述以及中断的初始化操作,中断的处理将会放到下个章节讲述
开始干活
初始化TSS
我们在kernel/src/gdt.rs
中添加以下内容(需要创建)
// in kernel/src/gdt.rs
use system::ia_32e::descriptor::tss::TaskStateSegment;
use l