【版权所有,转载请注明出处。出处:http://www.cnblogs.com/joey-hua/p/5570691.html 】 Linux内核从启动到初始化也看了好些个源码文件了,这次看到kernel文件夹下的system_call.s,这个文件主要就是系统调用的过程 ...
【版权所有,转载请注明出处。出处:http://www.cnblogs.com/joey-hua/p/5570691.html 】
Linux内核从启动到初始化也看了好些个源码文件了,这次看到kernel文件夹下的system_call.s,这个文件主要就是系统调用的过程。但说到系统调用,不只是这一个文件这么简单,里面牵扯到的内容太多,这里就做个笔记记录一下从建立中断到最终调用系统调用的完整机制。
假设就从write这个函数作为系统调用来解释。
系统调用的本质就是用户进程需要访问内核级别的代码,但用户进程的权限是最低的,内核代码是权限最高的,不允许直接访问,需要通过中断门作为媒介来实现权限的跳转。简单讲就是用户进程调用一个中断,这个中断再去访问内核代码。这里就来学习一下Linux内核具体是怎么做的。
1.建立中断描述符表IDT
因为要用到中断,所以首先要建立中断描述符表IDT,作用如下图:
在head.s文件中,建立好了IDT,比如要使用int 0x80,就从_idt开始找到偏移为0x80的地方执行代码。
.align 3 # 按8 字节方式对齐内存地址边界。_idt: .fill 256,8,0 # idt is uninitialized# 256 项,每项8 字节,填0。idt_descr: #下面两行是lidt 指令的6 字节操作数:长度,基址。 .word 256*8-1 # idt contains 256 entries .long _idt lidt idt_descr # 加载中断描述符表寄存器值。
原标题:Linux0.11内核系列—2.系统调用机制分析
关键词:linux
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。