自制OS 5-1==用C语言不用C库写内核。一个独立内核OS的制作

汇编语言的可读性太差

mbr->loader->kernel

loader的作用:启动保护模式,拉入kernel

提前将mbr和loader存放在0扇区前512字节和1扇区,将kernel代码存放在9扇区。加电后bios扫描0扇区前512字节也就是mbr代码,加载到7c00处,然后从7c00处执行mbr程序,mbr程序去第二扇区加载loader,.bin到BIOS的可用区域的0x900,mbr执行完后jmp到0x900执行loader中编写的内容。loder中将9扇区的kernel加载到BIOS的0x1500位置,loader执行完后跳到0x1500执行kernel的内容。

编写liba.asm,封装汇编操作

编写stringio.h,

编写扩展内核libc.c

编写oskernel.c

自制OS 5-1==用C语言不用C库写内核。一个独立内核OS的制作_第1张图片

 四个文件上次到Ubuntu后编译

编写执行编译的脚本,减少重复写命令

#!/bin/bash
rm -rf temp
mkdir temp

nasm -f elf32 oskernel.asm -o ./temp/oskernel.o
nasm -f elf32 liba.asm -o ./temp/liba.o 

gcc -c -m16 -march=i386 -masm=intel -nostdlib -ffreestanding -mpreferred-stack-boundary=2 -lgcc -shared libc.c -o ./temp/libc.o

ld -m elf_i386 -N -Ttext 0x8000 --oformat binary ./temp/oskernel.o ./temp/liba.o ./temp/libc.o -o ./temp/kernel.bin
echo "Done!"

编译

自制OS 5-1==用C语言不用C库写内核。一个独立内核OS的制作_第2张图片

然后将kernel.bin拷贝到win上 ,使用dd写入虚拟磁盘.

用Bochs-win64-2.6.11.exe启动

你可能感兴趣的:(操作系统,linux,运维,服务器)