Chinaunix首页 | 论坛 | 博客
  • 博客访问: 913350
  • 博文数量: 119
  • 博客积分: 2493
  • 博客等级: 大尉
  • 技术积分: 2363
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-03 14:00
文章分类

全部博文(119)

文章存档

2013年(19)

2012年(100)

分类: LINUX

2012-06-17 10:33:31

1,中断描述符表IDT。

在保护模式下,系统启动时会初始化一个叫IDT的表。该表的每个表项占8个字节。
这8个字节的具体含义见上图。
-------------------------------------------------------------------------------------------
实模式与保护模式中断描述方式区别
 不同点 实模式 保护模式
 名称 中断向量表 中断描述符表IDT
 位置是否固定
 否
 表项大小 4字节
8字节
 表大小4*256 = 1K
不固定
--------------------------------------------------------------------------------------------
  位置:init/main.c
  1. 456 asmlinkage void __init start_kernel(void)
  2. {
  3. ...
  4. 510 trap_init(); //内核中主要初始化中断的函数。
  5. ...
  6. }
start_kernel()函数在内核启动时做了很多初始化工作,其中关于中断的初始化部分大部分都是由trap_init()
来初始化,而系统调用属于“系统门”,只是中断中的一部分。
-----------------------------------------------------------------------------------------------
  1. 51 # define SYSCALL_VECTOR 0x80

  2. 824 void __init trap_init(void)

  3. {

  4. ...

  5. 871 set_system_trap_gate(SYSCALL_VECTOR, &system_call);

  6. 872 set_bit(SYSCALL_VECTOR, used_vectors);

  7. ...

  8. }
其实初始化系统调用主要就是初始化0x80号中断门,将0x80号中断门的8个字节
填充。8字节 = 2个字节的段选择符 + 4个字节的偏移量 + 2个字节的模式切换信息。
-------------------------------------------------------------------------------------------------------

  1. 365 static inline void set_system_trap_gate(unsigned int n, void *addr)
  2. 366 {
  3. 367 BUG_ON((unsigned)n > 0xFF);
  4. 368 _set_gate(n, GATE_TRAP, addr, 0x3, 0, __KERNEL_CS);
  5. 369 }
  6. 370
_set_gate函数用来设置IDT表项。
门号:n = 0x80
门类型:GATE_TRAP=0xF 1111 -------------->32bit 陷阱门
DPL(特权级):0x3
addr:中断服务子程序的地址。
这儿特权级是3,所以该中断可以进入到内核。
--------------------------------------------------------------------------------------------------------



阅读(2376) | 评论(2) | 转发(1) |
0

上一篇:系统调用执行过程

下一篇:安装ncurses库

给主人留下些什么吧!~~

zhe_wang2012-06-18 16:47:34

夏冰软件: 你的文章写的不错,我支持一下.....
谢谢,本人菜鸟一个,还希望以后多多指教。

夏冰软件2012-06-18 15:20:36

你的文章写的不错,我支持一下