Linux之增加系统调用[内核编译]
声明:如需引用或者摘抄本博文源码或者其文章的,请在显著处注明,来源于本博文/作者,以示尊重劳动成果,助力开源精神。也欢迎大家一起探讨,交流,以共同进步~ 0.0
由于操作系统实验的缘故,有一个实验需要在Linux内核中增加自定义的系统调用函数,经过摸爬滚打,查资料,爬坑之后,终于成功了(其实,总体来说还是比较顺利~)
增加自定义系统调用函数的过程/原理:
1.在syscalls.h头文件增加新增函数的声明;
2.在syscalls.h头文件增加新增函数的函数实现代码块;
3.在unistd_64.h(Ubuntu 3.2.x版本)或者syscall_64.tbl中新增(注册)系统调用号和新增函数名的声明;将内核源码编译完成,加入boot引导中;重启,在C测试函数中调用即可。
备注:系统调用头文件:<linux/kernel.h>;<sys/syscall.h>;<unistd.h>
1.题目
1.1 下载一个新的 Linux 内核,并在其中加入一个新的系统调用,系统调用实现的功能:计算一个数字的三次方。
1.2 用编译内核的方法,将其加入内核源码并编译、使用新的内核。
1.3 编写测试程序测试该系统调用。
2.实验说明
环境:Ubuntu 16.04
内核版本:4.4.4(由于编译4.4.0版本中途失败,所以最后切换为4.4.4版本,但编译失败前的步骤的截图均采用4.4.0的版本)
3.实验过程
3.1 安装软体linux-source,下载linux内核源码
#方式一:自定义下载,各种版本任你挑~https://cdn.kernel.org/pub/linux/kernel/
# 1.1 手动下载下来
#1.2 wget下载辅助工具,下载下来后,压缩包将会在命令行所处的当前文件夹目录下
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/<linux kernel version.tar.xxxxxx> #方式二:安装linux-source软体包,下载下来后,内核压缩包将在/usr/src下
sudo apt-get install linux-source #用在线包管理器安装下载linux内核压缩包
#如果要查看/切换到压缩包所处目录:ls/cd /usr/src
3.2 切换到Linux内核文件夹主目录
cd /usr/src/linux-source-4.4.0
3.3 解压内核
3.4 修改sys.c库文件,增加系统调用函数
3.5 查看syscalls.h,并在系统调用头文件中新增调用函数声明
3.6 在syscaal_b4.tbl文件中增加系统调用号
3.7 配置编译,并开始编译(此步骤发生错误,故不提示命令行语句)
3.8 经查阅,此错误的原因是:
ubuntu下缺少了部分组件libssl-dev,安装一下即可
sudo apt-get install libssl-dev
3.9 上述问题解决,切换到待编译的Linux内核的主目录下,开始配置编译:
sudo make makeconfig #配置编译文件,无需做任何改动,exit即可
sudo make clean(清除刚配置过程中生成的文件)
3.10 (再次)开始编译
sudo make -j8(四核八线程,充分利用CPU,否则要编译三四个小时)
sudo make modules_install
sudo make install
3.11 重启(重启后,进入GRUB选择界面,选择Ubuntu下边的高级选项,里面会显示已经编译好的内核版本,选择它启动即可),测试新增的系统调用
【test.c】gcc test.c -o test.out
#include<stdio.h>
#include<linux/kernel.h>
#include<sys/syscall.h>
#include<unistd.h> int main(){
//printf("pow3(3):%d", (int)pow3(3));//error
//printf("sys_ln1(3)%d:", (int)sys_ln1(3));//error
printf("syscall(326, 3):%d\n", (int)syscall(326, 3));
return 0;
}
Congratulations!
参考文献:
【Linux添加系统调用总结】(http://blog.csdn.net/sinat_28750977/article/details/50837996)
最新文章
- Codevs 2370 小机房的树 LCA 树上倍增
- SlipHover,能感知鼠标方向的图片遮罩效果jQuery插件
- Mahout 的安装
- mac下配置openfire
- Xcode7.x中安装Alcatraz
- yousa_team团队项目 兼职平台 完成展示
- 常用的正则表达式(例如:匹配中文、匹配html)(转载)
- 【CocoaPods】CocoaPods基本安装教程
- jsp页面写入中文到mysql时出现了乱码(转)
- .net 文件下载方法
- QT5.3无法自动调用incomingConnection函数的问题
- selenium之多线程启动grid分布式测试框架封装(一)
- 非常不错的MySQL优化的8条经验
- [ Java面试题 ]算法篇
- 第二个项目:WC
- FTP 代理服务器实现
- Swagger2基本注解使用
- bpmn.js &; BPMN diagram
- 交换机的vlan文章
- vuejs点滴