一、引言
系统调用是内核提供给用户应用程序使用的内核函数名,这些函数提供了内核为用户程序所提供的系统服务功能。这些函数在用户应用程序中的书写格式与用户自定义函数形式上没有什么不同,但这些函数的编写和调用过程却与自定义函数有着很大的不同。它们需要事先在内核中安排好入口和函数体,当调用时会引发系统软中断根据对应的存根函数查中断表进入请求的内核函数。
二、实验内容
问题A
分析实现以上系统调用,编写一个测试该系统调用的用户程序。比较该系统调用读取的时间和用gettimeofday()读取的时间的精度。
问题B
编写一个能统计某时间段中缺页中断次数的程序,由于每次缺页都要进入缺页中断函数do_page_fault一次,所以可以认为执行该函数的次数就是缺页发生的次数。可以定义一个全局变量作为缺页计数器,并在do_page_fault函数中每次加1。统计程序可以利用一个能返回缺页计数器和系统时间值的系统调用,在某时间段开始和结束点调用两次系统调用,其差值即为该时间段中产生的缺页中断次数。
三、实验步骤与结果
这里我使用的是ubuntu10.04,Linux内核版本为2.6.32
由于ubuntu10.04已经停止更新支持,不再维护,需要更新源
这里可以参考博客:https://blog.csdn.net/suquan629/article/details/52333769
然后sudo apt-get install linux-source-2.6.32下载Linux源代码
接下来添加新系统调用
在arch/x86/kernel/syscall_table_32.S中添加系统调用函数名
在arch/x86/include/asm/unistd_64.h中添加系统调用号的宏定义
在arch/x86/kernel/sys.c中实现系统调用函数
在mm/memory.c中添加缺页中断号的计数
实现缺页中断统计的系统调用函数
编译安装内核、模块
sudo make –j2 && sudo make install && sudo make modules_install
增加启动项、更新grub
重启进入新内核
可以看到已经更改到新内核 2.6.32.63+drm33.26了
运行测试程序
如有错误请指正