2022-03-28 09:11:39 +08:00
|
|
|
|
# 8.4 内核的配置和编译
|
2022-03-29 22:36:47 +08:00
|
|
|
|
|
2022-03-30 22:19:39 +08:00
|
|
|
|
## 内核编译和配置的基本方法
|
|
|
|
|
|
2022-03-29 22:36:47 +08:00
|
|
|
|
获取 Linux 内核源码的途径有很多,可以直接从 <www.kernel.org> 下载,或者来自于 BSP 厂商提供的软件包。
|
|
|
|
|
|
2022-03-30 22:19:39 +08:00
|
|
|
|
内核源码解压后,需要经过配置才能够编译,期间比较常用的命令如下:
|
2022-03-29 22:36:47 +08:00
|
|
|
|
|
|
|
|
|
```bash
|
2022-03-30 22:19:39 +08:00
|
|
|
|
# 加载 defconfig 生成 .config
|
|
|
|
|
make ARCH=<arch> <defconfig>
|
2022-03-29 22:36:47 +08:00
|
|
|
|
# 进入内核配置页面
|
|
|
|
|
make menuconfig
|
|
|
|
|
# 指定 LOCALVERSION 并以 n 个进程进行编译。
|
|
|
|
|
make LOCALVERSION="" -j<n>
|
2022-03-30 22:19:39 +08:00
|
|
|
|
# 编译内核模块
|
|
|
|
|
make modules
|
|
|
|
|
# 将内核模块安装到指定目录下。
|
2022-03-29 22:36:47 +08:00
|
|
|
|
make modules_install INSTALL_MOD_PATH=<target dir>
|
|
|
|
|
# 生成设备树文件。
|
|
|
|
|
make dtbs
|
|
|
|
|
# 清除之前编译的可执行文件及配置文件。
|
|
|
|
|
make clean
|
2022-05-13 15:00:49 +08:00
|
|
|
|
# 类似 make clean,但同时也将 configure 生成的文件全部删除掉,包括 Makefile。
|
2022-03-29 22:36:47 +08:00
|
|
|
|
make distclean
|
|
|
|
|
```
|
|
|
|
|
|
2022-03-30 22:19:39 +08:00
|
|
|
|
习惯上使用 menuconfig 来配置内核,其界面通常如下所示:
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
在该界面下,可使用方向键/Tab键进行导航,使用 Enter 键进行确认,使用空格键切换选项配置,有三种选项值,含义如下:
|
|
|
|
|
|
|
|
|
|
* N:不将该功能编译进内核
|
|
|
|
|
* Y:将该功能编译进内核
|
|
|
|
|
* M:将该功能编译成内核模块
|
|
|
|
|
|
|
|
|
|
如果不清楚某个配置在哪个菜单下,则可以使用“/”键进行搜索,搜索到结果后直接按对应序号即可进入该菜单。
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
还有一些隐藏配置,在 menuconfig 中无法进行配置,此时可在 .config 中直接修改,或修改对应的 defconfig 文件,而 .config 即为内核编译时所使用的最终配置,这是一个临时文件,任何修改配置或加载 defconfig 的行为都可能修改该文件,因此若需要将配置持久化,则必须修改对应的 defconfig 文件。可以通过 .config 生成 defconfig 文件,方法如下:
|
2022-03-29 22:36:47 +08:00
|
|
|
|
|
|
|
|
|
```bash
|
2022-03-30 22:19:39 +08:00
|
|
|
|
# 通过 .config 生成 ./defconfig
|
|
|
|
|
make ARCH=<arch> savedefconfig
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### General setup
|
|
|
|
|
|
|
|
|
|
通用配置菜单,包含了 swap 内存配置、各子系统配置、日志缓存大小等设置。
|
|
|
|
|
|
|
|
|
|
### Device Drivers
|
|
|
|
|
|
|
|
|
|
各总线驱动和设备驱动的配置菜单,如 SPI、I2C、设备树、固件、USB、MMC/SD/SDIO、ADC、加速度计、DMA、DMABUF、以太网 PHY 芯片驱动等。
|
|
|
|
|
|
|
|
|
|
如果开发的驱动需要集成到内核,则应该将其配置添加到该菜单的子目录下。
|
|
|
|
|
|
|
|
|
|
### File systems
|
|
|
|
|
|
|
|
|
|
文件系统配置菜单,调整内核所支持的文件系统类型,如:Ext4、NFS、VFAT、NTFS 等。
|
|
|
|
|
|
|
|
|
|
## i2som PanGuBoard 的内核编译
|
|
|
|
|
|
|
|
|
|
湃兔核的 PanGuBoard 是一款以 STM32MP157 SOC 为核心的开发板,下面以该开发板为例来演示内核的编译过程。在 [官方 Wiki](https://i2som.atlassian.net/wiki/spaces/PanGuBoard/overview?homepageId=389251083) 中可以获得该开发板的详细信息和资料,包括开发工具包和内核源码等。
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# 安装开发工具链
|
2022-03-29 22:36:47 +08:00
|
|
|
|
chmod a+x i2som-image-weston-openstlinux-weston-pangu-x86_64-toolchain-2.6-snapshot.sh
|
|
|
|
|
./i2som-image-weston-openstlinux-weston-pangu-x86_64-toolchain-2.6-snapshot.sh
|
2022-03-30 22:19:39 +08:00
|
|
|
|
# 配置编译环境
|
2022-03-29 22:36:47 +08:00
|
|
|
|
source /opt/st/pangu/2.6-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-openstlinux_weston-linux-gnueabi
|
|
|
|
|
|
2022-03-30 22:19:39 +08:00
|
|
|
|
# 解压内核源码
|
2022-03-29 22:36:47 +08:00
|
|
|
|
tar -xvf linux-st-44c0cc69.tar.gz
|
|
|
|
|
cd linux-st
|
2022-03-30 22:19:39 +08:00
|
|
|
|
# 加载 PanGuBoard 的内核配置
|
2022-03-29 22:36:47 +08:00
|
|
|
|
make i2som_panguboard_defconfig
|
2022-03-30 22:19:39 +08:00
|
|
|
|
# 编译内核镜像
|
2022-03-29 22:36:47 +08:00
|
|
|
|
make uImage LOADADDR=0xC2000040 -j<n>
|
2022-03-30 22:19:39 +08:00
|
|
|
|
# 生成 DeviceTree
|
2022-03-29 22:36:47 +08:00
|
|
|
|
make dtbs
|
2022-03-30 22:19:39 +08:00
|
|
|
|
# 生成内核模块
|
|
|
|
|
make modules
|
|
|
|
|
# 将内核模块打包至 ./mods 目录下
|
|
|
|
|
make modules_install INSTALL_MOD_PATH=./mods
|
2022-03-29 22:36:47 +08:00
|
|
|
|
```
|
|
|
|
|
|
2022-03-30 22:19:39 +08:00
|
|
|
|
在源码根目录下将生成 vmlinux 内核镜像文件:
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
其他类型的内核镜像在 arch/arm/boot/ 目录下
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
DTB 文件在 arch/arm/boot/dts 下生成:
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
内核模块在 mods 目录下:
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
2022-03-29 22:36:47 +08:00
|
|
|
|
### 参考链接
|
|
|
|
|
|
|
|
|
|
* [配置开发环境](https://i2som.atlassian.net/wiki/spaces/PanGuBoard/pages/389251162)
|
|
|
|
|
* [Linux 编译](https://i2som.atlassian.net/wiki/spaces/PanGuBoard/pages/389251165/Linux)
|