Kernel Development === Overview --- Source Code: [starOS](https://github.com/zoanana990/starOS.git) ## Memory What is memoery? - Memory is a piece of hardware that allows computers to store information - RAM(Random Access Memory) is your computers main memory, here programs can read and write information - Temporary storage - Data is lost when you power down your computer - ROM(Read Only Memory) is a form of memory that can only be read from - Permanent storage - Used for storing permanent programs that will not change, for example: embedded device and BIOS 記憶體以線性的方式儲存,當我們需要進行記憶體存取時,不需要過多的擔心 ## Boot Steps to a booted system - The BIOS is executed directly from ROM - The BIOS loads the bootloader into address 0x7C00 - The bootloader loads the kernel What is a bootloader? - A bootloader is a small program responsible for loading the kernel of an operating system kernel - They are small - For example: Linux and GRUB The BIOS is executed directly from ROM - The CPU executes instructions from the BIOS's ROM - The BIOS gernally loads itself into RAM then continues execution from RAM - The BIOS will initialize essential hardware - The BIOS looks for a bootloader to boot by searching all storage mediums for boot signature "0x55AA" > 如果先找到 0x55AA 則會啟動 bootloader,將 bootloader 放入 0x7C00 當中後執行 The BIOS is a kernel - The BIOS contains routines to assist our bootloader in booting our kernel - The BIOS is 16 bit code which means only 16 bit code can execute it properly - The BIOS routines are gerneric and a standard ## Hello World Using x86_64 print the "Hello World" First, Check the interrupt in the [Ralf Brown's Interrupt List Indexed HTML Version - Release 61](https://www.ctyme.com/rbrown.htm) See [VIDEO - TELETYPE OUTPUT](http://www.ctyme.com/intr/rb-0106.htm), we find that the registers need to be setting as following: ```asm AH = 0Eh AL = character to write BH = page number BL = foreground color (graphics modes only) ``` Assemble: ```shell $nasm -f bin ./boot.asm -o ./boot.bin ``` Using qemu to simulate: ```shell $ ``` ## Read Mode Development ### Real Mode - 1 MB of RAM accessible - Memory access is done through the segmentation memory model, that is segments and offset - Only 1 MB of RAM is accessible, no matter if you have 4 GB RAM - Based on the original x86 design - When in real mode, we have same limitations as the older processors from many years ago. - No security, modern operating system can set up specific security rule, prevent user from malicious programs - Real mode provides no memory security - Real mode provides no hardware security - Simple user programs can destrioy our operating system with no way for us to stop them - Kernel is act the layer between hardware and software - 16 bit's Accessible at one time - In real mode, we can only access the 8 bit and 16 bit registers - We can only request memory address offsets up to 65536, that is 65 kb. We can use segments and offset to access 1 MB - All operations can only be done with 16 bit numbers. - Read mode is compatability mode ### Segmentation Memory Model - Memory is accessed by a segment and an offset - Programs can be loaded in different areas of memory but without problems - Multiple segments are available through the use of segment registers 8086 Segment Registers - CS: Code Segment - SS: Stack Segment - DS: Data Segment - ES: Extra Segment Caluating Absolute Offset - Take segment register and multiply it and add the offset - Example: - Code segment: 0x7c0 - Assembly origin "org" is zero - Our first instruction is at origin zero so our offset is zero - (0x7c0) * 16 = 0x7c00 - 0x7c00 + 0 = 0x7c00 Different Instructions use different segment registers - "lodsb" uses the DS:SI register combination ```c Org 0 mov ax, 0x7c0 mov ds, ax mov si, 0x1f lodsb ``` - lodsb will know that the byte it need to read is in 0x7c0*16+0x1f = 0x7c1f Programs can be loaded in different areas of memory but run without problems - Imagine we have two programs loaded into memory, both were assembled with the origin being zero - Program 1 uses segment 0x7c0 for all its segment registers - Program 1 is loaded at address 0x7c00 - Program 2 uses segment 0x7d0 for all its segment registers - Program 2 is loaded at address 0x7d00 - We swap our segment registers when switching to the other process - We store all the registers of the process we are switching too Stack Segment - SS(Stack Segment) = 0x00 - SP(Stack Pointer) = 0x7c00 - Push 0xffff - decrement stack pointer by 2 - stack pointer = 0x7bfe - set 0x7bfe - 0x7bff to 0xffff ### Interrupt ### File System - File does not exist - Data is read and written in sectors - CHS() -
{"metaMigratedAt":"2023-06-17T02:49:34.500Z","metaMigratedFrom":"YAML","title":"Kernel Development","breaks":true,"contributors":"[{\"id\":\"03f294c9-4f9f-49fa-a014-87a93ce0b071\",\"add\":5122,\"del\":400}]"}
Expand menu