天天看点

windows操作系统_windows写操作系统

本文是操作系统真相还原在windows下的配置。

软件:

1.Bochs-2.6(注意是2.6,不要下载较新版本的,会有区别,导致错误)

2.NASM

3.wsl (用来写入,安装教程可以在其他地方找到)

一.首先我们写一个非常简单的MBR
SECTION MBR vstart=0x7c00    ;告诉编译器起始地址编译为0x7c00
    mov ax,cs    ;接下来的5行是用cs寄存器来初始化其他寄存器
    mov ds,ax     ;因为BIOS跳过来的时候cs为0,而其他段寄存器只能由寄存器赋值,所以用cs的0来初始化
    mov es,ax  
    mov ss,ax  
    mov fs,ax  
    mov sp,0x7c00    ;栈初始化,因为在内存中这一块是专门留给MBR的,所以是安全的,可以当成栈地址
;清屏用0x06功能,上卷全部行,就实现了清屏的效果
;--------------------------------------------
;INT 0x10  功能号0x06  功能描述:上卷窗口
;输入
;ah 功能号=0x06
;al 上卷的行数(0表示全部)
;bh 上卷的行属性
;(cl,ch) 窗口左上的x,y位置
;dl dh  窗口右下x,y位置
;无返回值
    mov ax,0x600  
    mov bx,0x700  
    mov cx,0  
    mov dx,0x184f  
  
    int 0x10  
 ;下三行获得光标位置
;.get_cursor获取当前光标位置,在光标位置处打印字符
    mov ah,3   ;3功能号是获取光标位置 需要存入ah寄存器
    mov bh,0    ;bh存的是待获取光标页号
    int 0x10    ;ch是光标开始行,cl是结束行
                ;dl是光标所在列号,dh是行号
;获取光标结束
  
;;;;;;;;;;;;;打印字符串;;;;;;;;;;;;
;10中断,不过这个使用13号子功能
    mov ax,message  
    mov bp,ax    ;es:bp是串首地址,es此时和cs一致,开头已经被sreg初始化
      
;光标位置要用到dx寄存器里面的内容,cx中的光标位置可以忽略
    mov cx,5     ;cx为串长度,不包括最后的结尾0
    mov ax,0x1301  ;13号子功能显示字符即属性,存入ah寄存器
                   ;al设置写字符的方式 al=01,显示字符串,光标跟随
      
    mov bx,0x2     ;bh是显示的页号,此处为0,bl是字符属性,黑底绿字02h
  
    int 0x10  ;执行中断
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  
    jmp $  ;此处悬停
  
message: db "Hello, OS"  
    times 510-($-$$) db 0  ;补齐510个字符,因为系统检查是不是MBR是看最后两个字节是否0x55,0xaa
   ;所以要留出最后两个字符
    db 0x55,0xaa              

接下来用nasm编译:

nasm -o boot.bin  boot.asm           

这个时候你就获得了一个boot.bin文件。

二.使用bximage创建一个硬盘映像

进入Bochs的安装目录,启动命令行(cmd或powershell)

画横线的表示要手动输入,箭头表示直接按回车键就好了
windows操作系统_windows写操作系统

制作一个虚拟硬盘镜像。

四.使用Cygwin将引导扇区写进软盘

运行Cygwin,进入boot.bin和hd60Mc.img所在的目录(我存放在了bochs的安装目录),输入命令:
dd if=boot.bin of=hd60Mc.img bs=512 count=1 conv=notrunc           
windows操作系统_windows写操作系统

五.使用Bochs启动刚刚写好的"操作系统"

1.写Bochs的配置文件bochsrc

bochsrc保存在Bochs的安装目录下

bochsrc配置:

#第一步,首先设置 Bochs 在运行过程中能够使用的内存,本例为 32MB
megs: 32

#第二步,设置对应真实机器的 BIOS 和 VGA BIOS
romimage: file=$BXSHARE/BIOS-bochs-latest
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest

#第三步,设置 Bochs 所使用的磁盘,软盘的关键字为 floppy。 
#若只有一个软盘,则使用 floppya 即可,若有多个,则为 floppya,floppyb… 
#floppya: 1_44=a.img, status=inserted


#第四步,选择启动盘符
#boot: floppy #默认从软盘启动,将其注释 
boot: disk  #改为从硬盘启动。我们的任何代码都将直接写在硬盘上,所以不会再有读写软盘的操作

#第五步,设置日志文件的输出
log: bochsout.txt

#第六步,开启或关闭某些功能
#下面是关闭鼠标,并打开键盘
mouse: enabled=0
keyboard_mapping: enabled=1,map=$BXSHARE/keymaps/x11-pc-us.map

# 硬盘设置
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 
ata0-master: type=disk, path="hd60Mc.img", mode=flat, cylinders=121, heads=16, spt=63

#下面的是增加bochs对gdb的支持,这样gdb便可以远程连接到此机器的1234端口调试了
#gdbstub:enabled=1, port=1234, text_base=0, data_base=0, bss_base=0           

注意:

ata0-master: type=disk, path="hd60Mc.img", mode=flat, cylinders=121, heads=16, spt=63ata0-master: type=disk, path="hd60Mc.img", mode=flat, cylinders=121, heads=16, spt=63           

这一行,都是上面运行bximage中的参数。

六.运行Bochs
windows操作系统_windows写操作系统
windows操作系统_windows写操作系统

完成

二,对于nasm的一些使用

首先,最好把nasm放入环境变量中,这样在其他文件夹下进行操作会比较方便。

对于第三章,写一个内核的加载器,作者把boot.inc(相当于一个头文件一样的东西),写在了include文件夹下,文件树:

─boot
    │  hd60M.img
    │  loader.asm
    │  MBR与显卡.asm
    │  MBR与硬盘.asm
    │
    └─include
            boot.inc           

这样的格式。所以就需要给nasm提供库目录:

nasm -I 路径  MBR与硬盘.asm -o boot.bin           

这里的路径可以写为绝对路径:D:operationbootinclude (注意最后一个斜杠必须要有)

也可写为相对路径: .include (在boot文件夹下)

于是可以用:

nasm -I .include  MBR与硬盘.asm -o boot.bin   (boot文件夹下)           

来生成boot.bin

继续阅读