我们编写一个操作系统。第1部分。加载程序

大家好!今天,我们将编写一个引导加载程序,它将输出“ Hello World”并在VirtualBox上运行。我们将用汇编程序FASM编写。您可以从这里下载我们还将需要VirtualBoxUltraISO在编写代码之前,我们将了解操作系统如何加载。

因此,当我们按下计算机上的大电源按钮时,系统即会在任何计算机上启动-BIOS(基本输入/输出系统或基本输入/输出系统)。BIOS任务是:


  1. 检测所有连接的设备并检查其可操作性。POST程序(开机自检,开机自检)对此负责。如果未检测到重要的熨斗,则系统扬声器(如果有)将发出难以理解的声音,并且下载将继续进行。
  2. 为操作系统提供使用硬件的功能。
  3. 将引导设备的第一个扇区读入偏移量为0x7C00h的RAM的零段中,并在那里进行控制。磁盘上的1个扇区为512字节。因此,我们的引导加载程序不应超过512个字节。BIOS通过在最后两个字节中出现0x55和0xAA来确定该扇区是可引导的。

现在您可以开始编写代码了。运行文件FASMW.EXE,该文件位于FASM归档文件中,并在其中插入以下代码:

org 7C00h

 start:
    cli              ;  (   )
    xor ax, ax       ;  ax
    mov ds, ax       ; dataSegment   
    mov es, ax       ;  es   
    mov ss, ax       ; StackSegment   
    mov sp, 07C00h   ;    
    sti              ; 

  ; 
  mov ax, 3
  int 10h

  mov ah, 2h
  mov dh, 0
  mov dl, 0
  xor bh, bh
  int 10h

  ; 
  mov ax, 1301h
  mov bp, message
  mov cx, 12
  mov bl, 02h
  int 10h

  jmp $

message db 'Hello World!',0

times 510 - ($ - $$) db 0 ;     510- 
db 0x55, 0xAA ;   

此代码需要一些解释。团队

org 7C00h

我们说代码需要以0x7C00加载到RAM中。排队

  mov ax, 3
  int 10h

我们将视频模式设置为80x25(每行80个字符和25行),从而清除屏幕。

  mov ah, 2h
  mov dh, 0
  mov dl, 0
  xor bh, bh
  int 10h

在这里我们设置光标。2h中断10h功能对此负责。在寄存器dh中,我们将光标的坐标放在Y中,在寄存器dl中,将其坐标放在X中。

  mov ax, 1301h
  mov bp, message
  mov cx, 12
  mov bl, 02h
  int 10h

我们打印一条线。13h中断10h功能对此负责。在bp寄存器中,我们将字符串本身放在字符串中,在cx寄存器中,将字符串中字符的数量放入列表中,在bl寄存器中,将属性设置为黑色,在本例中为颜色。前4位影响背景颜色,后4位影响文本颜色。下面是颜色表

0 - , 1 - , 2 - , 3 - , 4 - , 5 - , 6 - , 7 - -, 8 - -, 9 - -, A - -, B - -, C - -, D- -, E - -, F – .

排队

jmp $

程序冻结。

我们通过按Ctrl + F9组合代码,并将结果文件另存为boot.bin。

发射


启动UltraISO并将我们的二进制文件拖到一个特殊区域(带有红色箭头标记)。



接下来,右键单击binarink,然后按带有以下字样的按钮:“安装为启动文件”。接下来,以ISO格式保存文件。
打开VIrtualBox并创建一个新的虚拟机(如果您不知道如何执行此操作,请单击此处)。因此,在创建虚拟机之后,单击“配置”,选择“媒体”项,然后单击“空”,其中“驱动器”是光盘图标。我们单击它,然后选择“选择光盘映像”,查找我们的ISO文件,然后单击“打开”。我们保存所有设置并启动虚拟机。屏幕上出现我们的“ Hello World!”。



至此,第一个问题告一段落。在下一部分中,我们将教我们的引导加载程序读取磁盘扇区并引导其第一个内核!


All Articles