From 67d4254d15313ce24ef37c6e92b4630211c2229b Mon Sep 17 00:00:00 2001 From: Frans Kaashoek Date: Sun, 7 Aug 2011 12:30:34 -0400 Subject: [PATCH] oops --- kernel.ld | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++ memlayout.h | 26 +++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 kernel.ld create mode 100644 memlayout.h diff --git a/kernel.ld b/kernel.ld new file mode 100644 index 0000000..3726f4e --- /dev/null +++ b/kernel.ld @@ -0,0 +1,59 @@ +/* Simple linker script for the JOS kernel. + See the GNU ld 'info' manual ("info ld") to learn the syntax. */ + +OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") +OUTPUT_ARCH(i386) +ENTRY(_start) + +SECTIONS +{ + /* Load the kernel at this address: "." means the current address */ + . = 0xF0100000; + + .text : AT(0x100000) { + *(.text .stub .text.* .gnu.linkonce.t.*) + } + + PROVIDE(etext = .); /* Define the 'etext' symbol to this value */ + + .rodata : { + *(.rodata .rodata.* .gnu.linkonce.r.*) + } + + /* Include debugging information in kernel memory */ + .stab : { + PROVIDE(__STAB_BEGIN__ = .); + *(.stab); + PROVIDE(__STAB_END__ = .); + BYTE(0) /* Force the linker to allocate space + for this section */ + } + + .stabstr : { + PROVIDE(__STABSTR_BEGIN__ = .); + *(.stabstr); + PROVIDE(__STABSTR_END__ = .); + BYTE(0) /* Force the linker to allocate space + for this section */ + } + + /* Adjust the address for the data segment to the next page */ + . = ALIGN(0x1000); + + /* The data segment */ + .data : { + *(.data) + } + + PROVIDE(edata = .); + + .bss : { + *(.bss) + } + + PROVIDE(end = .); + + /DISCARD/ : { + *(.eh_frame .note.GNU-stack) + } +} diff --git a/memlayout.h b/memlayout.h new file mode 100644 index 0000000..3958062 --- /dev/null +++ b/memlayout.h @@ -0,0 +1,26 @@ +// Memory layout + +#define PGSIZE 4096 // bytes mapped by a page +#define PGSHIFT 12 // log2(PGSIZE) + +#define KSTKSIZE (8*PGSIZE) // size of a kernel stack + +#define IOSPACEB 0x0A0000 // begin IO space +#define IOSPACEE 0x100000 // end IO space +#define PHYSTOP 0xE000000 // use phys mem up to here as free pool + +// Key addresses for address space layout (see kmap in vm.c for the actual layout) +#define KERNBASE 0xF0000000 // First kernel virtual address +#define USERTOP (KERNBASE-PGSIZE) // Highest user virtual address +#define KERNLINK 0xF0100000 // Address where kernel is linked + +#ifndef __ASSEMBLER__ + +static inline uint v2p(void *a) { return (uint) a - KERNBASE; } +static inline void *p2v(uint a) { return (void *) a + KERNBASE; } + +#endif + +#define V2P(a) ((uint) a - KERNBASE) +#define P2V(a) ((void *) a + KERNBASE) +