参考说明
本贴主要参考了:
https://blog.youkuaiyun.com/weibo1230123/article/details/82716763
https://www.cnblogs.com/wanyuanchun/p/4048359.html
实验目的
学习linux内核的编译,期望掌握内核编译方法后,通过对内核代码的修改来学习linux内核。
工具、系统、源码准备
一、在使用的虚拟机版本号如下:VMware® Workstation 15 Pro 15.5.1 build-15018445,有点老古董了,哈哈
二、linux版本使用的是:ubuntu-10.10-desktop-i386.iso ,内核版本是 2.6.35
三、重新编译内核,在 http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/ 下载了 linux-2.6.36.tar.gz 源码
内核编译
以上是准备工作,下面是操作步骤
1、创建虚拟机,安装 ubuntu-10.10-desktop-i386.iso
2、使用sudo su 切换到root用户,mv linux-2.6.36.tar.gz /usr/src,目的是把下载的内核源代码文件移到/usr/src目录
3、cd到/usr/src目录,解压源代码 tar zxvf linux-2.6.36.tar.gz,目的是解压内核包,生成的源代码放在linux-2.6.36目录下
4、cd linux-2.6.36 后,cp /boot/config-2.6.35-22-generic .config 目的是拷贝一份原有的config,改名为.config
5、配置内核,有几种方法(实际上我没有配置)
#make menuconfig //基于ncurse库编制的图形工具界面
#make config //基于文本命令行工具,不推荐使用
#make xconfig //基于X11图形工具界面
#make gconfig //基于gtk+的图形工具界面
6、在linux-2.6.36目录,编译内核,命令为 make,或者 make -j4
7、在linux-2.6.36目录,编译和安装内核模块,命令为 make modules_install
8、在linux-2.6.36目录,安装内核,命令为 make install
9、在linux-2.6.36目录,sudo mkinitramfs -o /boot/initrd.img-2.6.36
10、在linux-2.6.36目录,sudo update-initramfs -c -k 2.6.36
11、在linux-2.6.36目录,sudo update-grub2 //自动修改系统引导配置,产生grub.cfg启动文件。
这个改的是 /boot/grub/grub.cfg , 系统会自动搜索 img 文件,并更新 grub.cfg 文件
12、reboot
启动OK后,查看版本号 uname -a,可以看到内核是新编译的,说明实验成功了
内核修改(增加系统调用)
编译内核的目的还是期望能够自己修改内核,典型的实验是添加系统调用,下面是添加系统调用的步骤,主要参考 https://www.cnblogs.com/wanyuanchun/p/4048359.html
1、修改源码 /usr/src/linux-2.6.36/arch/x86/include/asm/unistd_32.h 中增加系统调用
#define __NR_mycall 341
#define __NR_mycallext 342
同时要把
#define NR_syscalls 修改为343
3、在 /arch/x86/kernel/syscall_table_32.S 中添加系统调用表项
4、在 /usr/src/linux-2.6.36/kernel/sys.c 中增加了实现,输出信息到printk
5、编写包含系统调用的程序,执行后,dmesg 进行查看
编写调用新增的系统调用的用户态可执行程序
#include <stdio.h>
int main()
{
syscall(341, 1);
syscall(342, 1);
return 0;
}
gcc -g -O2 -o syscallext syscallext.c