一、目标
修改并安装内核,添加一个系统调用,在内核日志中输出字符串。
二、版本清单
这次实验在win10环境里的ubuntu虚拟机进行。
-
虚拟机版本:VMware Workstation 16
-
ubuntu版本:ubuntu 14.04 分配硬盘要有40G
-
内核版本:linux-4.9.229.tar.gz
-
安装ubuntu能典型安装就典型安装出问题再换办法看下面这个-
不行就重新典型安装
-
三、具体实施
0. 把内核linux-4.9.229.tar.gz移动到 /usr/src 目录下
1. 在虚拟机外下载好文件后把文件拖到Downloads目录下(或者复制然后右键Paste)
报错就选最右边的Retry
然后按Ctrl+Alt+t 调出终端
移动文件到/usr/src目录下
//初始化root用户
# sudo passwd root
//切换root用户
# su root
//移动文件
# sudo mv /home/r8/Downloads/linux-4.9.229.tar.gz /usr/src
1.工具下载和前期准备工作
-
初始化root用户
# sudo passwd root
-
切换root用户
# su root
-
切换内核所在目录
/usr/src
-
解压内核文件
-
# gzip -d linux-4.9.229.tar.gz
-
# tar -xvf linux-4.9.229.tar
-
-
安装工具:
-
安装图形化界面所需工具:
# sudo apt-get install libncurses5-dev
-
安装后续编译内核所需工具:
-
安装这个全Y就行# sudo apt-get install aptitude
-
# sudo aptitude install libssl-dev
-
注意:安装libssl-dev的时候,会询问3次,依次按下 N, Y ,Y
-
按了N之后就没有第二第三次 就重新装 按Y即可
-
-
-
-
2.配置内核
-
进入解压好的linux-4.9.229目录
/usr/src/linux-4.9.229
-
指定硬件体系架构:
# export ARCH=x86
-
配置board config:
# make x86_64_defconfig
-
打开内核配置页面进行如下配置:
# make menuconfig
General setup --->
----> [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
Device Drivers --->
[*] Block devices --->
<*> RAM block device support
(65536) Default RAM disk size (kbytes)
make menuconfig 时可以将General setup -> Local version - append ... 修改成新的名称,如 “myKernel”。这样后续编译好的内核名字就是myKernel
https://www.bilibili.com/video/BV1Wk4y1m7vy
这里可以参考这个视频进行配置,在第一集12分钟左右开始。空格操作选择,回车操作进入。上述内容均参考该视频操作。
3.添加系统调用
添加系统调用操作均参考这篇文章:如何给linux添加一个系统调用_linux添加系统调用_带上一无所知的我的博客-CSDN博客
-
使用gedit操作sys.c文件加入函数
# sudo gedit /usr/src/linux-4.9.229/kernel/sys.c
-
在末尾添加
asmlinkage long sys_helloworld(void) {
printk("hello world!");
return 1;
}
-
添加函数声明
打开函数声明文件:
# sudo gedit /usr/src/linux-4.9.229/arch/x86/include/asm/syscalls.h
插入声明:
asmlinkage long sys_helloworld(void);
-
添加系统调用id
打开文件:
# sudo gedit /usr/src/linux-4.9.229/arch/x86/entry/syscalls/syscall_64.tbl
-
添加一行内容:
332 64 helloworld sys_helloworld
4.编译安装内核
-
进入目录:
cd /usr/src/linux-4.9.229
-
删除之前编译所生成的文件和配置文件:(第一次编译可以不做 不然会把配置删除
# sudo make mrproper
-
检查是否生成依赖(dependency)信息并清除旧的编译结果:(第一次编译可以不做 不然会把配置删除 要重新make menuconfig
# sudo make clean
-
编译二进制内核映像文件:
# make bzImage -j2
ps:编译线程越多,速度越快,我这里是2核。大概用25分钟
-
进行模块的编译和安装(用时都比较久):
-
# sudo make modules
-
# sudo make modules_install
-
-
进行内核安装:
# sudo make install
5.重启虚拟机
重启后点击鼠标进入ubuntu并且迅速长按shift,进入内核选择界面<br />
选择你的内核并进入系统
6.验证
新建文件输入如下代码
#include <stdio.h>
#include<linux/kernel.h>
#include<sys/syscall.h>
#include<unistd.h>
int main()
{
long int a = syscall(333);
printf("System call sys_helloworld return %ld\n", a);
return 0;
}
编译:# sudo gcc -o hello hello.c
运行:# ./hello
打开另一个终端查看内核日志:# dmesg | tail -4
到这一步就结束了 ,恭喜你完成了 ✺◟(∗❛ัᴗ❛ั∗)◞✺
本文参考:如何给linux添加一个系统调用_linux添加系统调用_带上一无所知的我的博客-CSDN博客https://www.bilibili.com/video/BV1Wk4y1m7vy从源码编译linux-4.9内核并运行一个最小的busybox文件系统(最新整理版) - 哔哩哔哩