您的位置:首页 > 运维架构 > Linux

Ubuntu——Linux4.4.1内核编写新的系统调用

2017-09-01 09:39 323 查看

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[/code] 

将源码包转移到/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                          // 系统调用返回值为0
dmseg | grep "Hello, World!"         // 过滤内核打印出的Hello, World!信息(大小写敏感)




总结

1. 依赖的包

依赖ncurses包和openssl包

sudo apt-get install libncurses5-dev
sudo 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-*                // *代表内核版本
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 内核