能力值:
( LV2,RANK:10 )
|
-
-
2 楼
具体调用请参见bios中断调用0x10h
$本行
$$首地址
|
能力值:
( LV3,RANK:20 )
|
-
-
3 楼
编译出来个boot.bin应该怎么运行呢?没有软盘,只有U盘,
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
用virtual pc创建一个1.44m软盘镜像,改后缀名为img,利用下载的exe,加载进img,然后创建一个虚拟机,启动后,在菜单软驱的载入虚拟软盘映像,重新启动虚拟机,就okay了
|
能力值:
( LV3,RANK:20 )
|
-
-
5 楼
描述的很详细,非常感谢,
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
没必要这么麻烦,去下载个DOS,直接编译成COM在DOS下运行
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
之所以说是操作系统,意思就是要在没有DOS支持的环境中运行。在这里,程序就是要通过加电从软盘引导操作系统的机制来启动和执行楼主的代码。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
好,谢谢楼主,试试
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
操作系统好复杂的,这个最多是个BootLoad,用于装载系统部分
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
感觉不是很容易的,需要多试。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
看贴,回贴。这个我好像看过灰太郎的视频。
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
和《自己动手写操作系统》差不多。
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
是大灰狼吗??
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
操作系统不好写吧
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
学习学习!!!
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
用IDAPRO反汇编boot.bin得到
mov cx, 10h
seg000:0003
seg000:0003 loc_3: ; CODE XREF: seg000:0022j
seg000:0003 or cx, cx
seg000:0005 jz short loc_25
seg000:0007 mov ah, 2
seg000:0009 mov bh, 0
seg000:000B mov dh, cl
seg000:000D mov dl, 0
seg000:000F int 10h ; - VIDEO - SET CURSOR POSITION
seg000:000F ; DH,DL = row, column (0,0 = upper left)
seg000:000F ; BH = page number
seg000:0011 mov dx, cx
seg000:0013 mov ah, 9
seg000:0015 mov al, dl
seg000:0017 add al, 40h ; '@'
seg000:0019 mov bl, 7
seg000:001B mov cx, dx
seg000:001D int 10h ; - VIDEO - WRITE ATTRIBUTES/CHARACTERS AT CURSOR POSITION
seg000:001D ; AL = character, BH = display page
seg000:001D ; BL = attributes of character (alpha modes) or color (graphics modes)
seg000:001D ; CX = number of times to write character
seg000:001F mov cx, dx
seg000:0021 dec cx
seg000:0022 jmp loc_3
seg000:0025 ; ---------------------------------------------------------------------------
seg000:0025
seg000:0025 loc_25: ; CODE XREF: seg000:0005j
seg000:0025 ; seg000:loc_25j
seg000:0025 jmp loc_25
用ultraedit打开bin发现和代码完全一一对应。
用ultraedit打开img发现和代码完全一一对应,并且加载到第一扇区第一字节。用ultraedit强行加载到7c00,将前512字节清零,发现运行错误,
将以下语句删除
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
结果运行仍然正常,开始怀疑virtual pc 2007正确性
下载bochs
新建启动文件os.bxrc,内容如下
# what disk images will be used
floppya: 1_44=os.img, status=inserted
# choose the boot disk.
boot: floppy
# where do we send log messages?
log: bochsout.txt
# disable the mouse, since DLX is text only
mouse: enabled=0
然后启动,删除55aa标志的版本运行错误,
加上55aa,okay。
所以确定应该读512-4如果是55aa就进行加载。
结论:确保正确启动的关键是508字节开始的55AA标志,virtaul pc 2007也没什么问题,他不看标志,直接从0磁道0扇区开始运行。
加清屏完整版本
MOV AX,0600H
MOV BH,07
MOV CX,0000
MOV DX,184FH
INT 10H
mov cx,10h ; 设置变量
st:
or cx,cx
JZ hq
MOV AH,02H
MOV BH,0
MOV DH,CL
MOV DL,0
INT 10H ;
MOV DX,CX
MOV AH,09H
MOV AL, DL;
ADD AL,64
MOV BL,4
MOV CX,DX
INT 10H ;
MOV CX,DX
DEC CX
jmp st
hq:
jmp $
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
用IDAPRO反汇编boot.bin得到
mov cx, 10h
seg000:0003
seg000:0003 loc_3: ; CODE XREF: seg000:0022j
seg000:0003 or cx, cx
seg000:0005 jz short loc_25
seg000:0007 mov ah, 2
seg000:0009 mov bh, 0
seg000:000B mov dh, cl
seg000:000D mov dl, 0
seg000:000F int 10h ; - VIDEO - SET CURSOR POSITION
seg000:000F ; DH,DL = row, column (0,0 = upper left)
seg000:000F ; BH = page number
seg000:0011 mov dx, cx
seg000:0013 mov ah, 9
seg000:0015 mov al, dl
seg000:0017 add al, 40h ; '@'
seg000:0019 mov bl, 7
seg000:001B mov cx, dx
seg000:001D int 10h ; - VIDEO - WRITE ATTRIBUTES/CHARACTERS AT CURSOR POSITION
seg000:001D ; AL = character, BH = display page
seg000:001D ; BL = attributes of character (alpha modes) or color (graphics modes)
seg000:001D ; CX = number of times to write character
seg000:001F mov cx, dx
seg000:0021 dec cx
seg000:0022 jmp loc_3
seg000:0025 ; ---------------------------------------------------------------------------
seg000:0025
seg000:0025 loc_25: ; CODE XREF: seg000:0005j
seg000:0025 ; seg000:loc_25j
seg000:0025 jmp loc_25
用ultraedit打开bin发现和代码完全一一对应。
用ultraedit打开img发现和代码完全一一对应,并且加载到第一扇区第一字节。用ultraedit强行加载到7c00,将前512字节清零,发现运行错误,
将以下语句删除
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
结果运行仍然正常,开始怀疑virtual pc 2007正确性
下载bochs
新建启动文件os.bxrc,内容如下
# what disk images will be used
floppya: 1_44=os.img, status=inserted
# choose the boot disk.
boot: floppy
# where do we send log messages?
log: bochsout.txt
# disable the mouse, since DLX is text only
mouse: enabled=0
然后启动,删除55aa标志的版本运行错误,
加上55aa,okay。
所以确定应该读512-4如果是55aa就进行加载。
结论:确保正确启动的关键是508字节开始的55AA标志,virtaul pc 2007也没什么问题,他不看标志,直接从0磁道0扇区开始运行。
附:加清屏完整版本
MOV AX,0600H
MOV BH,07
MOV CX,0000
MOV DX,184FH
INT 10H
mov cx,10h ; 设置变量
st:
or cx,cx
JZ hq
MOV AH,02H
MOV BH,0
MOV DH,CL
MOV DL,0
INT 10H ;
MOV DX,CX
MOV AH,09H
MOV AL, DL;
ADD AL,64
MOV BL,4
MOV CX,DX
INT 10H ;
MOV CX,DX
DEC CX
jmp st
hq:
jmp $
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
未完待续
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
楼主的速度蛮快的,顶一个
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
我在学的c51里也有操作系统,参考一下
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
为验证bios确实只将512字节读入0x7c00,(一扇区512字节)
修改代码如下:
mov ax,0
mov es,ax
mov bx,7e00h
mov ah,02
mov al,1
mov ch,0
mov cl,2
mov dh,0
mov dl,0
int 13h ;加载软盘第二扇区到7c00h+512d(200h)=7e00
jmp start
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
start:
MOV AX,0600H
MOV BH,07
MOV CX,0000
MOV DX,184FH
INT 10H
mov cx,10h ; 设置变量
st:
or cx,cx
JZ hq
MOV AH,02H
MOV BH,0
MOV DH,CL
MOV DL,0
INT 10H ;
MOV DX,CX
MOV AH,09H
MOV AL, DL;
ADD AL,64
MOV BL,4
MOV CX,DX
INT 10H ;
MOV CX,DX
DEC CX
jmp st
hq:
jmp $
okay,程序运行非常良好,
删除载入磁盘到内存的bios调用,程序运行出现问题,
原来bios只加载512字节,绝不多加一点!
删除后代码如下
jmp start
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
start:
MOV AX,0600H
MOV BH,07
MOV CX,0000
MOV DX,184FH
INT 10H
mov cx,10h ; 设置变量
st:
or cx,cx
JZ hq
MOV AH,02H
MOV BH,0
MOV DH,CL
MOV DL,0
INT 10H ;
MOV DX,CX
MOV AH,09H
MOV AL, DL;
ADD AL,64
MOV BL,4
MOV CX,DX
INT 10H ;
MOV CX,DX
DEC CX
jmp st
hq:
jmp $
由于超过512字节floppy writer不起作用,所以用vc2008带的二进制编辑器进行复制粘贴。效果不是一般的好!以上测试均在bochs下进行。
由于已经能读写软盘,所以整个软盘都在手中,当然1m实模式内存限制还是在的,于是dos功能都可以在此基础上实现。
dos源码(选录一点):
ORIGIN EQU 7C00H ; Origin of bootstrap LOADER
....
org origin + (SECTOR_SIZE - 2)
db 55h,0aah ; Boot sector signature
呵呵,尽在不言中!
以后就是可怕的也许是设计者哪根筋有问题的保护模式
未完待续
|
能力值:
( LV9,RANK:140 )
|
-
-
21 楼
http://www.hacksign.cn/blog/?cat=12
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
路过学习下,感谢分享!
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
看到过余渊写过的动手写操作系统,想学来着,可是一直没认真来弄过,感谢LZ
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
写的不错的啊
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
再次见证,学习!
|
|
|