天嵌 ARM开发社区

 找回密码
 注册
查看: 2930|回复: 5

u-boot 给内核传递参数的问题。

[复制链接]
summersunboy 发表于 2010-10-5 19:07:43 | 显示全部楼层 |阅读模式
  1. void  call_linux(long a0, long a1, long a2)
  2. {
  3.         local_irq_disable();
  4.         cache_clean_invalidate();
  5.         tlb_invalidate();

  6. __asm__(
  7.         "mov        r0, %0\n"
  8.         "mov        r1, %1\n"
  9.         "mov        r2, %2\n"
  10.         "mov        ip, #0\n"
  11.         "mcr        p15, 0, ip, c13, c0, 0\n"        /* zero PID */
  12.         "mcr        p15, 0, ip, c7, c7, 0\n"        /* invalidate I,D caches */
  13.         "mcr        p15, 0, ip, c7, c10, 4\n"        /* drain write buffer */
  14.         "mcr        p15, 0, ip, c8, c7, 0\n"        /* invalidate I,D TLBs */
  15.         "mrc        p15, 0, ip, c1, c0, 0\n"        /* get control register */
  16.         "bic        ip, ip, #0x0001\n"                /* disable MMU */
  17.         "mcr        p15, 0, ip, c1, c0, 0\n"        /* write control register */
  18.         "mov        pc, r2\n"
  19.         "nop\n"
  20.         "nop\n"
  21.         : /* no outpus */
  22.         : "r" (a0), "r" (a1), "r" (a2)
  23.         : "r0","r1","r2","ip"
  24.         );
  25. }
复制代码
在call_linux中 r2保存的是 linux kernel 的第一条指令的地址
但是linux 的要求是:r1 机器号,r2是参数列表的地址
这地方我感觉不太对?
machoe 发表于 2010-10-6 08:23:18 | 显示全部楼层
有什么不对的吗?
 楼主| summersunboy 发表于 2010-10-6 10:28:30 | 显示全部楼层
内核接受三个参数,第一个为0,第二个为系统的ID号,第三个是传入内核的参数。所以传给内核时
r0 为0           r1 系统的ID号        r2 内核的参数列表
但是在call_linux(0, mach_type, to); 中,  r2存放的是内核要执行的第一条指令的地址。
 楼主| summersunboy 发表于 2010-10-6 10:33:40 | 显示全部楼层
按照我的意思,改的话:
  1. call_linux(0,mach_type,boot_mem_base + LINUX_PARAM_OFFSET,to);
  2. void  call_linux(long a0, long a1, long a2,long a3)
  3. {
  4.     ...
  5.    __asm__(
  6.         "mov        r0, %0\n"
  7.         "mov        r1, %1\n"
  8.         "mov        r2, %2\n"
  9.         "mov        r3, %3\n"
  10.         "mov        ip, #0\n"
  11.         "mcr        p15, 0, ip, c13, c0, 0\n"        /* zero PID */
  12.         "mcr        p15, 0, ip, c7, c7, 0\n"        /* invalidate I,D caches */
  13.         "mcr        p15, 0, ip, c7, c10, 4\n"        /* drain write buffer */
  14.         "mcr        p15, 0, ip, c8, c7, 0\n"        /* invalidate I,D TLBs */
  15.         "mrc        p15, 0, ip, c1, c0, 0\n"        /* get control register */
  16.         "bic         ip, ip, #0x0001\n"                /* disable MMU */
  17.         "mcr        p15, 0, ip, c1, c0, 0\n"        /* write control register */
  18.         "mov        pc, r3\n"
  19.         "nop\n"
  20.         "nop\n"
  21.         : /* no outpus */
  22.         : "r" (a0), "r" (a1), "r" (a2),"r",(a3)
  23.         : "r0","r1","r2","r3","ip"
  24.         );
  25. }
复制代码
就是多加一个参数。我的理解肯定有误,还望版主不吝指教。十分感谢!
machoe 发表于 2010-10-6 13:04:48 | 显示全部楼层
明白你的意思了,你的这个文件是天嵌提供的吧,天嵌的u-boot支持zImage类型的内核文件,而zImage类型的文件解压过程和uImage还有一定的区别,请参考内核的arch/arm/boot/compressed/head.s文件中,有这样一段
  1. call_kernel:        bl        cache_clean_flush
  2.                 bl        cache_off
  3.                 mov        r0, #0                        @ must be zero
  4.                 mov        r1, r7                        @ restore architecture number
  5.                 mov        r2, r8                        @ restore atags pointer
  6.                 mov        pc, r4                        @ call kernel
复制代码
这才是真正的传递参数,而u-boot中的要与之对应,在boot_zImage函数中,有一句:
  1. setup_linux_param(boot_mem_base + LINUX_PARAM_OFFSET);
复制代码
这两个地址要匹配,参数是这样传递的。你说的那种方式是uImage的传递方法,你可以参考u-boot文件cmd_bootm.c:do_bootm函数调用 do_bootm_linux函数-》the kernel这里面的参考和你的是一致的。
 楼主| summersunboy 发表于 2010-10-7 00:42:34 | 显示全部楼层
噢,现在明白了,代码看得还不够深入啊!   谢谢版主!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-18 14:38 , Processed in 1.078125 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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