linux统计函数调用次数实验,统计linux系统调用的次数

news/2024/7/24 11:28:30 标签: linux统计函数调用次数实验

Linux课程实践的一次作业,主要是统计自开机以来每个系统调用次数的作业。但是苦于对汇编的恐惧,迟迟没有丝毫进展。

现将大致步骤说一下:

我从官网上下载的是2.6.33.4的内核版本,说起内核版本我就上火,教材上用的都是一些很老的版本了,每次进一个文件都要连蒙带猜出它的文件名。要说明的一点是,该实验是在x86平台32位系统上的。

(1)       解压完后进入到arch/x86/kernel目录,进入syscall_table_32.S文件中添加如下至最后一行:

.long sys_mycall

顺便说一下,这个文件是系统的系统调用表,它其实就是一个数组,里面存放了__NR_syscalls个表项(__NR_syscalls定义在arch/x86/include/asm/unistd_32.h里面,表征系统调用的个数,下面会有说明),每个表项在unistd_32.h中都会有一个宏定义。

‘.’表示的是当前的地址,sys_call_table代表数组首地址。以我们准备写的系统调用mycall为例,在系统调用表中的第339个表项是系统调用号为338的mycall()服务例程地址。

syscall_table_32.S这个表的主要作用就是将系统调用号和系统调用的内核服务例程联系在一起。

接着,到arch/x86/include/asm/unistd_32.h里面定义添加的该系统调用号的宏(这里应该就是上面的338),在文件尾添加如下一行:

#define __NR_mycall 338

不过,__NR_syscall这个宏要相应地改为339。

(2)       在系统调用表中创建完一个系统调用号之后,就要实现它所指向的服务例程。在实现这个函数之前,先在相关头文件中声明一下这个函数:

进入include/linux/syscalls.h,这个文件里面包含了所有系统调用的声明,在合适位置添加如下声明:

asmlinkage long sys_mycall(void);

下面便是本次实验的关键点,我们要统计的是所有系统调用(339个)自系统启动以来每个被调用的次数,所以我们很有必要构造一个数组来记录每个系统调用的被调用次数。考虑到要让该数组元素每次开机启动时都要初始化为0,我们可以将该数组设置为全局的。

进kernel/sys.c文件首先创建一个全局数组:

long mycount[400];

接下来便是sys_mycall的具体实现,这个很简单,只要将上面的数组中的每个元素打印出来即可。

long mycount[400];

SYSCALL_DEFINE0(mycall)

{

int i;

for(i = 0; i < __NR_mycall; i++)

{

printk(KERN_INFO "syscall%d: %ldtime(s).\n", i, mycount[i]);

}

return 1;

}

(3)       系统调用的添加工作算是完成了,不过现在还需要的是对上面定义的数组在每次进行系统调用时能够及时更新该数组。那这个就必须得看系统调用过程的汇编代码了:

进入到arch/x86/kernel/entry_32.S

在call *sys_call_table(,%eax,4)语句之前添加如下一行:

incl mycount(,%eax,4)

我记得当时助教还问了我一下这条汇编语句的含义,可能是我当时说的不够清楚,助教貌似不太满意,我这里再说一遍:

incl的意思当然就是对后面的地址内容进行自增操作,然后mycount当然就是数组名啦,括号里面第一个参数没有,表示默认从数组第一项(首地址)算起,具体的地址就是(%eax*4),从这个地址开始的四个字节表示的一个long类型整数自增加一。(现在应该够清楚了吧(*^__^*) 嘻嘻……)。

一切搞定以后,接下来的工作便是make all -> make modules_install -> make install的编译工作了,这不是我们这篇文章的重点。

经过漫长的内核编译的等待,重启之后,写一个测试函数如下:

#include

#include

#define __NR_mycall 338

int main()

{

if(syscall(__NR_mycall))

printf("ok!\n");

else

printf("failed!\n");

return 0;

}

编译运行,以下便是最终的结果(在/var/log/messages日志文件里):

May 17 15:48:39 localhost kernel: syscall 0: 0 time(s)

May 17 15:48:39 localhost kernel: syscall 1: 340 time(s)

May 17 15:48:39 localhost kernel: syscall 2: 0 time(s)

