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