当前位置:文档之家› linux内核启动时几个关键地址

linux内核启动时几个关键地址

linux内核启动时几个关键地址
1、名词解释
ZTEXTADDR
解压代码运行的开始地址。

没有物理地址和虚拟地址之分,因为此时MMU处于关闭状态。

这个地址不一定时RAM的地址,可以是支持读写寻址的flash等存储中介。

ZRELADDR
内核启动在RAM中的物理地址。

压缩的内核映像被解压到这个地址,然后执行。

This is the address where the decompressed kernel will be written, and eventually executed. The following constraint must be valid:
__virt_to_phys(TEXTADDR) == ZRELADDR
The initial part of the kernel is carefully coded to be position independent.
TEXTADDR
内核启动的虚拟地址,与ZRELADDR相对应。

一般内核启动的虚拟地址为RAM的第一个bank地址加上0x8000。

TEXTADDR = PAGE_OFFSET + TEXTOFFST
Virtual start address of kernel, normally PAGE_OFFSET + 0x8000.This is where the kernel image ends up. With the latest kernels, it must be located at 32768 bytes into a 128MB region. Previous kernels placed a restriction of 256MB here.
TEXT_OFFSET
内核偏移地址,即内核起始位置相对于内存起始位置的偏移,对于相对于物理内存还是相对于虚拟内存都是一样的结果。

在arch/arm/makefile中设定。

PHYS_OFFSET
RAM第一个bank的物理起始地址,即物理内存的起始地址。

Physical start address of the first bank of RAM.
PAGE_OFFSET
RAM第一个bank的虚拟起始地址,即内核虚拟地址空间的起始地址。

2、小结
从上面分析可知道,linux内核被bootloader拷贝到RAM后,解压代码从ZTEXTADDR开始运行(这段代码是与位置无关的PIC)。

内核被解压缩到ZREALADDR处,也就是内核启动的物理地址处。

相应地,内核启动的虚拟地址被设定为TEXTADDR,满足如下条件:
TEXTADDR = PAGE_OFFSET + TEXT_OFFSET
内核启动的物理地址和虚拟地址满足入下条件:
ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)= virt_to_phys(TEXTADDR)
假定开发板为smdk2410,则有:
内核启动的虚拟地址
TEXTADDR = 0xC0008000
内核启动的物理地址
ZRELADDR = 0x30008000
如果直接从flash中启动还需要设置ZTEXTADDR地址。

相关主题