May 17 15:48:39 localhost kernel: syscall 3: 212814 time(s)

May 17 15:48:39 localhost kernel: syscall 4: 0 time(s)

May 17 15:48:39 localhost kernel: syscall 5: 245476 time(s)

May 17 15:48:39 localhost kernel: syscall 6: 225497 time(s)

May 17 15:48:39 localhost kernel: syscall 7: 0 time(s)

May 17 15:48:39 localhost kernel: syscall 8: 0 time(s)

May 17 15:48:39 localhost kernel: syscall 9: 0 time(s)

May 17 15:48:39 localhost kernel: syscall 10: 0 time(s)

只列出了前10个系统调用的调用情况。

Over….


http://www.niftyadmin.cn/n/1346037.html

相关文章

面试的技巧

面试的技巧 博客交流群&#xff1a;1018996617 我在这也说明一下&#xff0c;有同学说之前简历篇的时候一直在说项目的介绍&#xff0c;而面试官真正关心的是技术啊&#xff1f;我在这做个解释&#xff0c;因为我写的这些文章主要针对的是软件测试的同学&#xff0c;所以其他职…

Selenium-WebDriver驱动对照表

Chrome对于chrome浏览器&#xff0c;有时候会有闪退的情况&#xff0c;也许是版本冲突的问题&#xff0c;我们要对照着这个表来对照查看是不是webdriver和chrome版本不对chromedriver版本支持的Chrome版本v2.37v64-66v2.36v63-65v2.35v62-64v2.34v61-63v2.33v60-62v2.32v59-61v…

azure恢复服务linux,Azure站点恢复服务定价 - Azure云计算

在使用 Site Recovery 时&#xff0c;将产生 Site Recovery 许可证、Azure 存储、存储交易和出站数据传输费用。Site Recovery 许可证按每个受保护的实例计数&#xff0c;其中实例为虚拟机或物理服务器。如果将虚拟机磁盘复制到标准存储帐户中&#xff0c;则 Azure 存储针对存储…

linux设置端口80禁止访问,linux iptables 设置仅22、80端口可访问

linux iptables 设置仅22、80端口可访问博客分类&#xff1a;linux防火墙sshiptables【设置仅22、80端口可访问】通过命令 netstat -tnl 可以查看当前服务器打开了哪些端口Ssh代码netstat -tnl查看防火墙设置Ssh代码iptables -L -n开放22、80端口Ssh代码iptables -A INPUT -p t…

移动端自动化测试-Windows-Android-Appium环境搭建

安装建议&#xff1a; Nodejs 12Appium 建议1.15Java 1.8SDK build-tools/ 下对应的版本&#xff0c;需要使用<29的版本第一步:安装JDK 安装JDK&#xff0c;本机如果带有1.7及以上版本的&#xff0c;则可忽略此安装步骤。 JDK的安装包&#xff0c;百度下载即可。安装完成后配…

js之Ajax与跨域

一、Ajax 我们对Ajax一定不会陌生&#xff0c;异步发送请求获取数据&#xff0c;这是我们前端与后台服务器交互的重要的手段&#xff0c;那么对于ajax我们需要了解什么呢&#xff1f; 我们手写一个ajax&#xff0c;这样就能够基本了解使用了ajax了。 1 var xhr new XMLHttpReq…

移动端自动化测试-Mac-IOS-Appium环境搭建

首先&#xff0c;所需安装软件及推荐安装版本&#xff1a; Java 1.8版本Android SDKNode js(>10版本)&#xff0c;npm(>6版本)Python3appium-desktopappium python client 友情提示&#xff1a;安装此环境较为复杂&#xff0c;请保持平和的心态安装~~~ 第一步 安装JDK&am…

linux上类似迅雷的软件,linux下有没有像迅雷或者快车的那种下载软件?

clark_2011 于 2011-04-02 17:17:55发表:学习中&#xff01;teber 于 2011-04-02 11:39:13发表:一直用迅雷&#xff0c;看来下东西还要两个系统来回切了&#xff0c;要是能多台电脑专门装linux就好了~~O(∩_∩)O哈哈~chy505908440 于 2011-03-23 22:36:37发表:淡定dzbhboy 于 2…