社区导航

 

搜索
查看: 408|回复: 1

[经验] UBOOT引导Linux内核及向内核传递参数的方式

[复制链接]

9

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2019-7-25 19:34 | 显示全部楼层 |阅读模式

     一直以来没有想过有什么好的办法通过寄存器向内核传递参数,直到今天读UBOOT的实现方式。

  在UBOOT中,引导内核最常用的方法是bootm命令,bootm命令可以引导“UBOOT格式”的内核。先花点时间了解下什么是“UBOOT格式”的内核吧:用UBOOT自带的mkimage命令生成的内核称为"UBOOT"格式的内核。以下面这条命令为例:mkimage -n "Kernel 2.4.18" -A arm -O linux -T kernel -C none -a 30007fc0 -e 30008000 -d 4020.bin vmlinux-2.4.18.img    其中与内核引导最密切的是-e 30008000,也就是内核的入口地址。其它参数可以参考帮助信息。其它UBOOT格式的内核与原来相比,只是进行(可选)了压缩,并在前面加了一个0x40大小的头。这个头里放了内核的位置(0x30007fc0)和入口地址(0x30008000)和其它信息。

  bootm命令执行时,先对头部信息等进行校验,然后把头信息放到一个结构里面。最后根据内核类型调用相应的启动函数。对于Linux而言就是do_bootm_linux,在启动函数里面,有这么一个操作:theKernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep);,这是最关键的一个操作,将内核的入口地址0x30008000赋给了theKernel,在启动函数的最后,使用theKernel (0, bd->bi_arch_number, bd->bi_boot_params)[1];启动内核

  根据传参规范,三个变量分别用r0,r1,r2传给内核,这样就巧妙地利用了函数指针进行了参数传递,实在是精妙!

 

 备注: [1]  传给 Kernel 的参数= (struct tag *) 型的 bd->bi_boot_params  

 


回复

使用道具 举报

5935

TA的帖子

19

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2019-8-10 18:26 | 显示全部楼层

谢谢分享


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-1-29 03:51 , Processed in 0.121174 second(s), 18 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表