空间管理 您的位置: LUPA开源社区 » mic » 日志
Mic 的技术点滴:关于linux, wince 6.0...还有其他牢骚 mic's another world http://www.ootroo.com/zblog

uboot启动的最后几步

上一篇 / 下一篇  2007-12-28 02:21:40 / 个人分类:linux

etGD|j@9o0    为了让kernel顺利启动,uboot在把cpu转让给linux kernel之前,必须作好基本的初始化工作,比如系统时钟,存储等;除此之外,还需要准备一些平台相关的信息,以便内核根据这些信息正确初始化自己. (因为内核往往可以支持多中构架,多种硬件.

HODJ'N9VAJ$g!r0 LUPA开源社区)i7W&Oq-]q#x Ie h(YR,KQ

    因为想用2.6.23,需要了解这些细节的东西.

$b@WVlr[/[0 LUPA开源社区BU`'FM

    在uboot源代码common/cmd_bootm.c中,可以看到函数do_bootm,该函数完成了这些信息准备工作.LUPA开源社区/q}/aH@

LUPA开源社区t7k#v-sdU

call_linux(0,CFG_MACH_ID,CFG_KERNEL_BOOT);
LUPA开源社区 u-OwW4F

LUPA开源社区t'Gn6{tl n5a

    其中CFG_MACH_ID为362,参照kernel/arch/arm/tools/mach-types,该id表示平台是s3c2440; CFG_KERNEL_BOOT为0x30008000,就是kernel的启动地址.LUPA开源社区"?@['~Dc

int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
?d.x5~q%a~:Vl}0 {
:m2i+h H_q p0 .LUPA开源社区$N,XK!`5x[']%D a
.LUPA开源社区;Z+G2l+N6Pn&H o+n
.
0[fC$p9oD2xwr'j0         /* Go Go Go */LUPA开源社区@Bn3Km
        printf("NOW, Booting Linux......\n");
(b[4s M%dBX7S X0         call_linux(0, CFG_MACH_ID, CFG_KERNEL_BOOT);
}LUPA开源社区)M+R v[1s5b/AT4P
LUPA开源社区ZY7Tt(y o
看看call_linux的代码
9ShC-xKas,BaPv0
void  call_linux(long a0, long a1, long a2)
"{ j D,ovU)F\0 {
r0F*m'v$P7F%f0 #if 0LUPA开源社区,Fj;gESV `
    /* to deliver a1 argument, this function is blocked */
!L]6Co |}M:N0         cache_clean_invalidate();LUPA开源社区:x s9Q$K!d"w(|)\k8{dH3@6@
        tlb_invalidate();LUPA开源社区,Wbt$_ }X(sr"S9G
#endifLUPA开源社区AP9TJl+p;l

:B2Uj#J;v5C_c^0 __asm__(LUPA开源社区sZa-|3Q-[a1b
        "mov    r0, %0\n"
]qL%QN2s;X5F@0         "mov    r1, %1\n"LUPA开源社区Z i4i)l;R5CmU3[/p D
        "mov    r2, %2\n"LUPA开源社区 dm.C,vL.z HC8Lg0|
        "mov    ip, #0\n"
!@ |6Jf sQ*R;h0         "mcr    p15, 0, ip, c13, c0, 0\n"       /* zero PID */
^ ~Ks{*l,d6RgU0         "mcr    p15, 0, ip, c7, c7, 0\n"        /* invalidate I,D caches */
Jw,[0{ Y#EwhIh0         "mcr    p15, 0, ip, c7, c10, 4\n"       /* drain write buffer */
_"L^tEq3]a0         "mcr    p15, 0, ip, c8, c7, 0\n"        /* invalidate I,D TLBs */LUPA开源社区7Vt0b2zvE-E}
        "mrc    p15, 0, ip, c1, c0, 0\n"        /* get control register */LUPA开源社区)vSGb YN7EY
        "bic    ip, ip, #0x0001\n"              /* disable MMU */
mHr'vg,l$h0         "mcr    p15, 0, ip, c1, c0, 0\n"        /* write control register */LUPA开源社区+q8c,r p1tg i2w
        "mov    pc, r2\n"LUPA开源社区Z"\:t'aN7P0W1`Y
        "nop\n"
L%C,A#new0         "nop\n"
YL%c3H;L#D0         : /* no outpus */
sm SU1R$EA0         : "r" (a0), "r" (a1), "r" (a2)
xVsn1Z M0         );
Er*Z3V7Or5N!d7gR0 }LUPA开源社区5k-~v.i-zY)g
LUPA开源社区3PL O%A-y$v3` g

P6ybNN#b0
&WlN+]3K6p7e0 r0=0,r1=machine number,r2=0x30008000. 看到一篇文档中讲到r2中的内容应为&(ATAG list),那么难道linux kernel头上就事atag list?LUPA开源社区,_%foV9x k!v

4b7\RvF:J0

TAG: Linux linux

引用 删除 xxx   /   2008-08-28 16:18:23
r0=0,r1=machine number,r2=0x30008000. 看到一篇文档中讲到r2中的内容应为&(ATAG list),那么难道linux kernel头上就事atag list?

kernel image 头上没有atag list, u-boot可以不传递atag,现阶段linux不要求,不过可能以后会要求,没有传递的情况下,在arch/xxx/boot/boot/init.S中会设置一个默认的
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar