Linux作为开源操作系统内核,允许开发者编写自己的系统调用。由于导师要求卤煮编写一个系统调用,卤煮就尝试编写一个小的系统调用了解过程。本文图文记录卤煮实操第一次编写系统调用的过程,如有不足之处,欢迎指点
ps: 此处采用Linux 4.4.1内核,64位系统,对应的文件与2.x和3.x系列有显著差别
系统调用的声明要在条件编译#endif之前
系统调用的实现要在条件编译#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 menuconfigconfig报错:错误原因应当是缺少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安装过程出现问题,检查后发现是系统调用的 编写错误 导致 编译没有通过,重新编写编译后安装成功
编写一个C语言程序,尝试调用新添加的系统调用程序
编译执行 并 使用dmseg命令,查找内核打印的内功
gcc hellotest.c -o hellotest ./hellotest // 系统调用返回值为0 dmseg | grep "Hello, World!" // 过滤内核打印出的Hello, World!信息(大小写敏感)依赖ncurses包和openssl包
sudo apt-get install libncurses5-dev sudo apt-get install libssl-dev试验过程中误操作删除了原有内核的config文件,在下面的路径下找到备份
/boot/config-* // *代表内核版本