Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | Taken from list archive at http://lists.arm.linux.org.uk/pipermail/linux-arm-kernel/2001-July/004064.html |
| 2 | |
| 3 | Initial definitions |
| 4 | ------------------- |
| 5 | |
| 6 | The following symbol definitions rely on you knowing the translation that |
| 7 | __virt_to_phys() does for your machine. This macro converts the passed |
| 8 | virtual address to a physical address. Normally, it is simply: |
| 9 | |
| 10 | phys = virt - PAGE_OFFSET + PHYS_OFFSET |
| 11 | |
| 12 | |
| 13 | Decompressor Symbols |
| 14 | -------------------- |
| 15 | |
| 16 | ZTEXTADDR |
| 17 | Start address of decompressor. There's no point in talking about |
| 18 | virtual or physical addresses here, since the MMU will be off at |
| 19 | the time when you call the decompressor code. You normally call |
| 20 | the kernel at this address to start it booting. This doesn't have |
| 21 | to be located in RAM, it can be in flash or other read-only or |
| 22 | read-write addressable medium. |
| 23 | |
| 24 | ZBSSADDR |
| 25 | Start address of zero-initialised work area for the decompressor. |
| 26 | This must be pointing at RAM. The decompressor will zero initialise |
| 27 | this for you. Again, the MMU will be off. |
| 28 | |
| 29 | ZRELADDR |
| 30 | This is the address where the decompressed kernel will be written, |
| 31 | and eventually executed. The following constraint must be valid: |
| 32 | |
| 33 | __virt_to_phys(TEXTADDR) == ZRELADDR |
| 34 | |
| 35 | The initial part of the kernel is carefully coded to be position |
| 36 | independent. |
| 37 | |
| 38 | INITRD_PHYS |
| 39 | Physical address to place the initial RAM disk. Only relevant if |
| 40 | you are using the bootpImage stuff (which only works on the old |
| 41 | struct param_struct). |
| 42 | |
| 43 | INITRD_VIRT |
| 44 | Virtual address of the initial RAM disk. The following constraint |
| 45 | must be valid: |
| 46 | |
| 47 | __virt_to_phys(INITRD_VIRT) == INITRD_PHYS |
| 48 | |
| 49 | PARAMS_PHYS |
| 50 | Physical address of the struct param_struct or tag list, giving the |
| 51 | kernel various parameters about its execution environment. |
| 52 | |
| 53 | |
| 54 | Kernel Symbols |
| 55 | -------------- |
| 56 | |
| 57 | PHYS_OFFSET |
| 58 | Physical start address of the first bank of RAM. |
| 59 | |
| 60 | PAGE_OFFSET |
| 61 | Virtual start address of the first bank of RAM. During the kernel |
| 62 | boot phase, virtual address PAGE_OFFSET will be mapped to physical |
| 63 | address PHYS_OFFSET, along with any other mappings you supply. |
| 64 | This should be the same value as TASK_SIZE. |
| 65 | |
| 66 | TASK_SIZE |
| 67 | The maximum size of a user process in bytes. Since user space |
| 68 | always starts at zero, this is the maximum address that a user |
| 69 | process can access+1. The user space stack grows down from this |
| 70 | address. |
| 71 | |
| 72 | Any virtual address below TASK_SIZE is deemed to be user process |
| 73 | area, and therefore managed dynamically on a process by process |
| 74 | basis by the kernel. I'll call this the user segment. |
| 75 | |
| 76 | Anything above TASK_SIZE is common to all processes. I'll call |
| 77 | this the kernel segment. |
| 78 | |
| 79 | (In other words, you can't put IO mappings below TASK_SIZE, and |
| 80 | hence PAGE_OFFSET). |
| 81 | |
| 82 | TEXTADDR |
| 83 | Virtual start address of kernel, normally PAGE_OFFSET + 0x8000. |
| 84 | This is where the kernel image ends up. With the latest kernels, |
| 85 | it must be located at 32768 bytes into a 128MB region. Previous |
| 86 | kernels placed a restriction of 256MB here. |
| 87 | |
| 88 | DATAADDR |
| 89 | Virtual address for the kernel data segment. Must not be defined |
| 90 | when using the decompressor. |
| 91 | |
| 92 | VMALLOC_START |
| 93 | VMALLOC_END |
| 94 | Virtual addresses bounding the vmalloc() area. There must not be |
| 95 | any static mappings in this area; vmalloc will overwrite them. |
| 96 | The addresses must also be in the kernel segment (see above). |
| 97 | Normally, the vmalloc() area starts VMALLOC_OFFSET bytes above the |
| 98 | last virtual RAM address (found using variable high_memory). |
| 99 | |
| 100 | VMALLOC_OFFSET |
| 101 | Offset normally incorporated into VMALLOC_START to provide a hole |
| 102 | between virtual RAM and the vmalloc area. We do this to allow |
| 103 | out of bounds memory accesses (eg, something writing off the end |
| 104 | of the mapped memory map) to be caught. Normally set to 8MB. |
| 105 | |
| 106 | Architecture Specific Macros |
| 107 | ---------------------------- |
| 108 | |
| 109 | BOOT_MEM(pram,pio,vio) |
| 110 | `pram' specifies the physical start address of RAM. Must always |
| 111 | be present, and should be the same as PHYS_OFFSET. |
| 112 | |
| 113 | `pio' is the physical address of an 8MB region containing IO for |
| 114 | use with the debugging macros in arch/arm/kernel/debug-armv.S. |
| 115 | |
| 116 | `vio' is the virtual address of the 8MB debugging region. |
| 117 | |
| 118 | It is expected that the debugging region will be re-initialised |
| 119 | by the architecture specific code later in the code (via the |
| 120 | MAPIO function). |
| 121 | |
| 122 | BOOT_PARAMS |
| 123 | Same as, and see PARAMS_PHYS. |
| 124 | |
| 125 | FIXUP(func) |
| 126 | Machine specific fixups, run before memory subsystems have been |
| 127 | initialised. |
| 128 | |
| 129 | MAPIO(func) |
| 130 | Machine specific function to map IO areas (including the debug |
| 131 | region above). |
| 132 | |
| 133 | INITIRQ(func) |
| 134 | Machine specific function to initialise interrupts. |
| 135 | |