diff options
Diffstat (limited to 'kernel/boot')
-rw-r--r-- | kernel/boot/grub.cfg | 4 | ||||
-rw-r--r-- | kernel/boot/init/boot.s | 144 | ||||
-rw-r--r-- | kernel/boot/init/crti.s | 44 | ||||
-rw-r--r-- | kernel/boot/init/crtn.s | 44 | ||||
-rw-r--r-- | kernel/boot/link.ld | 82 |
5 files changed, 159 insertions, 159 deletions
diff --git a/kernel/boot/grub.cfg b/kernel/boot/grub.cfg index 9bc495d..73a002c 100644 --- a/kernel/boot/grub.cfg +++ b/kernel/boot/grub.cfg @@ -2,5 +2,5 @@ set timeout=0 set default=0 menuentry "cmos" { - multiboot /boot/kernel -}
\ No newline at end of file + multiboot /boot/kernel +} diff --git a/kernel/boot/init/boot.s b/kernel/boot/init/boot.s index 001e254..c9c6dd5 100644 --- a/kernel/boot/init/boot.s +++ b/kernel/boot/init/boot.s @@ -1,20 +1,20 @@ /* -* CMOS -* Copyright (C) 2024 Raghuram Subramani <raghus2247@gmail.com> -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ + * CMOS + * Copyright (C) 2024 Raghuram Subramani <raghus2247@gmail.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ /* Adapted from https://wiki.osdev.org/Bare_Bones */ @@ -65,70 +65,70 @@ stack_top: .global _start .type _start, @function _start: - /* - The bootloader has loaded us into 32-bit protected mode on a x86 - machine. Interrupts are disabled. Paging is disabled. The processor - state is as defined in the multiboot standard. The kernel has full - control of the CPU. The kernel can only make use of hardware features - and any code it provides as part of itself. There's no printf - function, unless the kernel provides its own <stdio.h> header and a - printf implementation. There are no security restrictions, no - safeguards, no debugging mechanisms, only what the kernel provides - itself. It has absolute and complete power over the - machine. - */ + /* + The bootloader has loaded us into 32-bit protected mode on a x86 + machine. Interrupts are disabled. Paging is disabled. The processor + state is as defined in the multiboot standard. The kernel has full + control of the CPU. The kernel can only make use of hardware features + and any code it provides as part of itself. There's no printf + function, unless the kernel provides its own <stdio.h> header and a + printf implementation. There are no security restrictions, no + safeguards, no debugging mechanisms, only what the kernel provides + itself. It has absolute and complete power over the + machine. + */ - /* - To set up a stack, we set the esp register to point to the top of the - stack (as it grows downwards on x86 systems). This is necessarily done - in assembly as languages such as C cannot function without a stack. - */ - movl $stack_top, %esp + /* + To set up a stack, we set the esp register to point to the top of the + stack (as it grows downwards on x86 systems). This is necessarily done + in assembly as languages such as C cannot function without a stack. + */ + movl $stack_top, %esp - /* - This is a good place to initialize crucial processor state before the - high-level kernel is entered. It's best to minimize the early - environment where crucial features are offline. Note that the - processor is not fully initialized yet: Features such as floating - point instructions and instruction set extensions are not initialized - yet. The GDT should be loaded here. Paging should be enabled here. - C++ features such as global constructors and exceptions will require - runtime support to work as well. - */ + /* + This is a good place to initialize crucial processor state before the + high-level kernel is entered. It's best to minimize the early + environment where crucial features are offline. Note that the + processor is not fully initialized yet: Features such as floating + point instructions and instruction set extensions are not initialized + yet. The GDT should be loaded here. Paging should be enabled here. + C++ features such as global constructors and exceptions will require + runtime support to work as well. + */ - /* TODO: Initialize global descriptor table */ + /* TODO: Initialize global descriptor table */ - /* Call the global constructors. */ - call _init + /* Call the global constructors. */ + call _init - /* - Enter the high-level kernel. The ABI requires the stack is 16-byte - aligned at the time of the call instruction (which afterwards pushes - the return pointer of size 4 bytes). The stack was originally 16-byte - aligned above and we've pushed a multiple of 16 bytes to the - stack since (pushed 0 bytes so far), so the alignment has thus been - preserved and the call is well defined. - */ - call kernel_main + /* + Enter the high-level kernel. The ABI requires the stack is 16-byte + aligned at the time of the call instruction (which afterwards pushes + the return pointer of size 4 bytes). The stack was originally 16-byte + aligned above and we've pushed a multiple of 16 bytes to the + stack since (pushed 0 bytes so far), so the alignment has thus been + preserved and the call is well defined. + */ + call kernel_main - /* - If the system has nothing more to do, put the computer into an - infinite loop. To do that: - 1) Disable interrupts with cli (clear interrupt enable in eflags). - They are already disabled by the bootloader, so this is not needed. - Mind that you might later enable interrupts and return from - kernel_main (which is sort of nonsensical to do). - 2) Wait for the next interrupt to arrive with hlt (halt instruction). - Since they are disabled, this will lock up the computer. - 3) Jump to the hlt instruction if it ever wakes up due to a - non-maskable interrupt occurring or due to system management mode. - */ - cli - jmp quit + /* + If the system has nothing more to do, put the computer into an + infinite loop. To do that: + 1) Disable interrupts with cli (clear interrupt enable in eflags). + They are already disabled by the bootloader, so this is not needed. + Mind that you might later enable interrupts and return from + kernel_main (which is sort of nonsensical to do). + 2) Wait for the next interrupt to arrive with hlt (halt instruction). + Since they are disabled, this will lock up the computer. + 3) Jump to the hlt instruction if it ever wakes up due to a + non-maskable interrupt occurring or due to system management mode. + */ + cli + jmp quit quit: - hlt - jmp quit + hlt + jmp quit /* Set the size of the _start symbol to the current location '.' minus its start. diff --git a/kernel/boot/init/crti.s b/kernel/boot/init/crti.s index 8ea5c60..2819b76 100644 --- a/kernel/boot/init/crti.s +++ b/kernel/boot/init/crti.s @@ -1,33 +1,33 @@ /* -* CMOS -* Copyright (C) 2024 Raghuram Subramani <raghus2247@gmail.com> -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ + * CMOS + * Copyright (C) 2024 Raghuram Subramani <raghus2247@gmail.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ .section .init .global _init .type _init, @function _init: - push %ebp - mov %esp, %ebp - /* gcc will nicely put the contents of crtbegin.o's .init section here. */ + push %ebp + mov %esp, %ebp + /* gcc will nicely put the contents of crtbegin.o's .init section here. */ .section .fini .global _fini .type _fini, @function _fini: - push %ebp - mov %esp, %ebp - /* gcc will nicely put the contents of crtbegin.o's .fini section here. */ + push %ebp + mov %esp, %ebp + /* gcc will nicely put the contents of crtbegin.o's .fini section here. */ diff --git a/kernel/boot/init/crtn.s b/kernel/boot/init/crtn.s index 7109b57..f5186e2 100644 --- a/kernel/boot/init/crtn.s +++ b/kernel/boot/init/crtn.s @@ -1,27 +1,27 @@ /* -* CMOS -* Copyright (C) 2024 Raghuram Subramani <raghus2247@gmail.com> -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ + * CMOS + * Copyright (C) 2024 Raghuram Subramani <raghus2247@gmail.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ .section .init - /* gcc will nicely put the contents of crtend.o's .init section here. */ - popl %ebp - ret + /* gcc will nicely put the contents of crtend.o's .init section here. */ + popl %ebp + ret .section .fini - /* gcc will nicely put the contents of crtend.o's .fini section here. */ - popl %ebp - ret + /* gcc will nicely put the contents of crtend.o's .fini section here. */ + popl %ebp + ret diff --git a/kernel/boot/link.ld b/kernel/boot/link.ld index 75239d2..e2ae26c 100644 --- a/kernel/boot/link.ld +++ b/kernel/boot/link.ld @@ -1,20 +1,20 @@ /* -* CMOS -* Copyright (C) 2024 Raghuram Subramani <raghus2247@gmail.com> -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ + * CMOS + * Copyright (C) 2024 Raghuram Subramani <raghus2247@gmail.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ /* The bootloader will look at this image and start execution at the symbol designated as the entry point. */ @@ -24,7 +24,7 @@ ENTRY(_start) kernel image. */ SECTIONS { - /* It used to be universally recommended to use 1M as a start offset, + /* It used to be universally recommended to use 1M as a start offset, as it was effectively guaranteed to be available under BIOS systems. However, UEFI has made things more complicated, and experimental data strongly suggests that 2M is a safer place to load. In 2016, a new @@ -35,36 +35,36 @@ SECTIONS memory which is verified to be available by the firmware, in order to work around this issue. This does not use that feature, so 2M was chosen as a safer option than the traditional 1M. */ - . = 2M; + . = 2M; - /* First put the multiboot header, as it is required to be put very early + /* First put the multiboot header, as it is required to be put very early in the image or the bootloader won't recognize the file format. Next we'll put the .text section. */ - .text BLOCK(4K) : ALIGN(4K) - { - *(.multiboot) - *(.text) - } + .text BLOCK(4K) : ALIGN(4K) + { + *(.multiboot) + *(.text) + } - /* Read-only data. */ - .rodata BLOCK(4K) : ALIGN(4K) - { - *(.rodata) - } + /* Read-only data. */ + .rodata BLOCK(4K) : ALIGN(4K) + { + *(.rodata) + } - /* Read-write data (initialized) */ - .data BLOCK(4K) : ALIGN(4K) - { - *(.data) - } + /* Read-write data (initialized) */ + .data BLOCK(4K) : ALIGN(4K) + { + *(.data) + } - /* Read-write data (uninitialized) and stack */ - .bss BLOCK(4K) : ALIGN(4K) - { - *(COMMON) - *(.bss) - } + /* Read-write data (uninitialized) and stack */ + .bss BLOCK(4K) : ALIGN(4K) + { + *(COMMON) + *(.bss) + } - /* The compiler may produce other sections, by default it will put them in + /* The compiler may produce other sections, by default it will put them in a segment with the same name. Simply add stuff here as needed. */ } |