1,中断描述符表IDT。
在保护模式下,系统启动时会初始化一个叫IDT的表。该表的每个表项占8个字节。
这8个字节的具体含义见上图。
-------------------------------------------------------------------------------------------
实模式与保护模式中断描述方式区别
不同点 | 实模式 | 保护模式 |
名称 | 中断向量表 | 中断描述符表IDT |
位置是否固定 | 是
| 否 |
表项大小 | 4字节
| 8字节
|
表大小 | 4*256 = 1K
| 不固定 |
--------------------------------------------------------------------------------------------
位置:init/main.c
- 456 asmlinkage void __init start_kernel(void)
- {
- ...
- 510 trap_init(); //内核中主要初始化中断的函数。
- ...
- }
start_kernel()函数在内核启动时做了很多初始化工作,其中关于中断的初始化部分大部分都是由trap_init()
来初始化,而系统调用属于“系统门”,只是中断中的一部分。
-----------------------------------------------------------------------------------------------
- 51 # define SYSCALL_VECTOR 0x80
- 824 void __init trap_init(void)
- {
- ...
- 871 set_system_trap_gate(SYSCALL_VECTOR, &system_call);
- 872 set_bit(SYSCALL_VECTOR, used_vectors);
- ...
- }
其实初始化系统调用主要就是初始化0x80号中断门,将0x80号中断门的8个字节
填充。8字节 = 2个字节的段选择符 + 4个字节的偏移量 + 2个字节的模式切换信息。
-------------------------------------------------------------------------------------------------------
- 365 static inline void set_system_trap_gate(unsigned int n, void *addr)
- 366 {
- 367 BUG_ON((unsigned)n > 0xFF);
- 368 _set_gate(n, GATE_TRAP, addr, 0x3, 0, __KERNEL_CS);
- 369 }
- 370
_set_gate函数用来设置IDT表项。
门号:n = 0x80
门类型:GATE_TRAP=0xF 1111 -------------->32bit 陷阱门
DPL(特权级):0x3
addr:中断服务子程序的地址。
这儿特权级是3,所以该中断可以进入到内核。
--------------------------------------------------------------------------------------------------------
阅读(284) | 评论(0) | 转发(0) |