首页
社区
课程
招聘
[分享]学写操作系统(一)……(十五)
发表于: 2010-12-30 01:27 19066

[分享]学写操作系统(一)……(十五)

2010-12-30 01:27
19066

先下载virtual pc 2007
然后下载nasm
http://sourceforge.net/projects/nasm
下载附件FloppyWriter.rar
将nasm安装后目录加入环境变量
敲入如下文本
        org        07c00h                        ; 告诉编译器程序加载到7c00处
        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;'A'
        ADD AL,64
        MOV BL,7
        MOV CX,DX
        INT 10H ;
       
        MOV CX,DX
        DEC CX       
        jmp st
       
hq:
        jmp $
times         510-($-$$)        db        0        ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw         0xaa55                                ; 结束标志

存为boot.asm
命令行编译
nasm boot.asm -o boot.bin
用virtual pc生成img软盘映像
然后用FloppyWriter.exe将boot.bin加入img
加载进virtual pc,
结果如下:(第一行空)

A
BB
CCC
DDDD
EEEEE
FFFFFF
...
一直到
pppppppp...

oh yea,很简单是不!


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (77)
雪    币: 81
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
具体调用请参见bios中断调用0x10h
$本行
$$首地址
2010-12-30 01:33
0
雪    币: 114
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
编译出来个boot.bin应该怎么运行呢?没有软盘,只有U盘,
2010-12-30 01:34
0
雪    币: 81
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
用virtual pc创建一个1.44m软盘镜像,改后缀名为img,利用下载的exe,加载进img,然后创建一个虚拟机,启动后,在菜单软驱的载入虚拟软盘映像,重新启动虚拟机,就okay了
2010-12-30 01:38
0
雪    币: 114
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
描述的很详细,非常感谢,
2010-12-30 01:42
0
雪    币: 0
活跃值: (329)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
没必要这么麻烦,去下载个DOS,直接编译成COM在DOS下运行
2010-12-30 05:54
0
雪    币: 807
活跃值: (2273)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
之所以说是操作系统,意思就是要在没有DOS支持的环境中运行。在这里,程序就是要通过加电从软盘引导操作系统的机制来启动和执行楼主的代码。
2010-12-30 07:39
0
雪    币: 60
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
好,谢谢楼主,试试
2010-12-30 07:56
0
雪    币: 108
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
操作系统好复杂的,这个最多是个BootLoad,用于装载系统部分
2010-12-30 08:08
0
雪    币: 5
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
感觉不是很容易的,需要多试。
2010-12-30 08:35
0
雪    币: 156
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
看贴,回贴。这个我好像看过灰太郎的视频。
2010-12-30 08:41
0
雪    币: 579
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
和《自己动手写操作系统》差不多。
2010-12-30 09:23
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
是大灰狼吗??
2010-12-30 15:20
0
雪    币: 671
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
操作系统不好写吧
2010-12-30 15:22
0
雪    币: 122
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
学习学习!!!
2010-12-30 16:40
0
雪    币: 81
活跃值: (25)
能力值: ( 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                                ; 结束标志
上传的附件:
2010-12-30 21:28
0
雪    币: 81
活跃值: (25)
能力值: ( 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        ; 结束标志

未完待续
上传的附件:
2010-12-30 21:47
0
雪    币: 122
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
楼主的速度蛮快的,顶一个
2010-12-30 22:14
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
我在学的c51里也有操作系统,参考一下
2010-12-30 22:22
0
雪    币: 81
活跃值: (25)
能力值: ( 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

呵呵,尽在不言中!
以后就是可怕的也许是设计者哪根筋有问题的保护模式
未完待续
2010-12-31 01:35
0
雪    币: 2332
活跃值: (3804)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
21
http://www.hacksign.cn/blog/?cat=12
2010-12-31 09:56
0
雪    币: 261
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
路过学习下,感谢分享!
2010-12-31 10:04
0
雪    币: 307
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
看到过余渊写过的动手写操作系统,想学来着,可是一直没认真来弄过,感谢LZ
2010-12-31 10:43
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
写的不错的啊
2010-12-31 11:09
0
雪    币: 122
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
再次见证,学习!
2010-12-31 11:12
0
游客
登录 | 注册 方可回帖
返回
//