添加linux系统调用的两种方式
向linux内核添加系统调用,一是通过编译内核添加,二是通过内核模块的方式添加:
一:编译内核
二: 使用内核模块方式添加简单系统调用
1,为什么要使用内核模块的方式添加系统调用?
- cat /proc/kallsyms | grep sys_call_tables
- #include <linux/init.h>
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/unistd.h>
- #include <asm/uaccess.h>
- #include <linux/sched.h>
- #define my_syscall_num 223
- //如下的这个值要到你机子上查。cat /proc/kallsyms | grep sys_call_table
- #define sys_call_table_adress 0xc1511160
- unsigned int clear_and_return_cr0(void);
- void setback_cr0(unsigned int val);
- asmlinkage long sys_mycall(void);
- int orig_cr0;
- unsigned long *sys_call_table = 0;
- static int (*anything_saved)(void);
- unsigned int clear_and_return_cr0(void)
- {
- unsigned int cr0 = 0;
- unsigned int ret;
- asm("movl %%cr0, %%eax":"=a"(cr0));
- ret = cr0;
- cr0 &= 0xfffeffff;
- asm("movl %%eax, %%cr0"::"a"(cr0));
- return ret;
- }
- void setback_cr0(unsigned int val) //读取val的值到eax寄存器,再将eax寄存器的值放入cr0中
- {
- asm volatile("movl %%eax, %%cr0"::"a"(val));
- }
- static int __init init_addsyscall(void)
- {
- printk("hello, kernel\n");
- sys_call_table = (unsigned long *)sys_call_table_adress;//获取系统调用服务首地址
- anything_saved = (int(*)(void)) (sys_call_table[my_syscall_num]);//保存原始系统调用的地址
- orig_cr0 = clear_and_return_cr0();//设置cr0可更改
- sys_call_table[my_syscall_num] = (unsigned long)&sys_mycall;//更改原始的系统调用服务地址
- setback_cr0(orig_cr0);//设置为原始的只读cr0
- return 0;
- }
- asmlinkage long sys_mycall(void)
- {
- printk("This is my_syscall!\n");
- return current->pid;
- }
- static void __exit exit_addsyscall(void)
- {
- //设置cr0中对sys_call_table的更改权限。
- orig_cr0 = clear_and_return_cr0();//设置cr0可更改
- //恢复原有的中断向量表中的函数指针的值。
- sys_call_table[my_syscall_num] = (unsigned long)anything_saved;
- //恢复原有的cr0的值
- setback_cr0(orig_cr0);
- printk("call exit \n");
- }
- module_init(init_addsyscall);
- module_exit(exit_addsyscall);
- MODULE_LICENSE("GPL");
添加linux系统调用的两种方式相关推荐
- php.ini添加的变量读取,PHP5 在扩展里使用 INI 指令(直接添加和配合全局变量两种方式)...
PHP 扩展开发的文章,我均已更新至<TIPI>(下面的博文可能已经过时,以 TIPI 上的内容为准). 我们的很多配置都是从php.ini里读取的,这个想必大家都非常熟悉了. 什么时候需 ...
- unity添加天空盒的两种方式
添加天空盒有两种方式 1 : 在当前相机上添加skybox 2 : 在当前场景上添加skybox (两种方式的结果是一样的 第一种方式的优势在于 如果 世界中有多个摄像机的话,切换摄像机 ...
- ImGui添加背景图片的两种方式
给ImGui添加背景图片的两种方式 最近在使用ImGui做客户端程序,想给窗口添加背景图片,但是作者的文档里面好像并没有讲如何添加背景图片,研究了下找到了两种方式. 第一种 创建一个和窗口一样大的Im ...
- Linux 安装 jdk ( 两种方式 )
安装jdk有两种方法:手动安装 yum安装. 方式一: yum安装 1.查询要安装jdk的版本, 命令:yum -y list java* 2.安装jdk1.8 yum install -y java ...
- Mysql 添加外键的两种方式
第一种方式:通过创建表的过程中进行添加外键,和其他表的字段进行联系. create table teacher(id int unsigned auto_increment,name varchar( ...
- Linux安装jdk(两种方式)
建设上面的环境第一步肯定是安装jdk,所以和大家一起学一下基本知识centos7.5安装jdk1.8. 安装jdk有两种方法:手动安装 yum安装. yum安装如下: 1.查询要安装jdk的版本: 命 ...
- linux 服务管理两种方式service和systemctl
1.service命令 service命令其实是去/etc/init.d目录下,去执行相关程序 # service命令启动redis脚本 service redis start # 直接启动redis ...
- android按钮添加音效,Android------Button 添加声音效果(两种方式)
我在先前的案例<Android 的底部导航栏 BottomNavigationBar>中添加以底部 的4个按钮切换添加声音 下来看看案例效果图 使用添加依赖 compile 'com.as ...
- jquery 动态添加div元素(两种方式)
方法一: var creatediv= function(){var parentdiv=$('<div></div>'); //创建一个父divparentdiv.attr( ...
最新文章
- Android Dialog 弹出的时候标题栏闪烁一下的处理方法
- oracle中将number类型毫秒值转为时间类型
- 磁盘分区原理:从MBR到GPT
- 计算机必记快捷键,电脑常用的快捷键,记住这些快捷键让你瞬间变成电脑高手...
- java 标识符_java标识符是什么
- Linux中路径的组成部分
- 射频微波芯片设计2:滤波器芯片
- 版本号命名规范及原则
- 解决Navicat 15注册机出现 rsa public key not found
- cad剖切线的快捷键_CAD快捷键记不住怎么办?顶级绘图员教你,从此不求人
- 魔窗--H5网页唤醒APP
- 马云推出的“天猫精灵”到底有多牛? 细思极恐怖
- xshell 免费版本下载
- Android文件读写操作(assets 文件、 raw文件、内部存储文件、外部存储文件)
- 英特尔前任 CEO 安迪·格鲁夫的传奇一生
- java中JAO_JVM内部细节之一:synchronized关键字及实现细节(轻量级锁Lightweight Locking)...
- 数学会对计算机编程的关系
- 超级账本(Hyperledger)
- 华为vr2计算机连接线代替品,分体式设计的VR一体机:独特连接方式让华为VR2眼镜与众不同...
- 深入理解类加载机制:拨开迷雾见真章