(1)打造简单OS-汇编写入引导区,虚拟机启动步骤

首先需要您在网上下载NASM编译器,可以将汇编编译为二进制文件

1.写一段汇编代码在屏幕上打印一段字符

可以运行的!并进行nasm为二进制文件,如下"test.asm"

   至于为什么这么做的问题,您可以观看后面章节,现在只要按部就班的实际操作就好,运行起来才有直观感受,理论先放后面!

  该段汇编主要是向显卡循环显示一个一个字符,最后取值为0就跳转fin执行HLT让CPU睡眠,死循环!

   要显示一个字符,BIOS中断向量表中的int 0x10则满足条件,因为现在我们要制作OS就需要脱离现有系统的概率,我们现在什么功能都没有,没有系统的情况下,现在只有利用电脑主板厂商们提供的BIOS的基本输入输出系统进行简单编程,因为这些厂商基本已经完成了,而且电脑上最基本都有这些

   AH=0X0E;AL=需要显示的字符code;BH=0;BL=颜色code

org 0x7C00    ;主引导记录的内存地址 启动区内存装载地址必须在0x7c00-0x7dff
jmp entry


entry:
  mov ax, 0
  mov ss, ax
  mov ds, ax
  mov es, ax
  mov si, msg    ;将msg地址赋给si

putLoop:
  mov al, [si]    ;等同 mov al, byte [si]  将si地址开始的一个字节的值放入al中
  add si, 1    ;si = si+1
  cmp al, 0    ;al与0比较
  je fin        ;上面比较相等 则跳转到fin 不相等则不跳转,执行后面命令
  mov ah, 0x0e
  int 0x10    ;中断
  jmp putLoop
  
 fin:
  HLT  ;暂停
  jmp fin
  
 msg:
  DB 0x0a, 0x0a
  DB "hello,jadeshu!"
  DB 0X0a
  DB 0

  用nasm输出二进制文件   

 nasm -f bin test.asm -o test.bin 

 nasm -o test.bin test.asm

即可得到test.bin文件

2.用文本工具打开test.bin查看16位进制数

3.如您擅长C++,那么可跳过此JAVA节直接观看第4点 即可

如上图显示,如果想更换字符串(暂时不能超过510字节-开始汇编所产生二进制代码的长度),那么我们只要将上面二进制内的字符更换即可,那么我们就可以重新写一个文件得到最后的文件,如下所示:

import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;

public class OperatingSystem {
    private int[] imgContent = new int[]{
    	  0xE9, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x8E, 0xD0, 0x8E,
    	  0xD8, 0x8E, 0xC0, 0xBE, 0x24, 0x7C, 0x8A, 0x04, 0x81, 
    	  0xC6, 0x01, 0x00, 0x3C, 0x00, 0x74, 0x07, 0xB4, 0x0E,
    	  0xCD, 0x10, 0xE9, 0xEF, 0xFF, 0xF4, 0xE9, 0xFC, 0xFF,
    	  0x0A, 0x0A 
    };

    private ArrayList imgByteToWrite = new ArrayList();

    public OperatingSystem(String s) {
    	// 将二进制汇编指令存入imgByteToWrite内
        for (int i = 0; i < imgContent.length; i++) {
            imgByteToWrite.add(imgContent[i]);
        }
        
        // 添加换行
        imgByteToWrite.add(0x0a);
        
        for (int j = 0; j < s.length(); j++) {
            imgByteToWrite.add((int)s.charAt(j));
        }
        
        // 添加换行
        imgByteToWrite.add(0x0a);

        int len = 0x1fe;
        int curSize = imgByteToWrite.size();
        // 从前面字符有效位(curSize)一直到0x1fe位填充0数值
        for (int k = 0; k < len - curSize; k++) {
            imgByteToWrite.add(0);
        }

        // MBR引导区结束标志0xaa55
        //0x1fe:  0x55
        //0x1ff:  0xaa
        imgByteToWrite.add(0x55);
        imgByteToWrite.add(0xaa);
    }

    public void makeFllopy()   {
        try {
            DataOutputStream out = new DataOutputStream(new FileOutputStream("system.img"));
            for (int i = 0; i < imgByteToWrite.size(); i++) {
                out.writeByte(imgByteToWrite.get(i).byteValue());
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        OperatingSystem op = new OperatingSystem("hello,jadeshu!");
        op.makeFllopy();
    }
}

        这里用java,你也可以用C/C++等都可以,最后输出一个system.img映射文件       

4.下面开始使用

   C++来把我们用nasm编译的二进制CPU可执行的文件(test)写入0磁头0磁道1扇区位置,也就是我们经常所说的MBR引导区,详情看后面的章节

   首先把上面汇编代码进行编译 cmd输入  nasm  test.asm -o test  命令,即可得到test二进制文件,然后放入工程文件内即可。  

   代码HardDisk.h和HardDisk.cpp在第三章节,我们只要改变main.cpp文件即可,如下

#include "HardDisk.h"

int main()
{
	CHardDisk disk;
	// 章节一案例
	disk.writeFileToDisk("test", true, 0, 1);
	disk.makeVirtualDisk("system01.img");

	system("pause");
	return 0;
}

  运行程序就可以生成一个system01.img二进制文件, 设置到虚拟机内,运行虚拟机即可,将会出现如上面图一样的界面!

 

5.虚拟机运行

打开虚拟机VMbox/VM新建一个虚拟机,挂载软盘指向此文件(system.img),然后启动虚拟机即可显示文字了;

虚拟机设置如下: 

(1)打造简单OS-汇编写入引导区,虚拟机启动步骤_第1张图片

运行结果如下:

(1)打造简单OS-汇编写入引导区,虚拟机启动步骤_第2张图片

小提示:或者直接用bochs模拟软件附带的bximage.exe 直接创建img文件,具体点击这里查看

6.还可以如汇编打印文字章节中描述那有打印

 

你可能感兴趣的:(系统内核与实现学习,打造简单OS)