- 论坛徽章:
- 0
|
本帖最后由 leslielg 于 2012-09-14 09:37 编辑
arm linux, 2.6.35
1. __create_page_tables 的时候,先
add r0, r4, #(KERNEL_START & 0xff000000) >> 18
str r3, [r0, #(KERNEL_START & 0x00f00000) >> 18]!
将内核链接地址(KERNEL_START=PAGE_OFFSET+TEXT_OFFSET)印射到内核运行的物理地址(由pc计算出来的位置)。
然后
/*
* Then map first 1MB of ram in case it contains our boot params.
*/
add r0, r4, #PAGE_OFFSET >> 18
orr r6, r7, #(PHYS_OFFSET & 0xff000000)
.if (PHYS_OFFSET & 0x00f00000)
orr r6, r6, #(PHYS_OFFSET & 0x00f00000)
.endif
str r6, [r0]
又将PAGE_OFFSET印射到物理地址0的位置。
问题是如果uboot设置内核运行的物理地址不在物理地址0处,那这两个印射是不是就冲突了?第一个印射在页表里被第二个印射覆盖,会不会对kernel产生影响?还是作者知道会覆盖,但是后来kernel有处理,所以不会导致影响?
2. add r0, r4, #(KERNEL_START & 0xff000000) >> 18
str r3, [r0, #(KERNEL_START & 0x00f00000) >> 18]!
为何设置页表要先取最高8位,然后再加上后面4位?不能直接取得12位的页表项?
3. #define THREAD_START_SP (THREAD_SIZE - 8 )
为何这里要减去8?
先谢了!
|
|