瑞芯微Rockchip开发者社区
直播中

YYXIAO

9年用户 1172经验值
擅长:接口/总线/驱动
私信 关注
[问答]

怎样去编译Linux内核呢

怎样去编译Linux内核呢?有哪些编译步骤?

回帖(1)

罗颖

2022-3-3 14:37:18
一、编译内核

1、准备工作

  (1)安装开发包

sudo apt-get install build-essential lzop libncurses5-dev libssl-dev
sudo apt-get install libc6:i386
(2)安装 mkbootimg 工具

git clone
cd rockchip-mkbootimg
make && sudo make install
(3)获取内核源码和安装交叉编译工具链

如果没有下载 SDK,则需要下载内核源码及 Android 的 arm-eabi-4.6 交叉编译工具链。

下载内核源码:

git clone
内核下载之后的内容如下所示:



下载交叉编译工具链,内核编译用到arm-eabi-4.6交叉编译工具链,

下载完成之后创建toolchain目录,并将交叉编译工具链拷贝到此目录下



解压文件

sudo tar -xzvf arm-eabi-4.6.tar.gz  
2、编译内核

(1)编译内核映像

进入内核目录,设置ARCH环境变量,告诉编译器目标平台的架构; 设置交叉编译器。这两步需要一次执行,不然会报错

exportARCH=arm
export CROSS_COMPILE=./../toolchain/arm-eabi-4.6/bin/arm-eabi

在内核源码目录里执行:

载入Firefly RK3288开发板内核配置:

make firefly-rk3288-linux_defconfig
编译

make -j8 firefly-rk3288.img
出现错误:



进入Makefile,修改以下内容:

从中可以看出编译器的路径不正确,修改编译器的路径



修改之后的路径:



重新编译之后,编译成功。

(2)编译内核模块

在内核源码目录里执行:

make modules
mkdir modules_insatll
make INSTALL_MOD_PATH=./modules_install modules_install
内核模块是需要拷到根文件系统中即可:

3、创建 boot.img

(1)创建内存盘

内核启动时会加载内存盘作为初始的根文件系统,再加载实际的根存储设备,最后切换过去。因为开发板使用的是 eMMC 存储,不需要特别的驱动,因此实际上可以跳过此步。但内存盘可以做得非常灵活和强大,例如可以做多系统启动。

git clone
make -C initrd
        initrd中包含了实现这个目标所需要的目录和可执行程序的最小集合,例如将内核模块加载到内核中所使用的 insmod工具。

在桌面或服务器Linux系统中,initrd是一个临时的文件系统。其生存周期很短,只会用作到真实文件系统的一个桥梁。

(2)打包内核和内存盘

将 kernel 和 initrd 打包成 boot.img:

Firefly官方发布的Ubuntu系统都是只有boot分区的,所以要将 kernel 和 initrd 打包成 boot.img,生成boot镜像用到了一个新工具mkbootimg,给mkbootimg增加可执行属性:

sudo mkbootimg --kernel arch/arm/boot/zImage --ramdisk ../initrd.img -o boot.img
产生的boot.img如下所示:



4、修改 parameter 文件

Linux 的根文件系统(RFS)可能在不同的分区或存储设备上(eMMC、TF 卡或 U 盘),所以需要在内核的参数中指定。修改 parameter 文件中的 CMDLINE 行:

5、烧写到设备

选择生成的 boot.img 和修改过的 parameter 文件,分别烧写到"boot" 和 "parameter" 分区,则可完成内核的更新。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分