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)
Linux之增加系统调用[内核编译]的更多相关文章
- Linux 2.6的内核编译过程
由于上课需要,老师指定使用linux-2.6.26内核.本人是菜鸟级别的. 由于本人安装的ubuntu系统中,没有自带GCC,故需要自己安装gcc, 首先启用ROOT权限 输入:sudo -i 获取 ...
- Lab1:Linux内核编译及添加系统调用(详细版)
实验一:Linux内核编译及添加系统调用(HDU) 花了一上午的时间来写这个,良心制作,发现自己刚学的时候没有找到很详细的,就是泛泛的说了下细节地方也没有,于是自己写了这个,有点长,如果你认真的看完了 ...
- linux内核增加系统调用--Beginner‘s guide
Linux内核中设置了一组用于实现系统功能的子程序,称为系统调用.系统调用和普通库函数调用非常相似明知是系统调用由操作系统核心提供,运行于核心态,而普通的函数调用由函数库或用户自己提供,运行于用户态. ...
- linux内核增加系统调用--Beginner's guide
Linux内核中设置了一组用于实现系统功能的子程序,称为系统调用.系统调用和普通库函数调用非常相似明知是系统调用由操作系统核心提供,运行于核心态,而普通的函数调用由函数库或用户自己提供,运行于用户态. ...
- 【原创】Linux 增加系统调用
Linux 增加系统调用大致步骤: 1.下载好内核文件,在内核源文件中添加好自己的调用函数. 2.编译内核 3.验证. 一.在内核源文件中增加自己的函数 首先将内核文件移至/usr/src/下并解 ...
- linux 驱动模块 内核编译环境
目录(?)[+] Linux设备驱动Hello World程序介绍 如何编写一个简单的linux内核模块和设备驱动程序.我将学习到如何在内核模式下以三种不同的方式来打印hello world,这三种方 ...
- Linux 增加系统调用 (转)
Linux 增加系统调用大致步骤: 1.下载好内核文件,在内核源文件中添加好自己的调用函数. 2.编译内核 3.验证. 一.在内核源文件中增加自己的函数 首先将内核文件移至/usr/src/下并解压. ...
- [转载]Linux内核编译
原文地址:https://blog.csdn.net/qq_34247099/article/details/50949720 写在前面的话: 本人大二,东南大学一个软工狗,正在修一门名为<操作 ...
- linux内核编译相关
参考:http://www.arm.linux.org.uk/docs/kerncomp.php 一. 内核编译1) linux 2.4make clean/make mrpropermake dep ...
随机推荐
- Kafka史上最详细原理总结
https://blog.csdn.net/ychenfeng/article/details/74980531 Kafka Kafka是最初由Linkedin公司开发,是一个分布式.支持分区的(pa ...
- A1002. A+B for Polynomials
This time, you are supposed to find A+B where A and B are two polynomials. Input Each input file con ...
- B1016. 部分A+B
正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA.例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6. 现给定A.DA.B.DB,请编 ...
- 马士兵2string buffuer
string不可变的字符序列 s1=s1+s2
- E212: Can't open file for writing
意思是不能保存. 原因是权限不够,普通用户用vi 进行不了保存,需要使用超级用户才可以 命令:sudo su 转换成超级用户 vi hello 打开文件 :wq 即可保存退出
- keepalived+LVS实现网站负载均衡和HA
如上图所示,102和103是内网nginx服务器,100和101是边界LB,clinet是1,这个实验是为了实现在LB上虚拟出一个VIP,client通过访问该VIP,来动态负载到两台内网nginx服 ...
- loopback(回环)
Loopback接口是一个虚拟网络接口,在不同的领域,其含义也大不一样. 1. TCP/IP协议栈中的loopback接口 在TCP/IP中回环设备是一个通过软件实现的虚拟网络接口,它不与任何硬件相 ...
- ESXI6时间源快速同步
1.使用SSH会话连接到ESXi主机. 2./etc/ntp.conf 在文本编辑器中打开 添加内天tos maxdist 303.运行此命令以访问 likewise shell /usr/lib/v ...
- JAVA核心技术I---JAVA基础知识(集合set)
一:集合了解 (一)确定性,互异性,无序性 确定性:对任意对象都能判定其是否属于某一个集合 互异性:集合内每个元素都是无差异的,注意是内容差异 无序性:集合内的顺序无关 (二)集合接口HashSet, ...
- Kafka权威指南 读书笔记之(三)Kafka 生产者一一向 Kafka 写入数据
不管是把 Kafka 作为消息队列.消息总线还是数据存储平台来使用 ,总是需要有一个可以往 Kafka 写入数据的生产者和一个从 Kafka 读取数据的消费者,或者一个兼具两种角色的应用程序. 开发者 ...