# OsFrame **Repository Path**: wqz2001/OsFrame ## Basic Information - **Project Name**: OsFrame - **Description**: 一个超简易的bootloder,里面的start是一个可以进程调度的“操作系统”,可以作为开始学习操作系统的起点。 本项目代码基于《OrangeS:一个操作系统的实现》、《庖丁解牛Linux内核分析》 - **Primary Language**: 汇编 - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-04-17 - **Last Updated**: 2022-10-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README nasm -f elf kernel.asm -o 2.o gcc -c 1.c -o 1.o -m32 ld -m elf_i386 1.o 2.o -o kernel.bin ;*************************************************************** jmp SelectorFlatC:KernelEntryPointPhyAddr ; 正式进入内核 * ;*************************************************************** ; 内存看上去是这样的: ; ┃ ┃ ; ┃ . ┃ ; ┃ . ┃ ; ┃ . ┃ ; ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ; ┃■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■┃ ; ┃■■■■■■■■■■■■Page Tables■■■■■■■■■■■■┃ ; ┃■■■■■■■■■■(大小由LOADER决定)■■■■■■■■■┃ ; 00101000h ┃■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■┃ PageTblBase ; ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ; ┃■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■┃ ; 00100000h ┃■■■■■■■■Page Directory Table■■■■■■■■┃ PageDirBase <- 1M ; ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ; ┃□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□┃ ; F0000h ┃□□□□□□□□□□□□□□System ROM□□□□□□□□□□□□┃ ; ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ; ┃□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□┃ ; E0000h ┃□□□□□Expansion of system ROM □□□□□□□┃ ; ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ; ┃□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□┃ ; C0000h ┃□□□□Reserved for ROM expansion□□□□□□┃ ; ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ; ┃□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□┃ B8000h ← gs ; A0000h ┃□□□□□□Display adapter reserved□□□□□□┃ ; ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ; ┃□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□┃ ; 9FC00h ┃□□□extended BIOS data area (EBDA)□□□┃ ; ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ; ┃■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■┃ ; 90000h ┃■■■■■■■■■■■■LOADER.BIN■■■■■■■■■■■■■■┃ somewhere in LOADER ← esp ; ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ; ┃■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■┃ ; 80000h ┃■■■■■■■■■■■■KERNEL.BIN■■■■■■■■■■■■■■┃ ; ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ; ┃■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■┃ ; 30000h ┃■■■■■■■■■■■■■■■KERNEL■■■■■■■■■■■■■■■┃ 30400h ← KERNEL 入口 (KernelEntryPointPhyAddr) ; ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ; ┃ ┃ ; 7E00h ┃ F R E E ┃ ; ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ; ┃■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■┃ ; 7C00h ┃■■■■■■■■■■■■BOOT SECTOR■■■■■■■■■■■■┃ ; ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ; ┃ ┃ ; 500h ┃ F R E E ┃ ; ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ; ┃□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□┃ ; 400h ┃□□□□□□□ROM BIOS parameter area □□□□□┃ ; ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ; ┃◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇┃ ; 0h ┃◇◇◇◇◇◇◇◇◇◇◇◇◇Int Vectors◇◇◇◇◇◇◇◇◇◇◇┃ ; ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ← cs, ds, es, fs, ss ; ; ; ┏━━━┓ ┏━━━┓ ; ┃■■■┃ 我们使用 ┃□□□┃ 不能使用的内存 ; ┗━━━┛ ┗━━━┛ ; ┏━━━┓ ┏━━━┓ ; ┃ ┃ 未使用空间 ┃◇◇◇┃ 可以覆盖的内存 ; ┗━━━┛ ┗━━━┛ ; ; 注:KERNEL 的位置实际上是很灵活的,可以通过同时改变 LOAD.INC 中的 KernelEntryPointPhyAddr 和 MAKEFILE 中参数 -Ttext 的值来改变。 ; 比如,如果把 KernelEntryPointPhyAddr 和 -Ttext 的值都改为 0x400400,则 KERNEL 就会被加载到内存 0x400000(4M) 处,入口在 0x400400。 ;