Chinaunix首页 | 论坛 | 博客
  • 博客访问: 336198
  • 博文数量: 102
  • 博客积分: 3140
  • 博客等级: 中校
  • 技术积分: 680
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-28 11:44
个人简介

开阔未来

文章分类

全部博文(102)

文章存档

2015年(10)

2014年(1)

2013年(1)

2012年(4)

2011年(8)

2010年(24)

2009年(51)

2008年(3)

我的朋友

分类: LINUX

2012-01-17 16:07:38

作者: mutes 和相关  


简介:这是armlinux中一些重要的宏及地址定义的详细页面,介绍了和linux,有关的知识、技巧、经验,和一些linux源码等。

TEXT_OFFSET  内核在RAM中的起始位置相对于RAM起始地址偏移。值为0x00008000
./arch/arm/Makefile
118 textofs-y       := 0x00008000
222 TEXT_OFFSET := $(textofs-y)


PAGE_OFFSE   内核镜像起始虚拟地址。值为0xC0000000
/arch/arm/configs/s3c2410_defconfig
CONFIG_PAGE_OFFSET=0xC0000000
./arch/arm/include/asm/memory.h
 34 #define PAGE_OFFSET             UL(CONFIG_PAGE_OFFSET)

PHYS_OFFSET  RAM启始物理地址,对于2410来说值为0x30000000,RAM接在片选6上
arch/arm/mach-s3c2410/include/mach/memory.h
from arch/arm/mach-rpc/include/mach/memory.h
#define PHYS_OFFSET    UL(0x30000000)

KERNEL_RAM_VADDR  内核在RAM中的虚拟地址。值为0xC0008000
KERNEL_RAM_PADDR  内核在RAM中的物理地址。值为0x30008000
arch/arm/kernel/head.S
 29 #define KERNEL_RAM_VADDR        (PAGE_OFFSET + TEXT_OFFSET)
 30 #define KERNEL_RAM_PADDR        (PHYS_OFFSET + TEXT_OFFSET)

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

VMALLOC_START 0xc4800000
VMALLOC_END   0xe0000000

MODULES_VADDR 0xbf000000
MODULES_END   0xc0000000

./arch/arm/include/asm/memory.h
  51 #define MODULES_VADDR           (PAGE_OFFSET - 8*1024*1024)

 61 #ifdef CONFIG_HIGHMEM
 62 #define MODULES_END             (PAGE_OFFSET - PMD_SIZE)
 63 #else
 64 #define MODULES_END             (PAGE_OFFSET)
 65 #endif




arch/arm/include/asm/highmem.h:6:#define PKMAP_BASE           (PAGE_OFFSET - PMD_SIZE)
./arch/arm/include/asm/memory.h
 34 #define PAGE_OFFSET             UL(CONFIG_PAGE_OFFSET)
 35 #define TASK_SIZE               (UL(CONFIG_PAGE_OFFSET) - UL(0x01000000))
 36 #define TASK_UNMAPPED_BASE      (UL(CONFIG_PAGE_OFFSET) / 3)

135 /*
136  * Physical vs virtual RAM address space conversion.  These are
137  * private definitions which should NOT be used outside memory.h
138  * files.  Use virt_to_phys/phys_to_virt/__pa/__va instead.
139  */
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 /*
146  * Convert a physical address to a Page Frame Number and back
147  */
148 #define __phys_to_pfn(paddr)    ((paddr) >> PAGE_SHIFT)
149 #define __pfn_to_phys(pfn)      ((pfn) << PAGE_SHIFT)
150
151 /*
152  * Convert a page to/from a physical address
153  */
154 #define page_to_phys(page)      (__pfn_to_phys(page_to_pfn(page)))
155 #define phys_to_page(phys)      (pfn_to_page(__phys_to_pfn(phys)))

201 /*
202  * Drivers should NOT use these either.
203  */
204 #define __pa(x)                 __virt_to_phys((unsigned long)(x))
205 #define __va(x)                 ((void *)__phys_to_virt((unsigned long)(x)))
206 #define pfn_to_kaddr(pfn)       __va((pfn) << PAGE_SHIFT)
207

208 /*
209  * Virtual <-> DMA view memory address translations
210  * Again, these are *only* valid on the kernel direct mapped RAM
211  * memory.  Use of these is *deprecated* (and that doesn't mean
212  * use the __ prefixed forms instead.)  See dma-mapping.h.
213  */
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
阅读(487) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~