一、编译内核
1、准备工作
(1)安装开发包
sudo apt-get install build-essential lzop libncurses5-dev libssl-dev
sudo apt-get install libc6:i386
(2)安装 mkbootimg 工具
git clone https://github.com/neo-technologies/rockchip-mkbootimg.git
cd rockchip-mkbootimg
make && sudo make install
(3)获取内核源码和安装交叉编译工具链
如果没有下载 SDK,则需要下载内核源码及 Android 的 arm-eabi-4.6 交叉编译工具链。
下载内核源码:
git clone https://bitbucket.org/T-Firefly/firefly-rk3288-kernel.git
内核下载之后的内容如下所示:
下载交叉编译工具链,内核编译用到arm-eabi-4.6交叉编译工具链,下载链接为:
http://pan.baidu.com/s/1sl7v1EX
下载完成之后创建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 https://github.com/TeeFirefly/initrd.git
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" 分区,则可完成内核的更新。
参考资料:
https://jingyan.baidu.com/article/ff42efa9d39efec19e2202ad.html
https://jingyan.baidu.com/article/359911f5b8af4f57fe0306dc.html