1.下载linux内核
2.安装一些用于编译内核的依赖包
sudo apt-get update
sudo apt-get install libncurses5-dev openssl libssl-dev
sudo apt-get install build-essential openssl
sudo apt-get install pkg-config
sudo apt-get install libc6-dev
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install libelf-dev
sudo apt-get install zlibc minizip
sudo apt-get install libidn11-dev libidn11
sudo apt-get install dwarves
sudo apt-get install zstd
3. 解压缩新内核
tar -xavf linux-6.9.3.tar.xz -C /usr/src
cd /usr/src/linux-6.9.3
(上文步骤同编译内核的前期准备,下文处起为修改三处函数)
4. 进入新内核开始增加系统调用
·进入新内核目录
cd /usr/src/linux-6.9.3
·编辑系统调用入口表
sudo gedit /usr/src/linux-6.9.3/arch/x86/entry/syscalls/syscall_64.tbl
系统调用入口表分为两段,第一段的系统调用号在300-400以内,第二段从512开始,我们找到第一段的末尾在它后面添加系统调用号和名字
系统调用名为mysyscall
·添加系统调用函数声明
sudo gedit include/linux/syscalls.h
·添加系统调用的函数定义
sudo gedit kernel/sys.c
·编译代码:
printk(“02,邓长辉*202131106030038\n”);
return 0;
###5. 编译内核
cd /usr/src/linux-6.9.3
make mrproper //得到源代码,将其净化
1)将旧内核的配置信息拷贝到当前目录下 并命名为 .config。
cp /boot/'uname -r'-generic ./.config
2)对内核选项进行配置
make menuconfig
选择load->(.config)OK->SAVE->(.config)OK->EXIT
gedit .config
CONFIG_MODULE_SIG_KEY=”cert/signing_key.pen”这个不修改,下面三个全置空。
3)删除配置时留下的一些不用的文件
make clean
4)编译内核
make bzImage -j8
5)编译模块
make modules -j8
6)安装模块
make INSTALL_MOD_STRIPE=1 modules_install
mkinitramfs /lib/modules/6.2.16 -o /boot/initrd.img-6.2.16-generic
7)把内核映像和System.map拷贝到 /boot 下
cp /usr/src/linux-6.9.3/arch/x86 /boot/bzImage /boot/vmlinuz-6.9.3-generic
cp /usr/src/linux-6.9.3/System.map/boot/System.map-6.9.3/boot/grub/grub.cfg
update-grub2
6.重新启动机器后,先查看自己的新内核,然后用一个C文件测试
uname -r
sudo gedit test.c
源代码如下:
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc,char **argv)
{
//462:long sys_mysyscall()
printf("System call sys_mysyscall return %ld\n",syscall(462));
return 0;
}
说明:返回 0 说明执行成功,但是现在没有看到打印信息因为打印信息打在了日志文件中
6.dmesg查看日志文件
dmesg
常见错误
1.make[1]: *** [Makefile:146:sub-make] 错误 2 make: *** [Makefile:24:__sub -make] 错误 2
此处为make menuconfig命令时,控制台窗口过小引起的,当全屏展开后便迎刃而解.
(下同)
如果在终端执行 make menuconfig ,显示错误:
Your display is too small to run Menuconfig!
It must be at least 19 lines by 80 columns.
make[1]: *** [menuconfig] Error 1
make: *** [menuconfig] Error 2
表示终端窗口太小。解决办法可以是把终端窗口适当的调大(或是直接最大化)就行了。
2.常见缺少GTK包
如果我们要在Ubuntu系统下使用基于GTK+3开发的App,那么我们无需安装任何东西,直接双击该App即可使用。
如果我们要安装GTK+3.0进行开发,可使用以下命令:
sudo apt-get install libgtk-3-dev
下载安装完毕之后,我们可以使用以下命令来校验安装是否成功,并且查看GTK+3.0所包含的所有头文件以及库的路径:
pkg-config --cflags --libs gtk+-3.0
3.常见编译好内核重启时,新内核显示内存溢出
我下去查看同学的步骤以及所编译处来的文件大小也有不少和我相同然后到达600M大小的,他们与我的步骤也是相同的,在检查前我也尝试了删除内核再次编译
https://blog.csdn.net/Q1302182594/article/details/51979476
包括我上一次实验编译出来的6.8.7,以及第二次重新编译的6.9.3,唯一出现在我前两次错误尝试的相同点是两次删除内核,后再次修改三处函数时,三个文件都保留了我之前的修改,而非恢复默认状态,我感觉是我两次在进行删除内核的操作时未将引导项删除完全,因为我在使用ls -l -/boot命令时发现系统中还存留着我之前本应删除的6.8.7的几个引导项,因此类比可能是此问题导致的核紊乱,让我进入grub时出现调用内核错误导致内核溢出
此次操作,在删除原先编译的核后,我特别留意使用ls -l /boot命令后系统中是否任留有残留文件,确保无误后再次重新编译,便出现了正确结果