Linux内核空间划分

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;
      }

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!