当前位置: 首页 > news >正文

MyOS(一):用Java做一个最小的helloworld操作系统内核

       用Java写一个最简单的虚拟软盘,并用virtualbox运行

       将这段Java代码运行一下会生成一个system.img文件,接着利用virtualbox创建一个虚拟机,设置它为磁盘启动,并在配置中,将代码生成的system.img当做虚拟磁盘插入虚拟机

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


public class OperatingSystem {
    private int[] imgContent = new int[]{
            //这段二进制数据将是我们的HelloWorld OS的内核,它的作用是让BIOS将其加载到内存地址0x8000,然后调用BIOS终端在屏幕上打印出一行字符串
            0xeb,0x4e,0x90,0x48,0x45,0x4c,0x4c,0x4f,0x49,0x50,0x4c,0x00,0x02,0x01,0x01,0x00,0x02,0xe0,
            0x00,0x40,0x0b,0xf0,0x09,0x00,0x12,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x40,0x0b,0x00,0x00,0x00,0x00,0x29,
            0xff,0xff,0xff,0xff,0x48,0x45,0x4c,0x4c,0x4f,0x2d,0x4f,0x53,0x20,0x20,0x20,0x46,0x41,0x54,0x31,0x32,
            0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x8e,
            0xd0,0xbc,0x00,0x7c,0x8e,0xd8,0x8e,0xc0,0xbe,0x74,0x7c,0x8a,
            0x04,0x83,0xc6,0x01,0x3c,0x00,0x74,0x09,0xb4,0x0e,0xbb,0x0f,0x00,0xcd,0x10,0xeb,0xee,0xf4,0xeb,0xfd
    };

    private ArrayList<Integer> imgByteToWrite = new ArrayList<Integer>();



    public OperatingSystem(String s) {
        for (int i = 0; i < imgContent.length; i++) {
            imgByteToWrite.add(imgContent[i]);
        }

        //-----------------------------这一段是写了几个换行符,没有太大的作用,把这段删了也问题不大
        imgByteToWrite.add(0x0a);
        imgByteToWrite.add(0x0a);
        for (int j = 0; j < s.length(); j++) {
            imgByteToWrite.add((int)s.charAt(j));
        }
        imgByteToWrite.add(0x0a);
        //------------------------------

        int len = 0x1fe;  //0x1f3(16)=510(10)
        //如果这一段删了的话这里的len要做相应的改变

        int curSize = imgByteToWrite.size();
        for (int k = 0; k < len - curSize; k++) {
            imgByteToWrite.add(0);
        }

        /*
         * 要想让虚拟机将软盘的头512字节当作操作系统的内核加载到内存
         * 前512字节的最后两个字节必须是55,aa
         * 即第510和第511字节必须是55,aa(这是Intel规定的)
         */
        //0x1fe-0x1f: 0x55, 0xaa
        //0x200-0x203: f0 ff  ff
        imgByteToWrite.add(0x55);
        imgByteToWrite.add(0xaa);
        imgByteToWrite.add(0xf0);
        imgByteToWrite.add(0xff);
        imgByteToWrite.add(0xff);

        len = 0x168000;
        curSize = imgByteToWrite.size();
        for (int l = 0; l < len - curSize; l++) {   // 其余部分都用0补全
            imgByteToWrite.add(0);
        }

    }

    public void makeFllopy()   {
        /*
         * 构建虚拟软盘
         *
         * 在磁盘上创建一个1474560字节的二进制文件,将imgContent的内容写入该文件的前512字节
         * 这个二进制文件将作为一个1.5M的虚拟软盘用于当作虚拟机的启动软盘
         */
        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, this is my first line of my operating system code");
        op.makeFllopy();
        //System.out.println(op);
    }
}

 

 

对没错就是选择Win7

 

 

启动

      Java代码中,main函数里的字符串出现在了虚拟机屏幕里,然后虚拟机就卡死了。机器上电后就加载了我们的代码,这就是一个操作系统的雏形  

 

参考:

https://blog.csdn.net/tyler_download/article/details/51729141

https://www.bilibili.com/video/BV1VJ41157wq?p=1

有改动

相关文章:

  • Windows下Vim
  • 汇编语言
  • SVN服务器端
  • Mavic Mini
  • Chrome浏览器
  • SVN客户端
  • Windows批处理文件bat/cmd
  • IDEA 操作快捷键
  • Python迭代器 iterator(iter next) 生成器 generator(yield) yield
  • Python协程(generator, yield, send)
  • 虚拟机 虚拟硬盘
  • 8086处理器 硬盘
  • 虚拟机快照
  • 虚拟机克隆 将虚拟机导出为 OVF 格式
  • VMware虚拟机与主机共享文件夹
  • angular学习第一篇-----环境搭建
  • Bytom交易说明(账户管理模式)
  • CSS居中完全指南——构建CSS居中决策树
  • CSS魔法堂:Absolute Positioning就这个样
  • EOS是什么
  • javascript从右向左截取指定位数字符的3种方法
  • Python打包系统简单入门
  • Python实现BT种子转化为磁力链接【实战】
  • Vue.js-Day01
  • 包装类对象
  • 从tcpdump抓包看TCP/IP协议
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 基于webpack 的 vue 多页架构
  • 免费小说阅读小程序
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 驱动程序原理
  • 使用 @font-face
  • 物联网链路协议
  • mysql面试题分组并合并列
  • #1014 : Trie树
  • #1015 : KMP算法
  • (06)Hive——正则表达式
  • (八十八)VFL语言初步 - 实现布局
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (转) ns2/nam与nam实现相关的文件
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .net mvc部分视图
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • /var/spool/postfix/maildrop 下有大量文件
  • @Conditional注解详解
  • @EnableConfigurationProperties注解使用
  • @ModelAttribute注解使用
  • @开发者,一文搞懂什么是 C# 计时器!
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [C#]winform部署PaddleOCRV3推理模型