您的位置:首页 > 运维架构 > Linux

Linux中自定义系统调用

2013-10-25 20:27 225 查看
一. 实验目的

系统调用是内核提供给用户应用程序使用的内核函数名,这些函数提供了内核为用户应用程序所提供的系统服务功能。这些函数在用户应用程序中的书写格式与用户自定义函数形式上没有什么不同,但这些函数的编写和调用过程却与自定义函数有着很大的不同。它们需要事先在内核中安排好入口和函数体,当调用时会引发系统软中断根据对应的存根函数查中断表进入请求的内核函数。

二. 实验问题

1、实现一个系统调用,获取系统时间

2、编写一个测试该系统调用的用户程序

三.实验内容

1.下载内核linux-2.6.36.1,并解压在/usr/src里面。

2.添加用户自定义系统调用入口。

  (1)在/usr/src/linux-2.6.36.1/arch/x86/kernel/syscall_table32.S中,添加新的系统调用函数名,要求声明的格式为:

       .long sys_系统调用函数名

       例如:

.long sys_mySyscall

 

  (2)在/usr/src/linux_2.6.36.1/arch/x86/include/asm/unistd中在其中添加新的系统调用号的宏定义,要求声明的格式为:

         #define _NR_ 系统调用函数名 系统调用最后一个编号

例如:

#define _NR_mySyscall 333

 

(3)在usr/src/linux_2.6.36.1/kernel/sys.中添加自己的系统调用函数代码,如下:

     

#include<stdio.h>
#include<sys/time.h>
asmlinkage void mysyscall(void )
{
struct Rtc_time now;
__get_rtc_time(&now);
printk(“%d/%d/%d,%d:%d:%d\n”,now.tm_year+1900,now.tm_mon+1,now.tm_mday,now.tm_hour,now.tm_min,now.tm_sec);
//printk并不是在终端输出,而是在buffers里写入信息,在显示时要先dmesg –c清除buffers里的信息,在运行后输入dmesg指令才能显示函数的内容
}


3 .接下来就是对内核进行编译安装,首先在终端打开/usr/src/linux-2.6.36.1,输入命令make localmodconfig命令,配置内核,选项默认即可。

4. 接着输入make对内核进行编译,这要费一段时间。

5. 再输入make modules_install安装内核模块。

6. 最后make install 安装内核,安装好后,重启进入安装后的内核。

7. 编写测试程序进行测试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 内核 系统调用