欢迎来到天天文库
浏览记录
ID:6650140
大小:67.00 KB
页数:9页
时间:2018-01-21
《linux内核分析方法谈(下_2)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、方法之四:以功能为中心,各个击破 从功能上看,整个Linux系统可看作有一下几个部分组成:进程管理机制部分;内存管理机制部分;文件系统部分;硬件驱动部分;系统调用部分等; 以功能为中心、各个击破,就是指从这五个功能入手,通过源码分析,找出Linux是怎样实现这些功能的。 在这五个功能部件中,系统调用是用户程序或操作调用核心所提供的功能的接口;也是分析Linux内核源码几个很好的入口点之一。对于那些在dos或Uinx、Linux下有过C编程经验的高手尤其如此。又由于系统调用相对其它功能而言,较为简单,
2、所以,我就以它为例,希望通过对系统调用的分析,能使读者体会到这一方法。 与系统调用相关的内容主要有:系统调用总控程序,系统调用向量表sys_call_table,以及各系统调用服务程序。下面将对此一一介绍:保护模式下的初始化过程中,设置并初始化idt,共256个入口,服务程序均为ignore_int,该服务程序仅打印“Unknowninterruptn”。(源码参见/Arch/i386/KERNEL/head.S文件;相关内容可参见保护模式下的初始化部分)在系统初始化完成后运行的第一个内核程序start
3、_kernel中,通过调用trap_init函数,把各自陷和中断服务程序的入口地址设置到idt表中;同时,此函数还通过调用函数set_system_gate把系统调用总控程序的入口地址挂在中断0x80上。其中:start_kernel的原型为void__initstart_kernel(void),其源码在文件init/main.c中;trap_init函数的原型为void__inittrap_init(void),定义在arch/i386/kernel/traps.c中函数set_system_gate
4、同样定义在arch/i386/kernel/traps.c中,调用原型为set_system_gate(SYSCALL_VECTOR,&system_call);其中,SYSCALL_VECTOR是定义在linux/arch/i386/kernel/irq.h中的一个常量0x80;而system_call即为系统调用总控程序的入口地址;中断总控程序用汇编语言定义在arch/i386/kernel/entry.S中。(其它相关内容可参见中断和中断处理部分)系统调用向量表sys_call_table,是一个含
5、有NR_syscalls=256个单元的数组。它的每个单元存放着一个系统调用服务程序的入口地址。该数组定义在/arch/i386/kernel/entry.S中;而NR_syscalls则是一个等于256的宏,定义在include/linux/sys.h中。各系统调用服务程序则分别定义在各个模块的相应文件中;例如asmlinkageintsys_time(int*tloc)就定义在kerneltime.c中;另外,在kernelsys.c中也有不少服务程序;II、系统调用过程 ∥颐侵溃低车饔檬怯没С绦
6、蚧虿僮鞯饔煤诵乃峁┑墓δ艿慕涌冢凰韵低车粲玫墓叹褪谴佑没С绦虻较低衬诤耍缓笥只氐接没С绦虻墓蹋辉贚inux中,此过程大体过程可描述如下: 系统调用过程示意图: 整个系统调用进入过程客表示如下:用户程序系统调用总控程序(system_call)各个服务程序 可见,系统调用的进入课分为“用户程序系统调用总控程序”和“系统调用总控程序各个服务程序”两部分;下边将分别对这两个部分进行详细说明:“用户程序系统调用总控程序”的实现:在前面已经说过,Linux的系统调用使用第0x80号中断向量项作为总的
7、入口,也即,系统调用总控程序的入口地址system_call就挂在中断0x80上。也就是说,只要用户程序执行0x80中断(int0x80),就可实现“用户程序系统调用总控程序”的进入;事实上,在Linux中,也是这么做的。只是0x80中断的执行语句int0x80被封装在标准C库中,用户程序只需用标准系统调用函数就可以了,而不需要在用户程序中直接写0x80中断的执行语句int0x80。至于中断的进入的详细过程可参见前面的“中断和中断处理”部分。“系统调用总控程序各个服务程序”的实现:在系统调用总控程序中通过
8、语句“call*SYMBOL_NAME(sys_call_table)(,%eax,4)”来调用各个服务程序(SYMBOL_NAME是定义在/include/linux/linkage.h中的宏:#defineSYMBOL_NAME_LABEL(X)X),可以忽略)。当系统调用总控程序执行到此语句时,eax中的内容即是相应系统调用的编号,此编号即为相应服务程序在系统调用向量表sys_call_table中的编号(关于系统调用的
此文档下载收益归作者所有