自己动手写操作系统(开篇)

自己动手写操作系统(字符显示)

说明:Intel 8086 或者不同的处理器,开机寄存器数据可能不一样,但是大致原理差不多

了解过计算机启动的同学肯定知道,当计算机启动的时候 BIOS 会加载 MBR 数据 512 字节到 0x7c00 处。

为什么会加载到这个地方了?

这里给出参考链接:

英文参考链接:

https://www.glamenv-septzen.net/en/view/6

中文参考链接:

http://www.ruanyifeng.com/blog/2015/09/0x7c00.html

现在我们简单了解一下,计算机开机加电过程到底是怎么一个样子了?这里以 VirtualBox 6.1.6 虚拟软件为例子:

VirtualBox 6.1.6 下载地址:

https://www.virtualbox.org/wiki/Downloadshttps://download.virtualbox.org/virtualbox/6.1.6/VirtualBox-6.1.6-137129-Win.exe
  1. 先安装 VirtualBox , 过程省略。

安装virtualbox出现2503、2502的错误提示解决方法: 右键点击 选择 以管理员身份运行

  1. 打开 VirtualBox 的调试器, 运行 cmd 命令,启动控制台,输入下面的配置命令即可
Microsoft Windows [版本 10.0.18363.418](c) 2019 Microsoft Corporation。保留所有权利。C:甥敳獲Administrator>set vVBOX_MSI_INSTALL_PATH=C:Program FilesOracleVirtualBoxC:甥敳獲Administrator>set VBOX_GUI_DBG_ENABLED=tureC:甥敳獲Administrator>set VBOX_GUI_DBG_AUTO_SHOW=tureC:甥敳獲Administrator>set vVBOX_GUI_DBG_AUTO_SHOW=tureVBOX_GUI_DBG_ENABLED=tureVBOX_MSI_INSTALL_PATH=C:Program FilesOracleVirtualBoxC:甥敳獲Administrator>cd %VBOX_MSI_INSTALL_PATH%C:Program FilesOracleVirtualBox>VirtualBox.exeC:Program FilesOracleVirtualBox>

之后我们就可以看到这样的效果了:

现在我们在:Command 输入 r 回车就可以看到效果:

Welcome to the VirtualBox Debugger!Current VM is 09980000, CPU #0VBoxDbg> reax=00000000 ebx=00000000 ecx=00000000 edx=00000600 esi=00000000 edi=00000000eip=0000fff0 esp=00000000 ebp=00000000 iopl=0 nv up di pl nz na pe nccs=f000 ds=0000 es=0000 fs=0000 gs=0000 ss=0000               eflags=00000002f000:0000fff0 ea 5b e0 00 f0          jmp far 0f000h:0e05bhVBoxDbg> 

我们可以清晰的看到: eip = 0000fff0, cs=f000,( 对应的物理内存其实就是 FFFF0) 也就是开机加电的时候 cs 和 ip(eip) 设置为一个固定的值。 在内存 f000:0000fff0 处的内容为 ea 5b e0 00 f0 。, 距离内存最顶端只有 16 字节。8086 有 20 根地址线,所以最大寻找范围为 1M的地址空间。

·

8086 内存布局

f000:0000fff0 ea 5b e0 00 f0          jmp far 0f000h:0e05bh  ; ; 这里对应的是一条跳转指令, 跳转到物理内存为 FE05B 内存处; 这个地址还是 ROM BIOS 内存地址范围。继续执行,直到通过调用; 中断程序最终将 mbr 加载到 0x7c00处; 当然这里其中还干了很多其他的事情,比如搬数据到 0x00000 开始处。;   此时 CS:IP 对应为 F000: E05B  ;   注意  jmp 会改变 cs 和 ip 的值

中断向量表:

参考来源:

http://www.bioscentral.com/misc/biosservices.htm

中断向量表

设置断点继续运行,就可以看到对应寄存器的值了

VBoxDbg> ba x 1 7c00Set access breakpoint 0 at 0000000000007c00VBoxDbg> dbgf event: Breakpoint 0! (raw)eax=0000aa55 ebx=00000000 ecx=00000001 edx=00000000 esi=00000000 edi=0000fff0eip=00007c00 esp=00007800 ebp=00000000 iopl=0 nv up ei pl zr na po nccs=0000 ds=0000 es=0000 fs=0000 gs=0000 ss=0000               eflags=002002460000:00007c00 eb 4e                   jmp +04eh (07c50h)VBoxDbg> u0000:00007c00 eb 4e                   jmp +04eh (07c50h)0000:00007c02 90                      nop0000:00007c03 48                      dec ax0000:00007c04 45                      inc bp0000:00007c05 4c                      dec sp0000:00007c06 4c                      dec sp0000:00007c07 4f                      dec di0000:00007c08 49                      dec cx0000:00007c09 50                      push ax0000:00007c0a 4c                      dec spVBoxDbg> 

