Linux添加系统调用
来源:互联网 发布:sql的select语句总结 编辑:程序博客网 时间:2024/05/09 01:44
本文基于Linux 2.4.26内核,GCC 3.2.2添加系统调用mycall(int num)
增加系统调用只修改/usr/src/linux-2.4.29/include/asm-i386/unistd.h和arch/i386/kernel/entry.S,系统调用函数一般在kernel/sys.c中,这里把增加的系统调用代码也加入这个文件中。
1.修改kernel/sys.c文件,加入自己的系统调用代码,同参考文献(见文后地址)中,
asmlinkage int sys_mycalll(int num)
{
printk("This is added by yan/n");
return num;
}
往内核输出一句话,然后返回参数值。asmlinkage表示通过堆栈递参数。
2.然后把sys_mycall(int )的入口地址添加到sys_call_table表中。该表依次存储所有系统调用的入口地址。
修改前为:
.long SYMBOL_NAME(sys_ni_syscall) /* sys_set_tid_address这是第258个系统调用* /
.rept NR_syscalls-(.-sys_call_table)/4
.long SYMBOL_NAME(sys_ni_syscall)
修改后:
.long SYMBOL_NAME(sys_ni_syscall) /* sys_set_tid_address * /
.long SYMBOL_NAME(sys_mycall) /*这是增加的第259个系统调用*/
.rept NR_syscalls-(.-sys_call_table)/4-1 /*这里重复次数减少1*/
.long SYMBOL_NAME(sys_ni_syscall)
3.把增加的sys_call_table表项所对应的向量,在include/asm-i386/unistd.h中进行必要申明,以供用户进程和其他系统进程查询或调用:
#define __NR_exit_group 252
#define __NR_mycall 259 /*这是增加的第259个系统调用*/
然后编译内核make bzImage,并用生成的新内核启动系统。
覆盖原有的内核 cp arch/i386/boot/bzImage /boot/vmlinuz-2.4.26
cp System.map /boot/System.map-2.4.26
4.测试程序(test.c)如下:
- #include <stdio.h>
- #include <asm/unistd.h>
- int errno;
- _syscall1(int,mycall,int,num);//_syscall1表示该系统调用有1个参数,同样_syscall2表示2个调用参数
- int main()
- {
- int i,j;
- printf("Please input a number/n");
- scanf("%d",i);
- j=mycall(i);
- printf("The value returned from the kernel is %d/n",j);
- }
然后执行命令
dmesg | tail
看到输出的内容
This is added by yan
- 添加Linux系统调用
- Linux添加系统调用
- 添加Linux系统调用
- Linux添加系统调用
- Linux添加系统调用
- Linux添加系统调用
- 为linux添加系统调用
- 给linux添加系统调用
- 添加自定义Linux系统调用
- 如何添加linux系统调用
- Linux系统调用的添加
- 为linux添加系统调用
- Linux添加自定义系统调用
- Linux添加自定义系统调用
- linux内核添加系统调用
- Linux内核添加系统调用
- linux内核添加系统调用
- linux内核--添加系统调用
- sqlite复制表
- 数据库连接池解决方法
- myeclipse8.5的优化
- over(partition by cloumn_name)语法
- 在Jdeveloper 11gR2中传递url参数到由task flow构成的区中
- Linux添加系统调用
- 【项目3-友元类】
- 利用C#实现IDisposable接口是一种标准的途径
- CUDA设备的计算能力总览
- FAT32文件系统的FAT表的标志位
- Struts2常用标签总结 简洁版
- UVa 216 - Getting in Line 回溯,简单递归枚举
- PPTP L2TP IPSEC虚拟专用网络
- Linux 内核--任务0的调度切换