# MyOS **Repository Path**: ShadowThreeD/my-os ## Basic Information - **Project Name**: MyOS - **Description**: 亲, 觉得OK就来个start哦~ 声明:本人不是原创! 我只是跟着"https://blog.csdn.net/tyler_download/category_6280228.html"这个博客,实践了这个简单的操作系统。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-05-08 - **Last Updated**: 2022-06-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 声明 这个操作系统不是我的原创,我只是参考`tyler_download`的[操作系统-java](https://blog.csdn.net/tyler_download/category_6280228.html) 专栏实践了一下,并记录了一些学习笔记,在这里对原作者的付出和帮助表示感谢! ## 基础知识 0. 计算机启动基础知识 ```bash 1. 计算机启动时首先运行BIOS(based input/output system)。BIOS系统是 计算机厂商预置在计算机硬件中的一个软件。暂时只需要知道BIOS会从 内存地址'0x7c00'处开始读取引导扇区,这个引导扇区存储的是内核加载器。 所以引导扇区最大只能512字节,而且最后两个字节一定要为[0x55,0xaa]才能 被启动成功。 ``` 1. Java的编译 ```bash javac example.java # compiler(Note: the file's name MUST same with the class's name. This will generate the example.class file) java example # run(MUST using example, NOT example.class) ``` 2. 汇编代码的编译 ```bash 1. 将汇编代码编辑并保存为 .asm 文件(通过;注释) 2. nasm xxx.asm # 编译命令,将会产生xxx二进制文件 3. hexyl xxx # 查看生成的二进制文件 ``` 3. 在虚拟机中添加操作系统 ![在虚拟机中添加操作系统步骤图解](./resource/虚拟机添加操作系统步骤.png) ![在虚拟机中添加操作系统后的明细](./resource/虚拟机添加操作系统后的明细.png) ## **ch01** [用Java做一个最小的操作系统内核](https://blog.csdn.net/tyler_download/article/details/51729141) 0. 功能:用Java将一个简单的内核二进制文件,按软盘的格式保存为镜像。 1. 将`OperatingSystem.java`编译并运行后,会生成一个名为`system.img`的镜像文件,把这个文件导入到虚拟机后,运行就能看到输出了。 ## **ch02** [用Java做一个最小的操作系统内核2](https://blog.csdn.net/tyler_download/article/details/51761750) 0. 功能:通过汇编写一个简单的内核,并通过Java读取并保存为软盘格式的镜像。 1. 用汇编代码实现`ch01`中的二进制数组,即MyOS的内核。 2. 自己产生的二进制文件和原文中的稍有差别,但是都可以正常在虚拟机中启动运行. 3. 产生的二进制文件详情如下: ![ch02_二进制详情](./resource/ch02_二进制详情.png) ## **ch03** [用Java做操作系统内核:软盘读写](https://blog.csdn.net/tyler_download/article/details/51815483) 0. 功能:通过汇编实现一个简单内核(可从指定软盘空间读取内容并打印到屏幕); 通过Java实现一个虚拟软盘,将汇编实现的内核写入到软盘,并在指定位置写入需要打印的信息。 1. 前面几节在屏幕输出的内容都是直接写在操作系统内核中的,这节将内容放在了软盘的 其他位置,通过内核读取的方式获取需要显示的内容。 2. 软盘原理如下图: ![ch03_软盘原理](./resource/ch03_软盘原理.png) 3. 通过Flopy.java实现虚拟软盘。然后通过将汇编内核文件写入到虚拟软盘。 CSDN上面的代码有些问题,可参考文中的git仓库。 ## **ch04** [Java开发操作系统内核:让内核突破512字节的限制](https://blog.csdn.net/tyler_download/article/details/51970921) 0. 功能:在软盘的第一个扇区实现一个内核加载器,这个程序将从软盘其他位置读取真正需要运行的内核, 这个内核功能为将内核中的一个字符串输出到屏幕上。 1. 前几节中,我们将一段代码通过软盘加载到系统内存并运行。事实上操作词条也是这样做的。 只不过我们加载的代码最大只能512字节,而一个内核好几百M,所以不能通过这个方式直接读入。 通常做法是在在512字节中放一个内核加载器,通过这个程序加载内核至指定内存地址,然后将 CPU的控制权转交给新加载的内核。 ## **ch05** [Java开发操作系统内核:由实模式进入保护模式之32位寻址](https://blog.csdn.net/tyler_download/article/details/52021120) 0. 功能:通过保护模式实现了ch04的功能。(保护模式显著特点:1. 寻址空间从时模式的1M增强到4G;2. 不同的代码拥有不同的优先级,优先级高的能够执行特殊指令,优先级低的,某些重要指令就无法执行) 进入保护模式下,有一个巨大好处是可以引入C语言来开发内核。 1. 注意:'boot.asm'中的'LOAD_ADDR'要和'kernel.asm'中的'org'地址要一致才能启动成功! ## **ch06** [保护模式超强的寻址功能:天空任鸟飞](https://blog.csdn.net/tyler_download/article/details/52242599) 0. 功能:将内核的寻址能力突破 1M。 1. X86架构下,cpu运行模式分两种,一种是实模式,DOS就是运行在实模式下。 随着CPU功能的加强及Intel引入的保护模式,才使得图形界面出现。 2. Inter8086使用16位寄存器,16位数据线,20位地址总线,实模式下寻址方式由段和偏移组成, 计算方法为:物理地址 = 段值 * 16 + 偏移。由于段和偏移都只能16位,最大寻址范围也就 1M + 4K 3. 包含模式下,寻址方式和实模式完全不同。上节的GDT叫全局描述符表,该表的表项就叫描述符, 在描述符中,有专用的4字节用户表示内存基址,这样内存访问范围就扩大到4G了。在原来的实模式 下, cs,ds这些16位寄存器一般用于存储段值,但在保护模式中,这些寄存器用于存储指向GDT表 的某项描述符索引。访问内存时仍然采用寄存器:偏移的方式,但CPU对地址的计算方法不同了, CPU将寄存器的值当作访问GDT的索引,通过这个索引对应的描述符找到内存基址,然后将基址 加上偏移得到具体内存地址,这样就突破了 1M 的地址限制。 4. 注意:'boot.asm'中的'LOAD_ADDR'要和'kernel.asm'中的'org'地址要一致才能启动成功! ## **ch07** [C语言结合汇编开发系统内核](https://blog.csdn.net/tyler_download/article/details/52468520) 0. 功能:C和汇编混合编程 1. 上节中,我们开始进入保护模式,在保护模式不仅寻址空间增大,运算能力增强, 还可以将C引入内核开发。因为C编译后的汇编代码默认就是运行在保护模式下。