arm linux中一些重要的宏及地…

来源:互联网 发布:防止网络诈骗 编辑:程序博客网 时间:2024/04/29 19:44
转载自http://biancheng.dnbcw.info/linux/352414.html。在此基础上,做一些修改。
 
1)TEXT_OFFSET 内核在RAM中的起始位置相对于RAM起始地址偏移。值为0x00008000
  1. ./arch/arm/Makefile
  2. 111 textofs-:= 0x00008000
  3. 112 textofs-$(CONFIG_ARCH_CLPS711X) := 0x00028000
  4. 113 # We don't want thehtc bootloader to corruptkernel during resume
  5. 114 textofs-$(CONFIG_PM_H1940) := 0x00108000
  6. 115 # SA1111 DMA bug: wedon't want thekernel to live in preciousDMA-ablememory
  7. 116 ifeq ($(CONFIG_ARCH_SA1100),y)
  8. 117 textofs-$(CONFIG_SA1111) := 0x00208000
  9. 118 endif

  10. 212 # The byte offset of the kernelimage in RAMfrom the start of RAM.
  11. 213 TEXT_OFFSET := $(textofs-y)

2)PAGE_OFFSE  内核镜像起始虚拟地址。值为0xC0000000
  1. arch/arm/Kconfig
  2. 1165 configPAGE_OFFSET ----这个就是CONFIG_PAGE_OFFSET宏,默认值为0xC0000000
  3. 1166 hex
  4. 1167 default 0x40000000 if VMSPLIT_1G
  5. 1168 default 0x80000000 if VMSPLIT_2G
  6. 1169 default0xC0000000

  7. ./arch/arm/include/asm/memory.
  8. 34 #definePAGE_OFFSET UL(CONFIG_PAGE_OFFSET)

3)PHYS_OFFSET RAM启始物理地址,对应于DDR的物理地址。需要在mach-xxxx/include/mach/memory.h文件中定义这个宏。
 
对于2410来说值为0x30000000,RAM接在片选6上
arch/arm/mach-s3c2410/include/mach/memory.h
#definePHYS_OFFSET   UL(0x30000000)

4)KERNEL_RAM_VADDR 内核在RAM中的虚拟地址。值为0xC0008000
5)KERNEL_RAM_PADDR 内核在RAM中的物理地址。值为0x30008000

arch/arm/kernel/head.S
 29 #defineKERNEL_RAM_VADDR       (PAGE_OFFSET + TEXT_OFFSET)
 30 #defineKERNEL_RAM_PADDR       (PHYS_OFFSET + TEXT_OFFSET)

6)swapper_pg_dir 初始页表虚拟地址,值为0xC0004000,
一般分配KERNEL_RAM_VADDR地址下16K作为页表,因此,我们必须确保正确设置KERNEL_RAM_VADDR。
arch/arm/kernel/head.S
 44        .globl  swapper_pg_dir
 45        .equ    swapper_pg_dir,KERNEL_RAM_VADDR - 0x4000

7)VMALLOC_START0xc4800000
8)VMALLOC_END  0xe0000000

9)MODULES_VADDR0xbf000000
10)MODULES_END  0xc0000000

arch/arm/include/asm/memory.h
  1.  47#ifndef CONFIG_THUMB2_KERNEL
     48 #define MODULES_VADDR          (PAGE_OFFSET - 16*1024*1024)
     49 #else
     50
     51 #define MODULES_VADDR          (PAGE_OFFSET - 8*1024*1024)
     52 #endif
     53 
     54 #if TASK_SIZE > MODULES_VADDR
     55 #error Top of user space clashes with start ofmodule space
     56 #endif
     57 
     58
     61 #ifdef CONFIG_HIGHMEM
     62 #defineMODULES_END            (PAGE_OFFSET - PMD_SIZE)
     63#else
     64 #defineMODULES_END            (PAGE_OFFSET)
     65#endif

11)PKMAP_BASE           
arch/arm/include/asm/highmem.h:
6:#definePKMAP_BASE          (PAGE_OFFSET - PMD_SIZE)
 
12)TASK_SIZE
./arch/arm/include/asm/memory.h 
 34 #definePAGE_OFFSET            UL(CONFIG_PAGE_OFFSET)
 35 #defineTASK_SIZE              (UL(CONFIG_PAGE_OFFSET) - UL(0x01000000))
 36 #defineTASK_UNMAPPED_BASE     (UL(CONFIG_PAGE_OFFSET) / 3)
13)一些不同地址之间转换的宏
./arch/arm/include/asm/memory.h 

135
140 #ifndef __virt_to_phys
141 #define__virt_to_phys(x)      ((x) - PAGE_OFFSET + PHYS_OFFSET)//物理地址和虚拟地址
142 #define__phys_to_virt(x)      ((x) - PHYS_OFFSET + PAGE_OFFSET)//之间转换的宏
143 #endif
144 
145
148 #define__phys_to_pfn(paddr)   ((paddr) >> PAGE_SHIFT) //物理地址和页帧号之间
149 #define__pfn_to_phys(pfn)     ((pfn) <<PAGE_SHIFT)   //转换的宏
150 
151
154 #definepage_to_phys(page)     (__pfn_to_phys(page_to_pfn(page)))//页地址和物理地址
155 #definephys_to_page(phys)     (pfn_to_page(__phys_to_pfn(phys)))//之间的转换宏依赖于内存模型。

201
204 #define__pa(x)                __virt_to_phys((unsigned long)(x))
205 #define__va(x)                ((void *)__phys_to_virt((unsigned long)(x)))
206 #definepfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
207 

208
214 #ifndef __virt_to_bus
215 #define __virt_to_bus  __virt_to_phys
216 #define __bus_to_virt  __phys_to_virt
217 #define __pfn_to_bus(x) __pfn_to_phys(x)
218 #define __bus_to_pfn(x) __phys_to_pfn(x)
219 #endif
0 0
原创粉丝点击