diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/boot.s | 29 | ||||
| -rw-r--r-- | kernel/linker.ld | 88 |
2 files changed, 60 insertions, 57 deletions
diff --git a/kernel/boot.s b/kernel/boot.s index 534beb6..281e1ca 100644 --- a/kernel/boot.s +++ b/kernel/boot.s @@ -1,36 +1,11 @@ -MBFLAGS equ 0 -MAGIC equ 0x1BADB002 -CHECKSUM equ -(MAGIC + MBFLAGS) - - section .multiboot -align 4 - dd MAGIC - dd MBFLAGS - dd CHECKSUM - -section .bss -resb 512 -align 16 -; align 16 bytes according to the System V ABI standard -; Stack space -stack_bottom: -resb 16384 ; 16KiB -stack_top: - section .text extern main +extern _estack global _start:function (_start.end - _start) _start: - mov esp, stack_top + mov esp, _estack call main cli .hang: hlt jmp .hang .end: - -section .kheap -kheap_top: -; Kernel heap space -; Change this value together Kheap::size varibale (mem/Kheap.h file) -resb 4096 -kheap_bottom: diff --git a/kernel/linker.ld b/kernel/linker.ld index abee596..9a0561b 100644 --- a/kernel/linker.ld +++ b/kernel/linker.ld @@ -1,49 +1,77 @@ +INCLUDE memory.ld + ENTRY(_start) +/*Pass this symbols via CMake*/ +MAGIC = 0x1BADB002; +FLAGS = 0; +CHECKSUM = -(MAGIC + FLAGS); + SECTIONS { - . = 1M; - - .multiboot : + /* It's a raw solution. */ + /* Automatic generation of filling .multiboot section needs. */ + .multiboot ALIGN(START_ADDR, CONSTANT(MAXPAGESIZE)) : ALIGN(CONSTANT(MAXPAGESIZE)) { - _startMultiboot = .; - *(.multiboot) - _endMultiboot = .; - } + LONG(MAGIC); + LONG(FLAGS); + LONG(CHECKSUM) + } > REGION_MULTIBOOT - .text BLOCK(4K) : ALIGN(4K) + .text ALIGN(CONSTANT(MAXPAGESIZE)) : ALIGN(CONSTANT(MAXPAGESIZE)) { - _startText = .; - *(.text) - _endText = .; - } + _text = .; + *(.text*) + _etext = .; + } > REGION_TEXT - .rodata BLOCK(4K) : ALIGN(4k) + .rodata ALIGN(CONSTANT(MAXPAGESIZE)): ALIGN(CONSTANT(MAXPAGESIZE)) { - _startRodata = .; - *(.rodata) - _endRodata = .; - } + _rodata = .; + *(.rodata*) + _erodata = .; + } > REGION_RODATA - .data BLOCK(4K) : ALIGN(4K) + .data : { - _startData = .; + _data = .; *(.data) - _endData = .; - } + _edata = .; + } > REGION_DATA - .bss BLOCK(16K) : ALIGN(16K) + .bss : { - _startBss = .; + _bss = .; *(.bss) - _endBss = .; - } + *(COMMON) + _ebss = .; + } > REGION_BSS + + .stack ALIGN(CONSTANT(MAXPAGESIZE)) : ALIGN(CONSTANT(MAXPAGESIZE)) + { + _stack = ABSOLUTE(.); + . += 4 * CONSTANT(MAXPAGESIZE); + _estack = ABSOLUTE(.); + } > REGION_DATA - .kheap BLOCK(4k) : ALIGN(4k) + .kheap ALIGN(CONSTANT(MAXPAGESIZE)) : ALIGN(CONSTANT(MAXPAGESIZE)) { - _startKheap = .; - *(.kheap) - _endKheap = .; - } + _startKheap = ABSOLUTE(.); + . += CONSTANT(MAXPAGESIZE); + _endKheap = ABSOLUTE(.); + } > REGION_DATA + + .eh_frame : + { + _eh_frame = .; + *(.eh_frame) + _e_eh_frame = .; + } > REGION_COMMON + + .ctors : + { + SORT_BY_NAME(CONSTRUCTORS) + } > REGION_COMMON + } |
