Linux内核空间划分,在32bit Linux中,一共能使用的虚拟地址空间是4GB,用户空间和内核空间的划分通常是按照3:1来划分,也可以按照2:2来划分。
[arch/arm/Kconfig]
choice
prompt "Memory split"
depends on MMU
default VMSPLIT_3G
help
Select the desired split between kernel and user memory.
If you are not absolutely sure what you are doing, leave this
option alone!
config VMSPLIT_3G
bool "3G/1G user/kernel split"
config VMSPLIT_2G
bool "2G/2G user/kernel split"
config VMSPLIT_1G
bool "1G/3G user/kernel split"
endchoice
config PAGE_OFFSET
hex
default PHYS_OFFSET if ! MMU
default 0x40000000 if VMSPLIT_1G
default 0x80000000 if VMSPLIT_2G
default 0xC0000000
在ARM Linux中有一个配置选项“memory split”,可以用于调整内核空间和用户空间的大小划分。通常使用“VMSPLIT_3G”选项,用户空间大小是3GB,内核空间大小是1GB,那么PAGE_OFFSET描述内核空间的偏移量就等于0xC000_0000。也可以选择“VMSPLIT_2G”选项,这时内核空间和用户空间的大小都是2GB, PAGE_OFFSET就等于0x8000_0000。
内核中通常会使用PAGE_OFFSET这个宏来计算内核线性映射中虚拟地址和物理地址的转换。
/* PAGE_OFFSET - the virtual address of the start of the kernel image */
#define PAGE OFFSET UL(CONFIG PAGE OFFSET)
例如,内核中用于计算线性映射的物理地址和虚拟地址的转换关系。线性映射的物理地址等于虚拟地址vaddr减去PAGE_OFFSET(0xC000_0000)再减去PHYS_OFFSET(在部分ARM系统中该值为0)。
[arch/arm/include/asm/memory.h]
static inline phys_addr_t __virt_to_phys(unsigned long x)
{
return (phys_addr_t)x - PAGE_OFFSET + PHYS_OFFSET;
}
static inline unsigned long __phys_to_virt(phys_addr_t x)
{
return x - PHYS_OFFSET + PAGE_OFFSET;
}
酷客网相关文章:
评论前必须登录!
注册