自己动手写操作系统
前面已经分析过了boot.asm和loader.asm的代码,有Text版本和VGA版本。
Text版本的Kernel书里有,直接看就可以。
本此学习时VGA版本的Kernel,因为书里没有,在网上没有看到,自己整合了两本书的内容。
由于没有找到支持windows的支持elf_i386的ld命令。所以本Kernel.bin是在linux下编译的。
boot.asm
[BITS 32] ; 以32位编译
section .text
jmp start
global start
global io_hlt
global write_mem8
[EXTERN kernel_main] ; 内核入口函数, EXTERN表明此符号在外部定义
start:
cli ; 禁用中断
call kernel_main ; 调用内核入口函数
jmp $ ; 无限循环
io_hlt: ; void io_hlt(void);
HLT
RET
write_mem8: ; void write_mem8(int addr, int data);
MOV ECX,[ESP+4] ; [ESP+4]=> C语言传过来的第一个参数
MOV AL,[ESP+8] ; [ESP+8]=> C语言传过来的第二个参数
MOV [ECX],AL
RET
kernel.c
void io_hlt(void);
void write_mem8(int addr, int data);
int kernel_main()
{
int i;
for (i = 0xa0000; i <= 0xaffff; i++) {
;write_mem8(i, 15); /* MOV BYTE [i],15 */
write_mem8(i, i & 0x0f); /* MOV BYTE [i],15 */
}
for (;;) {
io_hlt();
}
}
link.ld
/***************************
* 文件名: link.ld
***************************/
ENTRY(start)
SECTIONS
{
. = 0x100000;
.text :
{
*(.text)
. = ALIGN(4096);
}
.data :
{
*(.data)
*(.rodata)
. = ALIGN(4096);
}
}
nasm -f elf boot.asm -o boot.o
gcc -m32 -c -o kernel.o kernel.c
ld -Ttext 0x30400 -T link.ld -m elf_i386 -nostdlib boot.o kernel.o -o kernel.bin
制作驱动文件
把boot.bin
loader.bin
kerlen.bin导入到img文件中
并把boot.bin设置为引导文件
执行
学后感:
32位保护模式下的Text或VGA操作都有了,剩下的就是去理解各种的文件格式,解析文件格式,显示到自己的操作系统上。
包括文件系统格式(FAT12,fat32,NTFS。。。。),应用程序文件格式(Linux下是ELF,Window是PE)、以及其他二进制文件格式(BMG、JPG。。。。)等等等等
文章最后发布于: 2019-04-17 23:51:09
相关阅读
引言: 如何写出最有价值的软文,一直都是营销推广的核心!应该用怎样的方法,才可以将软文的价值完全发挥出来?又有怎样的写作技巧,让我们
先让自己活下去,让那些高大上的口号文案先等一等呢,它们总有一天会适合你!之前有一个企业的老板,问过我一个的问题,很具有代表性,今天单
一.坚信99.9%的成功来源于软文如果你不赞同我的观点,请你右上角关掉。谢谢!如果你继续阅读的话,恭喜你,这是一篇价值二十万元人民币
操作系统 - http://bbs.pcbeta.com
模拟FindWindow函数,绕过所有用户层HOOK 分析API函数原理 FindWindowA最外层流程: 进入CALL USER32.77D28242: 进入CALL USER