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 —>

06_linux内核编译运行 - 图1

2.3.2 ARM EABI

EABI即是嵌入式应用程序二进制接口,EABI相对于老的应用程序接口,具有更好的系统调用效率,更好的浮点实现,更好的兼容性等等。新的应用程序采用EABI接口是大势所趋
位置:Kernel Features —>

06_linux内核编译运行 - 图2

2.3.3 软浮点支持

s3c2416为arm926jes内核,没有硬浮点,必须配置成软浮点
位置:Floating point emulation —>

06_linux内核编译运行 - 图3

2.3.4 看门狗关闭

关闭看门狗,避免看门狗复位影响测试。
位置:Device Drivers —>

06_linux内核编译运行 - 图4

2.3.5 底层打印支持

支持底层打印,以确定Linux内核的启动情况。
位置:Kernel hacking —>

06_linux内核编译运行 - 图5

注:
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上启动即可。

06_linux内核编译运行 - 图6

图3-1 通过usb下载内核

06_linux内核编译运行 - 图7

图3-2 usb下载内核到内存并启动

06_linux内核编译运行 - 图8

图3-3 从Nand flash启动bootloader以及内核

06_linux内核编译运行 - 图9

图3-4 用户init进程Hello world打印

4、附录

附录为MDK下的s3c2416 Linux启动 bootloader工程,本章所述的根文件系统,Linux内核源码。
mdk下s3c2416 Linux启动bootloader工程以及根文件系统。
https://pan.baidu.com/s/1slczwhJ