Board logo

标题: Android arm Linux Kernel启动流程(5) [打印本页]

作者: yuyang911220    时间: 2015-1-24 16:34     标题: Android arm Linux Kernel启动流程(5)

然后就是重定位了,即都加上一个偏移,经过重定位以后就都是绝对地址了。
not_relocated:  mov r0, #0
1:      str r0, [r2], #4        @ clear bss
        str r0, [r2], #4
        str r0, [r2], #4
        str r0, [r2], #4
        cmp r2, r3
        blo 1b
        /*
         * The C runtime environment should now be setup
         * sufficiently.  Turn the cache on, set up some
         * pointers, and start decompressing.
         */
        bl  cache_on
重定位完成以后打开cache,具体这个打开cache的过程咱没仔细研究过,大致过程是先从C0里面读到processor ID,然后根据ID来进行cache_on。
解压的过程首先是在堆栈之上申请一个空间
/*
* Check to see if we will overwrite ourselves.
*   r4 = final kernel address
*   r5 = start of this image
*   r2 = end of malloc space (and therefore this image)
* We basically want:
*   r4 >= r2 -> OK
*   r4 + image length <= r5 -> OK
*/
        cmp r4, r2
        bhs wont_overwrite
        sub r3, sp, r5      @ > compressed kernel size
        add r0, r4, r3, lsl #2  @ allow for 4x expansion
        cmp r0, r5
        bls wont_overwrite
        mov r5, r2          @ decompress after malloc space
        mov r0, r5
        mov r3, r7
        bl  decompress_kernel
        add r0, r0, #127 + 128  @ alignment + stack
        bic r0, r0, #127        @ align the kernel length




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0