Linux开发六
linux内核编译运行
象棋小子 1048272975
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。
2.3.2. ARM EABI
EABI即是嵌入式应用程序二进制接口,EABI相对于老的应用程序接口,具有更好的系统调用效率,更好的浮点实现,更好的兼容性等等。新的应用程序采用EABI接口是大势所趋。
2.3.3. 软浮点支持
s3c2416为arm926jes内核,没有硬浮点,必须配置成软浮点。
2.3.4. 看门狗关闭
关闭看门狗,避免看门狗复位影响测试。
2.3.5. 底层打印支持
支持底层打印,以确定Linux内核的启动情况。
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上启动即可。
图3-1 通过usb下载内核
图3-2 usb下载内核到内存并启动
图3-3 从Nand flash启动bootloader以及内核
图3-4 用户init进程Hello world打印
4. 附录
附录为MDK下的s3c2416 linux启动 bootloader工程,本章所述的根文件系统,linux内核源码。
mdk下s3c2416 linux启动bootloader工程以及根文件系统。
https://pan.baidu.com/s/1slczwhJ