Linux是一个非商业化的产品,任何人都可以获得源代码并研究它。这吸引了很多开发者对其代码进行修改和完善,因此变得越来越流行。从小到手表,大到超级计算机集群,都可以看到Linux的身影。笔者此处就Linux内核的编译以及运行作一个简单的介绍。
1、 bootloader
由于不同的cpu具有不同启动方式,所以Linux内核并不支持自启动,而是交由专门的一段代码进行处理,这段上电最先运行的代码被称为bootloader。bootloader一般具有下载固化以及加载运行这两个最基本的功能。对于arm架构的cpu,通常采用uboot作为bootloader,笔者此处针对s3c2416在MDK环境下实现一个简单的bootloader,该bootloader支持通过usb下载运行Linux内核,以加快调试开发。
2、Linux内核编译
可以从Linux内核官网 http://www.kernel.org 直接下载各个版本的Linux内核源码,此处我们采用4.10.10这个最新稳定版本的内核。
Linux内核支持目前市面上绝大部分处理器架构,如x86、arm、mips。跟架构相关的部分通常由相应的社区进行维护,所以想使用某款最新架构的cpu,想尽可能发挥其性能,使用其中最新的某些特性,往往需要采用最新的Linux内核。
解压Linux源码包,较新版本的Linux内核已经完整支持s3c2416了,所以我们可以无需改动任何的代码就可以让Linux内核运行在我们的s3c2416平台上。Linux是一个高度可配置的内核,需要先配置,然后再编译,这一过程需要注意以下几点:
2.1 修改主目录Makefile
Makefile默认获取得是主机的架构以及编译环境,我们的内核是要运行在arm平台上,所以修改:
ARCH=arm, CROSS_COMPILE=arm-linux-
2.2 拷贝配置文件
我们基于s3c2410的配置文件进行配置,把 arch->arm->configs 文件夹中的s3c2410_defconfig拷贝到主目录,并命名成 .config 。
2.3 内核配置
执行:
make menuconfig
进行Linux内核的配置。几个比较重要的配置如下:
2.3.1 Initramfs文件系统的支持
Linux内核启动到最后,会从根文件系统去加载执行第一个用户进程,从而把系统从内核空间转到用户空间。如果没有根文件系统或者没有可执行的用户进程,内核会直接panic。关于根文件系统的构建前面章节有简单的介绍,此处不再深入讨论,采用initramfs,用户程序实现每秒打印一次Helloworld。
位置:General setup —>
2.3.2 ARM EABI
EABI即是嵌入式应用程序二进制接口,EABI相对于老的应用程序接口,具有更好的系统调用效率,更好的浮点实现,更好的兼容性等等。新的应用程序采用EABI接口是大势所趋。
位置:Kernel Features —>
2.3.3 软浮点支持
s3c2416为arm926jes内核,没有硬浮点,必须配置成软浮点。
位置:Floating point emulation —>
2.3.4 看门狗关闭
关闭看门狗,避免看门狗复位影响测试。
位置:Device Drivers —>
2.3.5 底层打印支持
支持底层打印,以确定Linux内核的启动情况。
位置:Kernel hacking —>
注:
low-level 底层
2.4 编译
执行:
make
进行编译,成功后会在 arch->arm->boot 目录下生成 Image 非压缩内核以及 zImage 压缩内核。
3、Linux内核运行
用sdboot工具把MDK编译出来的bootloader进行格式转换并下载进sd卡,设置板从sd卡启动,按住“空格键”上电,bootloader进入下载模式,选择3通过usb下载内核到ram并启动,在DNW工具提示USB:OK后,选择USBPort->Transmits,发送相应的Linux内核可执行文件Image/zImage。该方法直接下载内核进ram并启动,适用于内核调试开发。
在sd卡中创建一个image目录,把bootloader的Nand flash烧录版本二进制代码(未经过sdboot工具转换)命名成bootloader.bin,把Linux内核可执行文件zImage命名成kernel.bin,放入image目录,用来实现更新Nand flash上的bootloader以及内核代码。在bootloader下载模式选择6即可从sd卡更新bootloader以及内核到Nand flash,以后从Nand flash上启动即可。
4、附录
附录为MDK下的s3c2416 Linux启动 bootloader工程,本章所述的根文件系统,Linux内核源码。
mdk下s3c2416 Linux启动bootloader工程以及根文件系统。
https://pan.baidu.com/s/1slczwhJ