title: 专题一内核编译
categories: -操作系统课程设计
typora-copy-images-to: 专题一内核编译.assets
文章目录
-
作业要求:
完成本专题教学内容中的验收测试题并提交验收材料。
验收材料要求:
新内核引导成功前:
\1. 执行命令:
uname –a
,提交截屏结果1新内核引导成功后:
\2. 执行命令:
uname –a
,提交截屏结果2\3. 进入目录/boot,执行命令:ls -l,提交截屏结果3
-
tips: 在创建虚拟机时,最好分配 50G以上从磁盘空间,四个以上内核
1 [知识点]什么是 Linux 内核
-
操作系统的结构
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2fX9hx9n-1620884870577)(E:\4th_term\OS课设\课题一\专题一.assets\image-20210511210840223.png)]
-
操作系统:Kernel + Shell
-
-
Kernel的组成和功能:
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9G4GCDXL-1620884870579)(E:\4th_term\OS课设\课题一\专题一.assets\image-20210511211233011.png)]
-
Linux 发行版本和内核版本之间的关系:
- 例如教学视频中:Ubuntu10.04 = Kernel2.6.30 + SHELL + USERS APPLICATIONS
- 两者独立
-
本次课程设计我选择的发行版本是
Ubuntu20.04.20
- 其内核版本:用命令
uname -r
5.8.0-50-generic
- 其内核版本:用命令
2 [实验] 从内核源码 到 内核镜像(Kernel Image)
实验准备
当前Linux内核版本为5.8.0-50
从内核版本官网下载另一个内核版本:
- 版本号尾号为偶数的是stable版的,所以我选择
5.12.2
tips: 直接点击屎黄色按钮下载很慢,可以将下载链接复制至自己喜欢的下载软件下载IDM
实验步骤
实验要求: 利用make menuconfig
的配置功能,配置并编译信息中带有自己学号加姓名的内核
1 安装相应的软件包
步骤
-
手动或终端解压
package
-
.deb
离线安装包- 老版本的发行版在线安装比较麻烦
-
sudo bash ./INSTALL.sh
: 执行安装脚本
遇到的问题:相关依赖下载安装
可以先更换国内源
- 在 软件和更新 选择
最佳的服务器
![]()
在执行 INSTALL.sh 时,许多警告,缺少依赖等
- 百度找到 Ubuntu20.04 编译内核所需要的依赖
- 首更新
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install libelf-dev
sudo apt-get install libncurses5-dev libssl-dev
sudo apt-get install build-essential openssl
sudo apt-get install libidn11-dev libidn11
sudo apt-get install zlibc minizip
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install pkg-config
11.sudo apt-get install libssl-dev
2 拷贝源码包至/usr/src
并解压
- 需要用 root 用户权限将源码包拷入标准路径
/usr/src
- 解压命令
sudo tar xfv xxx
- 解压七万多个文件(.c .h文件)
遇到的问题:
需要重新安装VMware tools
- 首先将压缩包移动至 usr/local`
- 然后使用
tar -zxvf xxx
解压- 进入vmware-tools-distrib, 使用
sudo ./vmware-install.pl
命令安装- 手动启动
vmware-user
3 进入源码所在目录
- 按照功能分
- Makefile
4 执行一系列 make 指令
tips: 可以使用多核进行编译
make -j x
: x为核心数,不能超过自己的核心数,省略则使用最多数
- 步骤一:
make menuconfig -j x
- 进入配置菜单
[ ]
: 编译入内核[*]
:可选[M]
: 编译为内核模块
- 必须改:在
General setup
——>Local version
:加入学号加姓名
- 进入配置菜单
遇到的错误:
Your display is too small to run Menuconfig! It must be at least 19 lines by 80 columns. make[1]: *** [scripts/kconfig/Makefile:34:menuconfig] 错误 1 make: *** [Makefile:602:menuconfig] 错误 2
- 第一个问题似乎是终端窗口太小,最大化试试
- 最大化之后再将比例缩小即可
- 步骤二:
make -j x
(x为分配的内核数):.c
编译为.o
- 一到两小时
- 可以用多内核减少一些时间
- 快照:保存当前系统的状态,随时可以恢复载入改状态
- 编译finished后,目录下产生:
vmlinux.o
目标文件和vmlinux
可执行文件
- 一到两小时
make之后报错:
scripts/sign-file.c:25:10: fatal error: openssl/opensslv.h: 没有那个文件或目录 25 | #include <openssl/opensslv.h> | ^~~~~~~~~~~~~~~~~~~~ compilation terminated.
- 解决:
sudo apt-get install libssl-dev
- 应提前安装
- 步骤三:
make modules_install -j x
- 编译为动态链接库
.ko
driver
fs
sound
lib
- 将
.ko
(类似于动态库)移动至标准目录
- 编译为动态链接库
make modules_install报错:
sed: 无法读取 modules.order: 没有那个文件或目录 make: *** [Makefile:1471:_modinst_] 错误 2
- 问题解决:
make[1]: *** 没有规则可制作目标“debian/canonical-certs.pem”由“certs/x509_certificate_list” 需求。 停止。 make: *** [Makefile:1851:certs] 错误 2
- solution :
vi .config
/
搜索CONFIG_SYSTEM_TRUSTED_KEYS
,将里面内容清空
- 步骤四:
make install -j x
- 执行
.sh
脚本:将内核镜像移动至boot
引导目录- 用引导程序将内核镜像引导起来
- 执行完命令后:
- 三个以
学号姓名
为后缀的文件是引导所需要的
- 三个以
- 执行
3 [知识点] GNU make和makefile
什么是 make
make menuconfig
: 用命令行模式配置内核make
: 编译内核和模块make modules_install
: 安装模块- 在
/lib/modules/内核版本
对应的目录下,建立文件夹并把模块文件放入
- 在
make install
: 安装内核- 即拷贝入
/boot
目录下
- 即拷贝入
什么是makefile
- 告诉 make 命令如何去编译
makefile文件保存了 编译器和连接器的参数选项, 还表述了所有源文件之间的关系(源代码文件需要的特定的包含文件,可执行文件要求包含的目标文件模块及库等).
创建程序(make程序) 首先读取makefile文件, 然后再激活编译器,汇编器,资源编译器和连接器以便产生最后的输出, 最后输出并生成的通常是可执行文件.
创建程序利用内置的推理规则来激活编译器,以便通过对特定
CPP
文件的编译来产生特定的OBJ文件.
makefile 规则
target ... :prerequisites ...
recipe
...
...
Makefile demo 使用规则
试读内核源码的Makefile
4 [知识点] 操作系统启动
操作系统 引导过程
- 电脑开机后, 启动 BIOS , BIOS 自检
- 自检后,BIOS 找到硬盘上的主引导记录 MBR
- MBR 读取硬盘分区表 DPT ,找到活动分区中的分区引导记录 PBR,将控制权交给 PBR
- PBR 搜索活动分区中的启动管理器 bootmgr (Linux下是Grub,grub.conf , windows下是),将控制权交给 bootmgr
- bootmgr 寻找 boot 文件夹中的 BCD 文件(启动配置数据)
- 找到 BCD 后,bootmgr 首先从 BCD 中读取启动管理器 bootmgr 菜单信息,在显示器上显示多操作系统选择画面
- 如果存在多个操作系统并且系统设置的等待时间不是0,就会显示多个操作系统。若无,则直接进入
- 进入系统后,bootmgr 会读取 BCD 中win7系统所在的盘的
winload.exe
文件,将控制器交给 - winload.exe 加载win7 内核、硬件、服务等,之后加载桌面等信息,从而启动整个系统
启动管理程序 grub
grub.conf
- 需要改配置正确才能启动
5 [实验] Linux 内核的引导
内核 make install成功后
首先:将内核作为引导,数字改为自己编译的版本号:
sudo update-initramfs -c -k 5.12.2
然后,更新 grub:
sudo update-grub
之后,修改 grub文件:
sudo vi /etc/default/grub
然后,执行sudo update-grub
最后重启,选择advanced,选择编译好的内核