首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Android arm Linux Kernel启动流程(5)

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
继承事业,薪火相传
返回列表