- 1、本文档共17页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
内核实验报告
实验二
1、实验目的
1.1题目大意
修改system_call()内核函数,使内核能够记录每个系统调用被使用的次数。增加2个系统调用,一个的功能是将这些系统调用的调用次数清零,另一个的功能是返回特定系统调用的调用次数。
1.2实验原理
在Linux中,每一个系统调用被赋予一个系统调用号。内核记录了系统调用表中的所有已经注册过的系统调用的列表,存储在sys_call_table中。它与体系结构有关。在用户空间的程序无法直接执行内核代码,所以应用程序以某种形式通知系统。通知内核的机制是靠软中断的形式实现的,通过引发一个异常来促使系统切换到内核态中去执行异常处理程序。此时的异常处理程序实际上就是系统调用处理程序。X86系统中的软中断由int $0x80指令产生。这条指令会触发一个异常导致系统切换到内核态并执行第128号异常处理程序,而该程序正是系统调用处理程序,叫system_call。它跟体系结构有关,通常用汇编语言在entry.S编写。在X86上,系统调用号是通过eax寄存器传递给内核的。在陷入内核前,用户空间就把相应系统调用所对应的号放入eax,这样系统调用处理程序system_call一旦运行,就可以从eax中得到数据。system_call函数通过将给定的系统调用号与NR_sys_calls——系统中总共有的系统调用的数目做比较,检查其有效性。如果它大于或者等于NR_sys_calls,该函数会返回-ENOSYS。否则,就执行相应的系统调用。由于系统调用表的项是以32位(4字节)类型来存放的,所以内核需要将给业的系统调用号乘以4,然后用所得的结果在该表中查询其位置。我们要统计的是所有系统调用(339个)自系统启动以来每个被调用的次数,所以只需要要构造一个数组来记录每个系统调用的被调用次数。考虑到要让该数组元素每次开机启动时都要初始化为0,我们可以将该数组设置为全局的。每次进入system_call函数都对这个全局数组对应的系统调用号的下标的计数加1.就可以统计系统调用被使用的次数。另外,设计一些系统调用列出所有系统调用或查询某个系统调用的缺页次数以及对变量清零。
1.3 开发工具
平台环境:VMware 7.1.3 ,操作系统:CRUX 2.2,Linux内核版本:2.6.15.6
其它工具:KGDB2.4、 Samba 3.0.24、 Source Insight
2、操作步骤
(1),在/usr/src/linux-2.6.15.6/kernel/sys.c文件中创建一个全局数组,long mycount[NR_syscalls]; NR_syscalls为当前系统总共有的系统调用的数量。
long mycount [NR_sys_calls];
EXPORT_SYMBOL (mycount);
(2),在/usr/src/linux-2.6.15.6/arch/x86/kernel/entry_32.S,在call *sys_call_table(,%eax,4)语句之前,syscall_call:之后,添加如下一行incl mycount(,%eax,4)。
(3),在/usr/src/linux-2.6.15.6/arch/i386/kernel/syscall_table.S 中增加三个系统调用
.long sys_ list_ system_call
.long sys_ show_ system_call
.long sys_ clear _system_call
(4),在/usr/src/linux-2.6.15.6/inculde/asm/unistd.h 定义系统调用号
#define_ NR_list _ system_call 296
#define_ NR_show _ system_call 297
#define_ NR_clear _ system_call 298
最后把NR_syscalls这个宏要相应地改为299。
(5),在/usr/src/linux-2.6.15.6/include/linux/syscalls.h,这个文件里面包含了所有系统调用的声明,在文件最后位置添加三个系统调用的声明:
列出系统中所有的系统调用及其被调用的次数
asmlinkage int sys_ list_ system_call (void)
列出某一个系统调用号对应的系统调用及其被调用的次数
asmlinkage int sys_ show_ system_call (int sys_callno)
对所有系统调用的次数统计变量清零
asmlinkage int sys_ clear_ system_call (void)
(6),在/usr/src/lin
文档评论(0)