【学习记录】从0开始的Linux学习之旅——编译linux内核
一、学习背景
从接触嵌入式至今,除了安装过双系统接触了一丢丢linux外,linux在我眼中向来是个传说。而如今得到了一块树莓派,于是决心把linux搞起来。
二、概念学习
Linux操作系统通常是基于Linux内核,并结合GNU项目中的工具和应用程序而成。Linux操作系统支持多用户、多任务和多线程,具有强大的网络功能和良好的兼容性。
Kernel,也就是Linux的内核,它负责管理系统的硬件资源、提供基本的系统功能,并作为用户空间和硬件之间的桥梁。包括资源管理、设备驱动、系统调度、文件系统管理、网络支持等功能,所以它属于宏内核。与之对应的微内核则是只管好中断、调度等一些简单功能。
U-Boot(Universal Boot Loader)实际上就是一种引导加载程序(bootloader)。引导加载程序是用于引导计算机系统启动的软件,它负责在系统上电后初始化硬件、加载操作系统内核到内存中并启动它。因此,U-Boot就是一种特定类型的引导加载程序,主要用于嵌入式系统中。
三、准备工作
- 系统准备
- 安装VMware,这里安装的是17.0 Pro版本,注册码网上搜的。
- 到ubuntu官网下载一个ubuntu桌面系统镜像,这里下载的是22.04版本。
- 在VMware里新建一个虚拟机,安装刚下载的ubuntu系统,这里安装的是英文版。
- 环境准备
- 安装git,方便下载一些开源的代码。
- 安装vim,虽然系统自带的vi也可以编辑文档,但vim看起来舒服一点。
- 安装vscode,方便查看linux内核那大量代码。
四、内核编译
首先输入以下指令更新下当前软件包。
sudo apt update
获取内核版本号,为了确认内核版本号一致。
sudo cat /proc/version
接着查看当前linux可下载的内核版本有哪些,下载与当前系统版本相同的内核版本源码。
sudo apt-cache search linux-source
这里我们选择6.2.0。
sudo apt-get install linux-source-6.2.0
进入内核源码对应的文件夹。
cd /usr/src/linux-source-6.2.0
解压源码。
sudo tar xvf linux-source-6.2.0.tar.bz2
进入解压后的文件夹。
cd linux-source-6.2.0
配置内核。
sudo make menuconfig
报了个错,查了下,是少了个ncurses设备驱动。
执行以下命令安装ncurses。
sudo apt-get install ncurses-dev
继续报错,那就继续处理,查了下是缺少flex。
那就执行下面命令安装flex。
sudo apt-get install flex
继续报错,根据上面的报错信息,应该也是装个bison就可以。
sudo apt-get install bison
装完就可以进入配置页面了,直接退出,不需要修改设置。
接下来直接编译内核。
sudo make -j8
继续疯狂报错,还是一样,一个个问题逐个击破。
第一个"fatal error: libelf.h: No such file or directory"是缺少一个libelf包,安装一下。
sudo apt-get install libelf-dev
第二个"fatal error: openssl/opensslv.h:no such file or directory",同理,是缺少一个libssl包,安排上。
sudo apt-get install libssl-dev
继续往下翻,连续三个都是缺少gelf.h,查了下,同样是因为缺少libelf包引起的,那就不用重复安装了。
装完上面两个包,重新编译,继续报错。
查了下,需要修改配置文件,找到把“CONFIG_SYSTEM_TRUSTED_KEYS”,把后面的debian/canonical-certs.pem去掉,研究了下,这个是debian系统的一些认证功能,可以去掉。
CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem"
CONFIG_SYSTEM_TRUSTED_KEYS=""
直接查文件有点难顶,翻到一万多行才翻到。
删掉后重新编译,等一个小时以上(具体多长时间不知道,编译了一个小时还没完就睡觉去了),终于通过了。
五、相关链接
【学习记录】从0开始的Linux学习之旅——驱动模块编译与加载