Ubuntu——Linux4.4.1内核编写新的系统调用
来源:互联网 发布:网络在线时钟 编辑:程序博客网 时间:2024/06/06 11:19
Ubuntu——Linux4.4.1内核编写新的系统调用
Linux作为开源操作系统内核,允许开发者编写自己的系统调用。由于导师要求卤煮编写一个系统调用,卤煮就尝试编写一个小的系统调用了解过程。本文图文记录卤煮实操第一次编写系统调用的过程,如有不足之处,欢迎指点
ps: 此处采用Linux 4.4.1内核,64位系统,对应的文件与2.x和3.x系列有显著差别
1. 前期准备
下载linux内核源码
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.4.1.tar.gz
将源码包转移到/usr/src目录下(sudo权限)
sudo mv linux-4.4.1.tar.gz /usr/src
解压缩
tar -xzvf linux-4.4.1.tar.gz
2. 相关文件
系统 调用表 文件,在此添加系统调用和系统调用号的映射关系
linux-4.4.1/arch/x86/entry/syscalls/syscall_64.tbl
系统调用 声明 文件,在此添加系统调用函数声明
linux-4.4.1/include/linux/syscalls.h
系统调用 具体实现 文件,在此编写对应的系统调用函数
linux-4.4.1/kernel/sys.c
3. 具体操作
⑴ 修改 系统调用表 文件:syscall_64.tbl
⑵ 修改 系统调用声明 文件: syscalls.h
系统调用的声明要在条件编译#endif之前
⑶ 修改 系统调用实现 文件: sys.c
系统调用的实现要在条件编译#ifdef CONFIG_COMPAT之前
⑷ 配置
拷贝.config文件:首先,需要将原本内核中的配置文件.config拷贝到当前内核源码中。
查看当前Linux内核版本:
cat /proc/version
到指定内核文件下复制.config文件:
sudo mv linux-headers-4.4.0-93-generic/.config linux-4.4.1/
开启配置界面:
sudo make menuconfig
config报错:错误原因应当是缺少ncurses组件
安装ncurses组件:
sudo apt-get install libncurses5-dev
开启配置界面:
使用原内核的配置:
配置过程:Load–>OK–>Save–>OK–>Exit–>Exit
使用默认内核配置:直接Exit–>Yes保存即可
⑸ 编译
① 编译启动镜像
sudo make -j8 bzImage // -j8表示8线程加速
错误1:
信息提示缺少opensslv.h,安装对应的libssl-dev包
sudo apt-get install libssl-dev
错误2:
错误2为系统调用编写错误,修订编写后,重新编译
若编译失败需要删除已编译文件重新编译
sudo make mrproper // 清楚编译过程中产生的中间文件,清除完成后需从make menuconfig开始重新进行
编译成功
② 编译模块
sudo make -j8 modules // -j8表示8线程加速
PS:编译过程需要注意,编译出错不会停止编译,建议将输出重定向到文件,方便检查编译错误。错误编译将导致无法安装。
重定向输出命令:make -j8 bzImage >& bzImage.log
⑹ 重新安装
① 安装模块
sudo make modules_install
② 安装内核
sudo make install
安装过程出现问题,检查后发现是系统调用的 编写错误 导致 编译没有通过,重新编写编译后安装成功
⑺ 修改引导
sudo update-grub2 // 本机双系统使用grub2引导,开机引导在Ubuntu高级选项中,可选内核
⑻ 编写用户态验证程序
编写一个C语言程序,尝试调用新添加的系统调用程序
编译执行 并 使用dmseg命令,查找内核打印的内功
gcc hellotest.c -o hellotest./hellotest // 系统调用返回值为0dmseg | grep "Hello, World!" // 过滤内核打印出的Hello, World!信息(大小写敏感)
总结
1. 依赖的包
依赖ncurses包和openssl包
sudo apt-get install libncurses5-devsudo apt-get install libssl-dev
2. 系统调用相关文件
linux-4.4.1/arch/x86/entry/syscalls/syscall_64.tbl //系统调用表linux-4.4.1/include/linux/syscalls.h //系统调用声明linux-4.4.1/kernel/sys.c //系统调用实现linux-4.4.1/arch/x86/include/asm/syscall.h //有些博客上在此声明系统调用,卤煮实验编译过程中的确可以找到这里的声明,但具体是否成功尚未可知,看客可以补充
3. 其他
试验过程中误操作删除了原有内核的config文件,在下面的路径下找到备份
/boot/config-* // *代表内核版本
- Ubuntu——Linux4.4.1内核编写新的系统调用
- Linux编写新的系统调用(内核版本3.2.18)
- 添加新的Linux内核系统调用
- ubuntu 12.10 x64 下编译新内核 + 系统调用方法
- 驱动模块的编写##向内核添加系统调用函数
- 向linux内核中添加新的系统调用
- 为arm linux内核添加新的系统调用
- Ubuntu内核编译教程-编译Linux4.5.0内核
- Ubuntu安装新的内核
- cp命令的编写——浅谈系统调用
- 向linux内核添加系统调用新老内核比较
- linux内核——系统调用
- 操作系统—系统调用与内核
- 内核模式的dll编写与调用
- 调用内核hlist编写的测试代码
- 在Ubuntu上为Android系统编写Linux内核驱动程序(学习老罗的)
- 在Ubuntu上为Android系统编写Linux内核驱动程序--实践中碰到的问题
- 在Ubuntu上为Android系统编写Linux内核驱动程序(学习老罗的)
- scala提取器详解
- 【opencv】基于opencv实现运动目标检测之帧差法
- 我自己的云主机的服务启动(每次重启)
- 数据库SQLite 数据大量存储 和快速读取 链表查询的优化 使用gosn
- linux一些基础命令
- Ubuntu——Linux4.4.1内核编写新的系统调用
- linux shell if -a 到-z参数含义
- Sony Vegas Pro 14.0下载 v14.0.0.244简体中文版
- 关于android项目编译不通过,类名爆红的问题
- STL(十二)multiset多重集合容器
- 还是A+B
- 解决WIN10系统下PL2303_USB转串口驱动兼容性问题
- Linux下安装anaconda
- JSP、servlet、SQL之间的数据传递