138 строки
4.4 KiB
ReStructuredText
138 строки
4.4 KiB
ReStructuredText
=======
|
|
Porting
|
|
=======
|
|
|
|
Taken from list archive at http://lists.arm.linux.org.uk/pipermail/linux-arm-kernel/2001-July/004064.html
|
|
|
|
Initial definitions
|
|
-------------------
|
|
|
|
The following symbol definitions rely on you knowing the translation that
|
|
__virt_to_phys() does for your machine. This macro converts the passed
|
|
virtual address to a physical address. Normally, it is simply:
|
|
|
|
phys = virt - PAGE_OFFSET + PHYS_OFFSET
|
|
|
|
|
|
Decompressor Symbols
|
|
--------------------
|
|
|
|
ZTEXTADDR
|
|
Start address of decompressor. There's no point in talking about
|
|
virtual or physical addresses here, since the MMU will be off at
|
|
the time when you call the decompressor code. You normally call
|
|
the kernel at this address to start it booting. This doesn't have
|
|
to be located in RAM, it can be in flash or other read-only or
|
|
read-write addressable medium.
|
|
|
|
ZBSSADDR
|
|
Start address of zero-initialised work area for the decompressor.
|
|
This must be pointing at RAM. The decompressor will zero initialise
|
|
this for you. Again, the MMU will be off.
|
|
|
|
ZRELADDR
|
|
This is the address where the decompressed kernel will be written,
|
|
and eventually executed. The following constraint must be valid:
|
|
|
|
__virt_to_phys(TEXTADDR) == ZRELADDR
|
|
|
|
The initial part of the kernel is carefully coded to be position
|
|
independent.
|
|
|
|
INITRD_PHYS
|
|
Physical address to place the initial RAM disk. Only relevant if
|
|
you are using the bootpImage stuff (which only works on the old
|
|
struct param_struct).
|
|
|
|
INITRD_VIRT
|
|
Virtual address of the initial RAM disk. The following constraint
|
|
must be valid:
|
|
|
|
__virt_to_phys(INITRD_VIRT) == INITRD_PHYS
|
|
|
|
PARAMS_PHYS
|
|
Physical address of the struct param_struct or tag list, giving the
|
|
kernel various parameters about its execution environment.
|
|
|
|
|
|
Kernel Symbols
|
|
--------------
|
|
|
|
PHYS_OFFSET
|
|
Physical start address of the first bank of RAM.
|
|
|
|
PAGE_OFFSET
|
|
Virtual start address of the first bank of RAM. During the kernel
|
|
boot phase, virtual address PAGE_OFFSET will be mapped to physical
|
|
address PHYS_OFFSET, along with any other mappings you supply.
|
|
This should be the same value as TASK_SIZE.
|
|
|
|
TASK_SIZE
|
|
The maximum size of a user process in bytes. Since user space
|
|
always starts at zero, this is the maximum address that a user
|
|
process can access+1. The user space stack grows down from this
|
|
address.
|
|
|
|
Any virtual address below TASK_SIZE is deemed to be user process
|
|
area, and therefore managed dynamically on a process by process
|
|
basis by the kernel. I'll call this the user segment.
|
|
|
|
Anything above TASK_SIZE is common to all processes. I'll call
|
|
this the kernel segment.
|
|
|
|
(In other words, you can't put IO mappings below TASK_SIZE, and
|
|
hence PAGE_OFFSET).
|
|
|
|
TEXTADDR
|
|
Virtual start address of kernel, normally PAGE_OFFSET + 0x8000.
|
|
This is where the kernel image ends up. With the latest kernels,
|
|
it must be located at 32768 bytes into a 128MB region. Previous
|
|
kernels placed a restriction of 256MB here.
|
|
|
|
DATAADDR
|
|
Virtual address for the kernel data segment. Must not be defined
|
|
when using the decompressor.
|
|
|
|
VMALLOC_START / VMALLOC_END
|
|
Virtual addresses bounding the vmalloc() area. There must not be
|
|
any static mappings in this area; vmalloc will overwrite them.
|
|
The addresses must also be in the kernel segment (see above).
|
|
Normally, the vmalloc() area starts VMALLOC_OFFSET bytes above the
|
|
last virtual RAM address (found using variable high_memory).
|
|
|
|
VMALLOC_OFFSET
|
|
Offset normally incorporated into VMALLOC_START to provide a hole
|
|
between virtual RAM and the vmalloc area. We do this to allow
|
|
out of bounds memory accesses (eg, something writing off the end
|
|
of the mapped memory map) to be caught. Normally set to 8MB.
|
|
|
|
Architecture Specific Macros
|
|
----------------------------
|
|
|
|
BOOT_MEM(pram,pio,vio)
|
|
`pram` specifies the physical start address of RAM. Must always
|
|
be present, and should be the same as PHYS_OFFSET.
|
|
|
|
`pio` is the physical address of an 8MB region containing IO for
|
|
use with the debugging macros in arch/arm/kernel/debug-armv.S.
|
|
|
|
`vio` is the virtual address of the 8MB debugging region.
|
|
|
|
It is expected that the debugging region will be re-initialised
|
|
by the architecture specific code later in the code (via the
|
|
MAPIO function).
|
|
|
|
BOOT_PARAMS
|
|
Same as, and see PARAMS_PHYS.
|
|
|
|
FIXUP(func)
|
|
Machine specific fixups, run before memory subsystems have been
|
|
initialised.
|
|
|
|
MAPIO(func)
|
|
Machine specific function to map IO areas (including the debug
|
|
region above).
|
|
|
|
INITIRQ(func)
|
|
Machine specific function to initialise interrupts.
|