自己动手写java虚拟机_自己动手写操作系统(要了解的知识点)相关推荐

  1. cmd写java程序_用cmd写一个最简单的Java程序

    一,准备: 1.确保电脑中装有eclipse软件并且确保配置好环境变量 (1)环境变量配置方法: 特别提示:jdk和eclipse保存的路径不能有中文字符 1.打开我的电脑--属性--高级--环境变量 ...

  2. 【JVM】手写Java虚拟机-02 搜索class文件

    目录 环境 可能遇到的问题 开始 执行 参考 环境 操作系统:Windows 10 IDE:IntelliJ IDEA 2019.1 x64 JDK:Java 11.0.8 项目管理工具:apache ...

  3. 代写python作业费用标准_代做159.272作业、代写Programming Paradigms作业、代做Python实验作业、代写Java/c++编程作业代写Database|代做R...

    代做159.272作业.代写Programming Paradigms作业.代做Python实验作业.代写Java/c++编程作业代写Database|代做RComputational Thinkin ...

  4. c语言制作java虚拟机_【C/C+】虚拟机实现:用C语言来写Java虚拟机

    前言:本篇文章除了能够让你了解到虚拟机的工作原理外,还可以让你了解到较低级别的编程过程. 由于我喜欢在较低级别(Low-level)的应用中(编译器,解释器,解析器,虚拟机等等)工作,所以我觉得写一篇 ...

  5. 手写java_手写JAVA虚拟机(二)——实现java命令行

    咱们都知道,咱们编译.java并运转.class文件时,需求一些java指令,如最简略的helloworld程序.java初学者可以看一下下面的教程. 这儿的程序最好不要加包名,因为加了包名的话编译和 ...

  6. 常用的java虚拟机_带你了解 JAVA虚拟机 面试必备

    Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途.创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有 些区域则是依赖 ...

  7. java 虚拟机_浅谈Java虚拟机内存区

    1. Java 虚拟机内存区概述 我们在编写程序时,经常会遇到OOM(out of Memory)以及内存泄漏等问题.为了避免出现这些问题,我们首先必须对JVM的内存划分有个具体的认识.JVM将内存主 ...

  8. java虚拟机_一文彻底读懂Java虚拟机!(JVM)

    提到Java虚拟机(JVM),可能大部分人的第一印象是"难",但当让我们真正走入"JVM世界"的时候,会发现其实问题并不像我们想象中的那么复杂.唯一真正令我们恐 ...

  9. 深入理解java虚拟机_深入理解Java类加载

    本文目的: 深入理解Java类加载机制; 理解各个类加载器特别是线程上下文加载器; Java虚拟机类加载机制 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验.转换解析和初始化,最 ...

最新文章

  1. 1、在Centos上安装Grafana
  2. Verilog初级教程(1)认识 Verilog HDL
  3. C++编译器何时为用户提供默认构造函数
  4. 中国交通建设PPP模式产业投资现状及运营前景规划咨询报告2021版
  5. 电路分析导论_生存分析导论
  6. 【PDF】处理pdf 文档的相关功能包总结
  7. (95)FPGA仿真文件保存(VCD文件)
  8. 判断用户用手机访问还是用电脑访问网页
  9. Oracle的SQL语法提示30例,INDEX_JOIN,ORDERED,USE_NL,LEADING
  10. 明日方舟 长夜临光side story
  11. python文件管理api_python调用有道智云API实现文件批量翻译
  12. 51单片机4种流水灯
  13. 简单几步即可速查电脑WiFi密码,无需任何工具!
  14. SD卡启动第二篇 (手动导入系统到SD卡分区)
  15. bada学习之HelloWorld篇
  16. OpenCV源码剖析之imread PNG
  17. 用批处理调用Rundll32添加打印机命令说明文件
  18. GoLang - Go中Mocking(3)
  19. html背景图片定位方法
  20. python tkinter 窗口颜色--数据和名称

热门文章

  1. 验证软件需求正确性的四个角度
  2. c语言编写一个菜单系统_一招教你,轻松解决C语言编写一个正整数的所有因子!...
  3. java 线程池 初始大小_为什么tomcat的默认线程池大小如此之大? - java
  4. html颜色叠加代码,html代码大全(基础使用代码)(颜色代码完整版)
  5. oracle并发执行max,跪求大量并发执行insert into select语句的方案
  6. python进程通信方式有几种_python全栈开发基础【第二十一篇】互斥锁以及进程之间的三种通信方式(IPC)以及生产者个消费者模型...
  7. 解决python中html 代码被注释掉 依旧被解释导致报错ERROR:tornado.access:500 GET /home (xxx.xxx.xxx.xxx)
  8. redis配置主从没效果_跟我一起学Redis之加个哨兵让主从复制更加高可用
  9. click传值vue_对vue下点击事件传参和不传参的区别详解
  10. linux驱动文件操作简单介绍