TCC8900 BSP (linux 2.6.28)
1) TEXT_OFFSET 0x00100000 The Kernel's start address (offset) within RAM.
./arch/arm/Makefile
#Default value
head-y := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o
textofs-y := 0x00008000
...
textofs-$(CONFIG_ARCH_TCC) := 0x00100000
...
TEXT_OFFSET := $(textofs-y)
2) PAGE_OFFSET 0xc0000000 Kernel space offset
./arch/arm/include/asm/memory.h
#define PAGE_OFFSET UL(CONFIG_PAGE_OFFSET)
./.config
CONFIG_PAGE_OFSET=0xc0000000
3) PHYS_OFFSET 0x40200000 DDR start address in SOC's memory space, AKA physical DRAM offset.
./arch/arm/mach-tcc8900/include/mach/memory.h
#define PHYS_OFFSET UL(0x40200000)
4) KERNEL_RAM_VADDR / KERNEL_RAM_PADDR 0xc0100000 / 0x40300000 Kernel's virtual/physical address in DRAM.
./arch/arm/kernel/head.S
#define KERNEL_RAM_VADDR (PAGE_OFFSET + TEXT_OFFSET)
#define KERNEL_RAM_PADDR (PHYS_OFFSET + TEXT_OFFSET)
5) swapper_pg_dir 0xc00fc000 Virtual address of Kernel's global page table
./arch/arm/kernel/head.S
.globl swapper_pg_dir
.equ swapper_pg_dir, KERNEL_RAM_VADDR - 0x4000
*This is value can be verified in System.map
6) VMALLOC_OFFSET / VMALLOC_START / VMALLOC_END 0x800000 / 0x800000 / 0xe0000000
./arch/arm/include/asm/pgtable.h
#ifndef VMALLOC_START
#define VMALLOC_OFFSET (8*1024*1024)
#define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
#endif
./arch/arm/mach-tcc8900/include/mach/vmalloc.h
#define VMALLOC_END (PAGE_OFFSET + 0x20000000)
7) MODULES_VADDR / MODULES_END 0xbf000000 / 0xc0000000
./arch/arm/include/asm/memory.h
#ifdef CONFIG_MMU
...
#define MODULES_END (PAGE_OFFSET)
#define MODULES_VADDR (MODULES_END - 16*1048576)
...
#endif
8) TASK_SIZE 0xbf000000 the maximum size of a user space task
./arch/arm/include/asm/memory.h
#ifdef CONFIG_MMU
...
#define TASK_SIZE (UL(CONFIG_PAGE_OFFSET) - UL(0x01000000))
...
#endif
9) TASK_UNMAPPED_BASE 0x40000000 the lower boundary of the mmap VM area
./arch/arm/include/asm/memory.h
#ifdef CONFIG_MMU
...#define TASK_UNMAPPED_BASE (UL(CONFIG_PAGE_OFFSET) / 3)
...
#endif
10) PAGE_SHIFT / PMD_SHIFT / PGDIR_SHIFT 12 / 21 / 21
./arch/arm/include/asm/page.h
#define PAGE_SHIFT 12
./arch/arm/include/asm/pgtable.h
#define PMD_SHIFT 21
#define PGDIR_SHIFT 21
NOTE: The ARM virtual address architecture:
|| PGD | Offset |
11) high_memory 0xcb600000
./arch/arm/mm/init.c -> bootmem_init()
high_memory = __va(memend_pfn << PAGE_SHIFT);
Note: 0xcb600000 - 0xc0000000 = 0xb600000 = 182M
12) Virtual Address <---> Physical Address
./arch/arm/include/asm/memory.h
#define __virt_to_phys(x) ((x) - PAGE_OFFSET + PHYS_OFFSET)
#define __phys_to_virt(x) ((x) - PHYS_OFFSET + PAGE_OFFSET)
13) Physical Address <---> Page Frame Number
./arch/arm/include/asm/memory.h
#define __phys_to_pfn(paddr) ((paddr) >> PAGE_SHIFT)
#define __pfn_to_phys(pfn) ((pfn) << PAGE_SHIFT)