最近因为做的东西太底层,所以有幸接触了linux系统的内核,所以对操作系统产生兴趣 ,也知道了通过什么途径可以接触到系统的相关知识 ,感觉学到很多东西 ,目前的想法是白天在公司分析驱动 ,晚上分析操作系统嘿嘿 ,累了些 ,但感觉很好
我用的是linux-0.11-devel-040809带gcc 核原码的系统 ,前几天终于琢磨出来怎么在bochs上面编译核调试内核 。但是发现内核内容太多所以先从启动部分学习起
废话少说,在参考并且试验网络文章《自己动手写操作系统〉〉失败后 (主要原因是ld86 0.11 没有 - d 选项),经过几天的徘徊 ,终于想另外的办法 ,不就是构造一个软盘或软盘IMG文件么,俺自己写汇编生成BIN然后自己用ULTRA_EDIT拷贝到IMG文件上 ,通过痛苦的实验 ,可以是可以了 但好辛苦 ,我都要哭了 ,这个时候发现俺买过的一本书上有系统试验指南 ,靠,发现的太晚了吧 (以前看到也不明白做什么的) 于是发现了 PARTCOPY NASM等工具这下好了 可以干活了
于是cp了一段启动代码
------------------------------------------------------------
; boot.asm
; 从磁盘扇区装载另外一个程序,并且执行
[ORG 0]
jmp 07C0h:start ; 跳转到段07C0
start:
; 设置段寄存器
mov ax, cs ;将代码段的内容装载到数据寄存器
mov ds, ax ;讲数据段内容放入数据段寄存器
mov es, ax ;讲数据段内容放入扩展段
reset: ; 重置软盘驱动器
mov ax, 0 ;
mov dl, 0 ; Drive=0 (=A)
int 13h ;
jc reset ; ERROR => reset again
read:
mov ax, 1000h ; ES:BX = 1000:0000
mov es, ax ;
mov bx, 0 ;
mov ah, 2 ; 读取磁盘数据到地址ES:BX
mov al, 5 ; 读取5个扇区
mov ch, 0 ; Cylinder=0
mov cl, 2 ; Sector=2
mov dh, 0 ; Head=0
mov dl, 0 ; Drive=0
int 13h ; Read!
jc read ; ERROR => Try again
jmp 1000h:0000 ; 跳转到被装载的程序处,开始执行
times 510-($-$$) db 0
dw 0AA55h
-----------------------------------------------------------------
嘿嘿 ,毕竟是第一次这么干 ,有人要偷笑了
; prog.ASM
; 被引导程序装载的程序
; 在屏幕上打印:Program Loaded Succeed! Hello, myos!
[ORG 0]
jmp start2 ; Goto segment 07C0
; 定义需要打印的字符串
msg db 'Program Loaded Succeed! Hello, myos!',$0
start2:
; 设置段寄存器
mov ax, cs
mov ds, ax
mov es, ax
mov si, msg ; 打印字符串
print:
lodsb ; AL=字符串存放在DS:SI
cmp al, 0 ; If AL=0 then hang
je hang
mov ah, 0Eh ; Print AL
mov bx, 7
int 10h
jmp print ; 打印下一个字符
hang: ; 挂起计算机!
jmp hang
------------------------------------------------------------------
这两天走了很多弯路 ,碰到一些困难 ,总不能一点都不写吧 ,呵呵管它呢 ,也不知道书的作者会不会骂我,反正俺学过做过的就是自己的,俺也不指望做网站卖钱 ,俺就是图个兴趣,按照书里面的步骤写的 。
然后再编译上面2个代码
nasm boot.asm -o boot.bin
nasm prog.asm -o prog.bin
然后用ultera_edit将boot.bin的内容拷贝到软盘img文件的0-512字节 ,prog.bin拷贝到512后面的字节 ,然后用这个新的img文件引导linxu0.11 ,管它的反正是引导成功 ,打印出来hello,myos!
今天虽然依葫芦画瓢引导成功,但里面的内容很多不太明白 ,以后会详细分析这个引导文件 。太晚了休息了嘿嘿
阅读(953) | 评论(0) | 转发(0) |