omapl138移植uboot系列之启动TI官方移植的Linux内核(启动内核第一篇)

时间:2024-03-19 10:16:48

 启动TI官方移植的Linux内核

和编译uboot一样,Linux内核的编译也是三板斧,首先修改Makefile中的ARCH和CROSS_COMPILE,然后找到你要编译的板卡执行make xx_defconfig配置,最后执行make menuconfig进行检查并修改,三板斧操作完就可以直接make编译啦!

我们还是和移植uboot一样,先编译TI 移植过的omapl138开发板的内核镜像,并试着在639A板卡上启动该内核镜像,以验证uboot是否能成功启动内核,然后根据639A板卡的特性,修改Linux内核。

3.1.1 关于Linux内核镜像

linux内核经过编译后也会生成一个elf格式的可执行程序,叫vmlinux或vmlinuz,这个就是原始的未经任何处理加工的原版内核elf文件;嵌入式系统部署时烧录的一般不是这个vmlinuz/vmlinux,而是要用objcopy工具去制作成烧录镜像格式,经过制作加工成烧录镜像的文件就叫Image(制作把几十兆大的精简成了几兆,因此这个制作烧录镜像主要目的就是缩减大小,节省磁盘)。

原则上Image就可以直接被烧录到Flash上进行启动执行,但是实际上并不是这么简单。实际上linux的作者们觉得Image还是太大了所以对Image进行了压缩,并且在image压缩后的文件的前端附加了一部分解压缩代码。构成了一个压缩格式的镜像就叫zImage。

uboot为了启动linux内核,还发明了一种内核格式叫uImage。uImage是由zImage加工得到的,uboot中有一个工具,可以将zImage加工生成uImage。注意:uImage不关linux内核的事,linux内核只管生成zImage即可,然后uboot中的mkimage工具再去由zImage加工生成uImage来给uboot启动。这个加工过程其实就是在zImage前面加上64字节的uImage的头信息即可。

我们选择uImage作为内核镜像。

3.1.2 编译内核

1. 修改Makefile

omapl138移植uboot系列之启动TI官方移植的Linux内核(启动内核第一篇) 2. make tisdk_omapl138-lcdk_defconfig 配置

3. make 编译内核

4. make uImage LOADADDR=0xc0008000生成kernel的uImage镜像

3.1.3 加载uImage镜像

    uboot要启动内核,分为2个步骤:第一步是将内核镜像从启动介质中加载到DDR中,第二步是去DDR中启动内核镜像。(uboot一定要将内核镜像加载至内核链接地址处,否则有可能出错)

    启动时各种镜像都在SPI Flash中,因此uboot只需要从SPI Flash的kernel分区去读取内核镜像到DDR中即可。读取要使用uboot的命令来读取,读取命令前面已经提过了,正是uboot用于访问SPIFlash的sf命令集,使用命令:sf read c0008000 kernel(知道为什么要在uboot中添加mtd分区了吧?)。

    uboot还支持远程启动,也就是内核镜像不烧录到SPIFlash中,而是放在主机的服务器中,然后需要启动时uboot通过网络从服务器中下载镜像到板卡DDR中,而且这种方式很适合调试内核和应用程序,uImage镜像大小在2M左右,调试阶段将其一遍又一遍的烧录到SPIFlash是很费时间和芯片寿命的,使用tftp加载的方式很大程度上省去了这种不必要的麻烦,遗憾的是我们的639A板卡上并无网卡,因此强大的tftp加载我们是使用不了了。网口没有咱还有串口啊!咱可是串口打天下啊!接下来我们就通过串口将内核镜像加载到DDR,虽然比不上网口的速度,但这也是没有办法的事啊!

    为了加快串口加载内核镜像的速率,在加载之前,我先将串口控制台的波特率设置为460800,uboot命令行下执行

omapl138移植uboot系列之启动TI官方移植的Linux内核(启动内核第一篇)

    然后将我们的超级终端串口波特率设置为460800后,继续输入命令

omapl138移植uboot系列之启动TI官方移植的Linux内核(启动内核第一篇)

    还是通过使用我们前面所用过的Kermit协议,完成uImage至DDR的加载。

omapl138移植uboot系列之启动TI官方移植的Linux内核(启动内核第一篇)

    加载完成后,我们再将串口控制台波特率重新设置为115200。

 

注:实践证明,将控制台波特率设置为460800后,超级终端可能会出现乱码,这是422转接头的原因,换一个好点的422转接头即可。

omapl138移植uboot系列之启动TI官方移植的Linux内核(启动内核第一篇)

3.1.4 bootm启动内核

经过前面的操作我们已经将uImage镜像加载到DDR它的链接地址处了,接下来我们将从DDR启动内核,这就不得不使用uboot的“bootm”命令。

uboot命令行下输入命名 bootm c0008000,启动内核。

omapl138移植uboot系列之启动TI官方移植的Linux内核(启动内核第一篇)

由uboot打印信息可以看出linux内核镜像加载成功了,但是内核好像并没有启动,uboot最后一条打印信息“Starting Kernel”,表明uboot的使命已经完成了,接下来我们从内核的角度去解决这个问题。