diff options
| -rw-r--r-- | kernel.ld | 59 | ||||
| -rw-r--r-- | memlayout.h | 26 | 
2 files changed, 85 insertions, 0 deletions
| 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) + | 
