博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个操作系统的实现-笔记
阅读量:7139 次
发布时间:2019-06-28

本文共 1497 字,大约阅读时间需要 4 分钟。

hot3.png

开发环境

操作系统:32位ubuntu 汇编编译器:nasm 虚拟机: bochs

版本0.1

代码如下

; kernel.asm; nasm -f elf kernel.asm -o kernel.o; ld -s -Ttext 0x10000 kernel.o -o kernel.bin; dd if=kernel.bin of=a.img bs=512 seek=1 conv=notrunc[bits 32][section .text]global _start_start:    mov ax, 24    mov gs, ax    mov edi, (80 * 11 + 79) * 2    mov ah, 0x0c    mov al, 'K'    mov [gs:edi], axend:    hlt    jmp end

通过readelf -a kernel.bin命令,可以得到代码在文件kernel.bin中的偏移量。 本例编译后为0x1000, 将它除以扇区大小(512),得到8,因为kernel.bin在引导扇区后面,还要加一。 所以代码在第十个扇区。 bootsec.asm 文件编译后,作为软盘的引导扇区。

; nasm bootsec.asm -o bootsec.bin; dd if=bootsec.bin of=a.img bs=512 count=1 conv=notruncorg 0x7c00jmp startgdt:    dw 0    dw 0    dw 0    dw 0gdt_code:    dw 0xffff    dw 0x0000    dw 0x9a00    dw 0x00cfgdt_data:    dw 0xffff    dw 0x0000    dw 0x92c0    dw 0x00cfgdt_video:    dw 0xffff    dw 0x8000    dw 0x920b    dw 0x0000gdtlen equ $ - gdtgdtptr dw gdtlen -1       dd 0; 使用0x13中断,将软盘的第十个扇区读入内存0x10000处。start:    mov ax, 0x1000    mov es, ax    mov bx, 0    mov ax, 0x0201    mov cx, 0x000a    mov dx, 0    int 0x13into_kernel:    xor eax, eax    mov ax, cs    shl eax, 4    add eax, gdt    mov dword [gdtptr + 2], eax    lgdt [gdtptr]    cli    in al, 0x92    or al, 00000010b    out 0x92, al    mov eax, cr0    or eax, 1    mov cr0, eax    jmp dword 0x8:0x10000fill:   times 510-($ - $$) db 0   dw 0xaa55

下面代码中,9200写成92c0,结果在加载IDT的时候,死活加载不上,坑了两天。

gdt_data:    dw 0xffff    dw 0x0000    dw 0x92c0    dw 0x00cf

转载于:https://my.oschina.net/wangconglin87/blog/548044

你可能感兴趣的文章
用NSData玩转二进制文件的读写
查看>>
用户 'NT AUTHORITY\NETWORK SERVICE' 登录失败。
查看>>
ZOJ 1871. Steps
查看>>
Win8使用技巧
查看>>
js+ajax获取文件大小
查看>>
Normalization VS Denormalization [转]
查看>>
perl 实现ascall 码转换
查看>>
KVO 进阶
查看>>
【转】plist文件的内容清空
查看>>
mysql数据库全备和全备还原(使用Xtrabackup)
查看>>
VS无法启动调试:“生成下面的模块时,启用了优化或没有调试信息“
查看>>
C#直接读取磁盘文件(类似linux的Direct IO模式)
查看>>
NHibernate使用之详细图解
查看>>
大型网站的高可用分析
查看>>
java int与integer的区别
查看>>
经典排序算法 - 基数排序Radix sort
查看>>
经典排序算法 - 梳排序Comb sort
查看>>
结构体运算符(->)
查看>>
VMware虚拟机磁盘压缩
查看>>
Windows Phone SDK 7.1 中文版本发布
查看>>