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

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

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

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

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

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

这里给出参考链接:

英文参考链接:

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

中文参考链接:

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

现在我们简单了解一下,计算机开机加电过程到底是怎么一个样子了?这里以 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>

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

387a1fb4dccb9fde8b88468207034bc0.png

现在我们在: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> 
c4b44ceb17b3303f482ff0939377d4bb.png

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

894bee0b22eec3c56911b86385bb7b12.png
aa22b51dbcef2a8e7b377f1467203235.png

·

d599e5bf26537ddb5af739af12d18d30.png

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 的值
b0faa48afe7d6993ee1d89a6de95a599.png
e5a80c06ff1887630ca6b0ca9c2257c1.png

中断向量表:

参考来源:

http://www.bioscentral.com/misc/biosservices.htm
83a6539c79acc868a4b441068d1c6a7a.png

中断向量表

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

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> 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git入门基础

git基础 参考:官网git基础 git 文件的生命周期 文件的生命周期图: git中的文件可以分为4个阶段. Untracked : 这是目录中没有被跟踪的文件,即不在git项目中,使用 git commit 等命令对文件进行提交时不会提交这样的文件…

Android 充电LED控制

1、前言 充电LED灯控制是Android设备的基本功能,主要用于提示设备的电池状态,充电状态,满电状态,低电状态,很多手机厂商还使用呼吸效果来显示,普通的低端设备会使用两个LED灯表示,红灯表示充电…

【PyAutoGUI操作指南】04 消息框功能+Question+Waring+Critical+自定义消息框

