添加linux系统调用的两种方式
原文:https://blog.csdn.net/sdulibh/article/details/51889279
向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系统调用的两种方式的更多相关文章
- Mac Item2 SSH免密登录Linux 服务器的两种方式
转自http://blog.csdn.net/jobschen/article/details/52823980 mac ssh登录linux服务器 的两种方式: 个人推荐第二种,zsh方式,只需要把 ...
- Linux 服务管理两种方式service和systemctl
Linux 服务管理两种方式service和systemctl 1.service命令 service命令其实是去/etc/init.d目录下,去执行相关程序 # service命令启动redis脚本 ...
- 不停mysql服务添加从库的两种方式
现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. ...
- Linux安装jdk(两种方式)
最近在研究大数据方面的东西,业务场景是从设备采集数据经过处理然后存放DB. 建设上面的环境第一步肯定是安装jdk,所以和大家一起学一下基本知识centos7.5安装jdk1.8. 安装jdk有两种方法 ...
- Linux内核分析-两种方式使用同一个系统调用
实验部分 根据系统调用表,选取一个系统调用.我选得是mkdir这个系统调用,其系统调用号为39,即0x27 由于mkdir函数的原型为 int mkdir (const char *filename, ...
- Android------Button 添加声音效果(两种方式)
我在先前的案例<Android 的底部导航栏 BottomNavigationBar>中添加以底部 的4个按钮切换添加声音 下来看看案例效果图 使用添加依赖 compile 'com.as ...
- iOS UIWebview添加请求头的两种方式
1.在UIWebviewDelegate的方法中拦截request,设置request的请求头,废话不多说看代码: - (BOOL)webView:(UIWebView *)webView shoul ...
- linux 安装mysql两种方式
yum -y install gcc gcc-c++ ncurses-devel cmake bison zlib zlib-devel libxml openssl dtrace ...
- Android Studio添加aar依赖的两种方式
1 android{ repositories { flatDir { dirs 'libs' } } } dependencies { implementation fileTree(include ...
随机推荐
- EasyUI Form提交后json数据IE上需要下载(转)
EasyUI Form提交后json数据IE上需要下载(转) 在使用EasyUI的form中的submit方法时,返回json在IE中变成提示下载的问题,代码如下: $('#fileForm'). ...
- EasyUI datagrid columns 中 field 区分大小写
columns: [ [ {field: 'id', title: 'ID'}, {field: 'name', title: 'NAME'}, {field: 'DT_CRT_TM', title: ...
- 用OpenGL实现动态的立体时钟
(在学期末做的图形学课程设计,特将学习心得整理如下) 一.设计思路 1,设计一个平面的时钟: 按照 钟面——>中心点——>刻度——>时针——>分针——>秒针 的顺序绘制. ...
- Linux Ubuntu 能PING IP但不能PING主机域名的解决方法
------------------------------------------------------------------------------- vi /etc/nsswitch.con ...
- 开源分布式日志系统ExceptionLess部署杂乱笔记 加密
前两天看到了这篇文章,亲身体会了下,确实不错,按照官方的文档试了试本地部署,折腾一番后终于成功,记下心得在此,不敢独享. 本地部署官方wiki .NET 4.6.1 这个因为我装了VS2015,就没有 ...
- 基于Java的数据采集(二)
在上一篇文章<基于Java的数据采集(一)>:http://www.cnblogs.com/lichenwei/p/3904715.html 提到了如何如何读取网页源代码,并通过group ...
- nginx负载均衡二:配置
配置方法一(可用): upstream tomcatserver1 { server ; server 192.168.70.172; server 192.168.70.173 down; serv ...
- 硬件信息 dmidecode dmesg lsdev lshw haparm lsusb
dmidecode 显示从BIOS中获取的硬件信息 dmesg 检测到的硬件和启动的消息 lsdev 显示关于安装硬件信息 cat /proc/devices 显示当前核心配置的设备 haparm - ...
- [原]OpenGL基础教程(一)多边形绘制
1.opengl开发环境搭建 参考http://brothergrup.iteye.com/blog/1602471 2.为三角形填充颜色: 填充颜色函数为glColor(3/4)*(r,g,b) ...
- [Node.js] 03 - Buffer, Stream and File IO
fs 模块,视频教学 os 模块,视频教学,api doc Buffer类 创建 Buffer 类 // 创建一个长度为 10.且用 0 填充的 Buffer. const buf1 = Buffer ...