*************** 看前须知 ***********
1.本文仅仅是西电软件工程OS实验课的教程,原则上只接受关于本实验相关的问题
2.代码原则上仅仅作为参考,如果被查出因为抄袭而导致不良的后果,本人不负任何责任。
3.文章中的代码是经过整合而得到的,如有侵权,请及时联系
4.关于实验系统 本人使用的是Ubuntu 20.04 linux内核最低5.4.x vmware 15.x
5.接上条,如果你按照了这个配置还是出现了问题,那么可以at我
6.本教程已经更新了专题一需要加学号的问题,由于两个专题步骤差不多,所以写到一起,大家看的时候注意就行了!
========================================================
$ 0.99
本文参考自 https://blog.youkuaiyun.com/BAR_WORKSHOP/article/details/111647568 侵权必删
在专题一中学习完了之后,你发现其实这里有你始终过不去的坎,那就是专题二你还得要编译内核,所以我知道一开始偷懒还是得要还的
然后你们又来白嫖我了…那我T某就继续当工具人给你们写教程好了…
$$ 0.999
内核版本 :5.11.19
$ 1.0 准备工作
由于已经有上述博主的先列,我们直接按照他的教程来比较好
1.1 手动换源
sudo gedit /etc/apt/sources.list
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
这里我的做法是,直接把这一段复制到了最上面的位置
ps # 代表注释
我添加到了 第4行之后
之后那自然就是更新一下源咯
sudo apt-get update && sudo apt-get upgrade
1.2 下载内核依赖
先进入root 模式
sudo su
然后再一条一条复制下载这些(当然你可以把这些写个.sh 然后bash 之后去喝茶)
sudo apt-get install libc6-dev -y
sudo apt-get install libelf-dev -y
sudo apt-get install libncurses5-dev libssl-dev -y
sudo apt-get install build-essential openssl -y
sudo apt-get install libidn11-dev libidn11 -y
sudo apt-get install zlibc minizip -y
sudo apt-get install bison -y
sudo apt-get install flex -y
sudo apt-get install pkg-config -y
这几个依赖你都得下载(不要问我哪个依赖是干嘛的,我一个写web后端的,我哪知道啊…)
如果全部安装成功 那么基本上没啥问题了
这里我引用原博主的原话
这一步比较容易出问题,我在做的时候遇到了各种依赖无法安装的报错,如果您第一步更换源听从了我的建议,这里应该一遍过,会少走很多弯路。
当然 我运气比较好,没出现什么问题,如果有问题欢迎去原博主的地方看看
(其实是我比较lowbee,,,,懒得一个一个瞎折腾了)
1.3 下载内核源码
请先去kernel 官网下载 内核源码
https://www.kernel.org/
我下的是5.11.19
然后暴力拖进虚拟机(其实你可以在虚拟机里面下载(其实你可以上梯子下载))
注意不要拖到桌面(桌面好像不让拖,点开文件夹拖到合适的地方就行)
然后 切换 到root 把文件解压到/usr/src目录下
sudo su
tar -xavf linux-5.11.19.tar.xz -C /usr/src
(如果你下不到5.11.19了,那把关于这个linux的版本号改成你的就行了(之后的一样))
1.4添加自定义系统调用
cd /usr/src/linux-5.11.19
- 之后都在 /usr/src/linux-linux-5.11.19 这个文件下操作
打开自定义系统调用号的syscall_64.tbl文件,在里面添加自定义的系统调用
sudo gedit arch/x86/entry/syscalls/syscall_64.tbl
我解释一下 这里442是我们新增的系统调用 mysyscall 和 sys_mysyscall 是调用表之间的映射
442必须放在441的后面,不然GG
1.5 添加函数声明和定义
- 添加函数声明
sudo gedit include/linux/syscalls.h
记得 这个得在#endif之前加
- 打开 sys.c 文件
sudo gedit kernel/sys.c
- 添加 调用函数 (在末尾 #endif之前)
SYSCALL_DEFINE1(mysyscall,long long,number)
{
long ge,shi,bai,qian,wan,shiwan;
if(number % 2 == 1 )
{
ge = number % 10 ;
number = number / 10;
shi = number % 10 ;
number = number / 10;
bai = number % 10 ;
number = number / 10;
qian = number % 10 ;
number = number / 10;
wan = number % 10 ;
return wan * 10000 + qian *1000 + bai *100 +shi *10 +ge;
}else{
ge = number % 10 ;
number = number / 10;
shi = number % 10 ;
number = number / 10;
bai = number % 10 ;
number = number / 10;
qian = number % 10 ;
number = number / 10;
wan = number % 10 ;
number = number / 10;
shiwan = number % 10 ;
return shiwan*100000 + wan * 10000 + qian *1000 + bai *100 +shi *10 +ge;
}
}
!!!!! 不要问我这个函数为什么写的这么lowbee,我哪想啊,还不是为了开荒写的,而且讲真其实应该返回应该是 char* 但是这个函数只能返回long ,我tm有啥办法???
而且内核里面不让用for,老师那道题给出的int 和long 根本就放不进去,我尼玛当时编译内核从早到晚编译了一天。十几次(错了就得重来(wdnmd)),这个才写出来 讲真linux谁太深了,我这种lowbee真的太垃圾了(wqnmlgb)(老子这一辈子不会再去写内核(真香))
1.6 内核编译
先说好,如果你按照以上老老实实的做了 ,那应该是没啥问题… 不然哪怕错了一步,都得重来,重来就是一个小时
- 净化内核
sudo make mrproper
这条命令会删除所有的编译生成文件、内核配置文件和各种备份文件
sudo make clean
这条命令会删除前一次编译过程中残留的数据
- 配置文件,不需要改什么的话直接Exit
sudo make menuconfig
直接exit就行,啥也别改
然后要把.config里面一个地方改了,不然GG
sudo gedit .config
这个地方原来有个 debian/balabala 什么东西 把那个全部清了 不然GG
================================================
关于加学号的问题,现在在这里更新
由于加学号仅仅涉及到改Makefile文件,最终都还得编译的!
sudo gedit Makefile
改这就行了 记得保存 之后也不需要改grub了(之后他会自动换的!) 一切运行完了之后uname -a 就行了!
- 编译内核,j后面的数字是分配的核心数,根据自己得情况来给定
- 我的是 2 *6 =12
sudo make -j12
我这边大概一次40多分钟 ,我有个室友竟然跑到了2个h,所以安心等待
哦 如果你这个时候打游戏,你的cpu直接跑满,是不是很刺激
(当然你可以加电压超频)
- 重置内核
sudo make modules_install
sudo make install
这两部很快,如果出现了和专题1一样的结果 那基本上没啥问题了
直接 reboot(重启)
如果出问题了 不妨 sudo make module 看看错到哪了
1.6 测试代码
随便一个位置(我是桌面)
sudo gedit test.c
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc,char **argv)
{
//441:long sys_mysyscall(int)
long long temp;
scanf("%lld",&temp);
long fuck ;
fuck = syscall(442,temp);
printf("mysyscall return %ld\n",fuck);
return 0;
}
- 然后编译
gcc -o test test.c
- 运行
./test
这里我给出测试结果