PyAutoGUI利用PyMsgBox中的消息框函数提供跨平台的纯Python方式来显示JavaScript样式的消息框。 5.1 alert() import pyautoguipyautogui.alert(text这里写内容, title通知框标题位置, buttonOK)5.2 confirm() import pyautoguipyautogui.alert(text这…

js 弹出层的点击事件影响到底层的点击事件_聊一聊 Node.js 错误处理

个人博客:https://blog.skrskrskrskr.com错误分类软件程序中,我们可以将错误大致分为外部错误和内部错误两大类。外部错误是正确编写的程序在运行时产生的错误。它并不是程序本身的 bug,更多是一些外部原因导致的问题,比如请求超时…

老王带你理解算法复杂度O(1),O(N),O(N^2)

上图对应的是算法复杂度的图片,X轴对应的是n(问题规模),Y轴对应的是执行的运行时间。 我们先从简单的复杂度解读O(1) 从上面的图片我们可以看到O(1)的复杂度是恒定的,一点波澜都没有,什么是O(1)呢,就比如你是一个酒店…

【PyAutoGUI操作指南】05 屏幕截图与图像定位:截图+定位单个目标+定位全部目标+灰度匹配+像素匹配+获取屏幕截图中像素的RGB颜色

6 屏幕截图与图像定位 PyAutoGUI可以拍摄屏幕截图,将其保存到文件中,并在屏幕中定位图像。OSX使用操作系统附带的screencapture命令。Linux使用scrot命令,可以通过运行sudo-apt-get-install-scrot来安装该命令。 功能介绍:一个需…

C语言-数组a 和a 的区别

面试经典题目 #include "stdio.h"int main() {int a[5] { 1,2,3,4,5 };int *ptr (int *)(&a 1);printf("%d,%d", *(a 1), *(ptr - 1));/*getchar是用VS编写方便查看输出*/getchar();return 0; }请思考一下上面的输出结果,如果你非常自…

前端为什么有的接口明明是成功回调却执行了.catch失败回调_前端进阶高薪必看-手写源码篇(高频技术点)...

前言此系列作为笔者之前发过的前端高频面试整理的补充 会比较偏向中高前端面试问题 当然大家都是从新手一路走过来的 感兴趣的朋友们都可以看哈初衷我相信不少同学面试的时候最怕的一个环节就是手写代码 大家一定听过这句话talk is cheap, show me the code 没事 此文章不仅包含…

C/C++函数指针与指针函数

前面说的话 面试的时候,经常有面试官问这个问题,在Linux内核里面也是经常被使用的,在看很多大神的代码里面,我们也经常遇到函数指针与指针函数,一样,如果你自己没问题了,就不用往下看了。 定义…

jsp人事管理系统_Jsp+Ssm+Mysql实现的医院人事管理系统源码附带视频运行教程

项目地址:jspssmmysql实现的医院人事管理系统源码附带视频运行教程|猿来入此【beta】多用户版IT项目教程源码分享网站​www.yuanlrc.com今天给大家演示的是一款由jspssm(springspringMVCmybatis)实现的医院人事管理系统,系统比较简…

RK3288/RK3399 CPU定频方法

直接上方法 查看cpu能支持的频率 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies 写入userspace说明要用户设定频率 echo userspace > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor 写入上面列出的cpu频率 echo 1608000 > …

notepad++正则表达式去掉关键字所在行

如下图 1、选择正则表达式 2、选择匹配大小写 3、^(.*)KERNEL(.*)$\n 加上\n就是把去除的行删除,不加就算把删除的行替换为空格

深度学习·理论篇(2023版)·第003篇深度学习和计算机视觉中的基础数学知识02:特征向量和特征值+矩阵乘法的几何意义(2)+奇异值分解+线性可分性和维度+非线性变换

💕恭喜本博客浏览量达到两百万,CSDN内容合伙人,CSDN人工智能领域实力新星~ 🧡本文章为2021版本迭代更新版本,在结合有效知识的基础上对文章进行合理的增加,使得整个文章时刻顺应时代需要 🧡本…

Oracle 控制文件管理

控制文件是一个很小的二进制文件(10MB左右),含有数据库结构信息,包括数据文件和日志文件信息。控制文件在数据库创建时被自动创建,并在数据库发生物理变数时更新。控制文件被不断更新,在任何时候都要保证控制文件可用,…

数组超过预设的最大数组大小_工作表数组大小的扩展及意义

朋友们好,今日给大家继续讲解VBA数组与字典解决方案的第17讲,数组大小的扩充问题。这一讲的内容相对比较简单,在之前的章节中讲了数组与数组的计算规律,也是利用了数组的扩展原理。其实,两个数组计算时,参与…

Android ANR 实例分析

什么是ANR? 以下四个条件都可以造成ANR发生: InputDispatching Timeout:5秒内无法响应屏幕触摸事件或键盘输入事件BroadcastQueue Timeout :在执行前台广播(BroadcastReceiver)的onReceive()函数时10秒没…

【GIT 基础篇六】分支管理(创建与合并)

上篇我们整理了如何创建远程仓库,以及如何将本地文件上传至远程仓库,仓库创建好了,我们接下来就要准备开发了,对于使用git而言,通常的习惯就是一人一个分支,等测试无误再合并;又或者根据需求创建…

git 命令汇总

瞎扯 最近有几个留言想让写下git的内容,git是一个工具,主要是用来管理码农的代码的,理由很简单,码农写的代码太多,自己都不知道可能哪里出现了Crash。Linux也是因为git的出现,可以让世界上越来越多的人维护…

我的最佳队友之K8无线蓝牙键盘深度使用测评( Keychron K8 )

K8 无线蓝牙键盘深度使用测评( Keychron K8 )——500 元左右最适配 Mac 电脑的机械键盘 0.键盘参数: 首先我们在实际测评之前,看下这个键盘的具体参数,心里有个大致的了解~ 87键 国产佳达隆G轴 可选茶轴/红轴/青轴 蓝…

你见过哪些操蛋的代码?

NO.1#define TRUE FALSE //Happy debugging suckers快乐的去调试你的代码吧,哈哈NO.2#define NULL (::rand() % 2) // would be quite nice aswell嗯,这个代码也很不错NO.3#define if( if(!卧槽,这个代码更加叼,哈哈&#xff…