计算机启动

这篇具有很好参考价值的文章主要介绍了计算机启动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

按下主机上的 power 键后,第一个运行的软件是 BIOS,BIOS 全称叫 Base Input & Output System,即基本输入输出系统。

计算机启动

(8086的1MB内存)

地址 0~0x9FFFF 处是 DRAM,顶部的 0xF0000~0xFFFFF,这 64KB 的内存是 ROM。

BIOS 本身是个程序,程序要执行,就要有个入口地址才行,此入口地址便是 0xFFFF0。

BIOS 的主要工作是检测、初始化硬件,怎么初始化的?硬件自己提供了一些初始化的功能调用,BIOS 直接调用就好了。BIOS 还做了一件伟大的事情,建立了中断向量表,这样就可以通过“int 中断号”来实现相关的硬件调用,当然 BIOS 建立的这些功能就是对硬件的 IO 操作,这就是 BIOS 称为基本输入输出系统的原因。

(1)它是由谁加载的。
(2)它被加载到哪里。
(3)它的 cs:ip 是谁来更改的。

在开机的一瞬间,也就是接电的一瞬间,CPU 的 cs:ip 寄存器被强制初始化为 0xF000:0xFFF0。

既然此处只有 16 字节的空间了,这只能说明 BIOS 真正的代码不在这,那此处的代码只能是个跳转
指令jmp far f000:e05b,即跳向了 0xfe05b 处,这是 BIOS 代码真正开始的地方。

接下来 BIOS 便马不停蹄地检测内存、显卡等外设信息,当检测通过,并初始化好硬件后,开始在内
存中 0x000~0x3FF 处建立数据结构,中断向量表 IVT 并填写中断例程。

BIOS 最后一项工作校验启动盘中位于 0 盘 0 道 1 扇区的内容,此扇区末尾的两个字节分别是魔数 0x55 和 0xaa,BIOS 便认为此程序便是主引导记录 MBR,便加载到物理地址 0x7c00。

为什么是0x7c00

按 DOS 1.0 要求的最小内存 32KB 来说,MBR 希望给它尽可能多的预留空间,这样也是保全自己
的作法,免得过早被覆盖。所以 MBR 只能放在 32KB 的末尾。
MBR 本身也是程序,是程序就要用到栈,栈也是在内存中的,MBR 虽然本身只有 512 字节,但还要为其
所用的栈分配点空间,所以其实际所用的内存空间要大于 512 字节,估计 1KB 内存够用了。
结合以上三点,选择 32KB 中的最后 1KB 最为合适,
那此地址是多少呢?32KB 换算为十六进制为 0x8000,减去 1KB(0x400)的话,等于 0x7c00。这就是倍受质疑的 0x7c00 的由来,这下清楚了。可见,加载 MBR 的位置取决于操作系统本身所占内存大小和内存布局。

MBR 的大小必须是 512 字节,mbr在8086实模式中运行,这在微机原理中学得很详细,这里不再赘述。

实模式的“实”体现在:程序中用到的地址都是真实的物理地址,“段基址:段内偏移”产生的逻辑地址就是物理地址。8086之前是程序加载到固定位置,也就是程序员看到的完全是真实的内存。开发人员等不及了,干脆把程序中的地址改成别的吧,重新编译后发现还是有某个地址被占用,还是没法上 CPU 运行,怎么办?再改地址……

;mbr.S
;主引导程序 
;
;LOADER_BASE_ADDR equ 0xA000 
;LOADER_START_SECTOR equ 0x2
;------------------------------------------------------------
SECTION MBR vstart=0x7c00         
   mov ax,cs      
   mov ds,ax
   mov es,ax
   mov ss,ax
   mov fs,ax
   mov sp,0x7c00
   mov ax,0xb800
   mov gs,ax

; 清屏
;利用0x06号功能,上卷全部行,则可清屏。
; -----------------------------------------------------------
;INT 0x10   功能号:0x06	   功能描述:上卷窗口
;------------------------------------------------------
;输入:
;AH 功能号= 0x06
;AL = 上卷的行数(如果为0,表示全部)
;BH = 上卷行属性
;(CL,CH) = 窗口左上角的(X,Y)位置
;(DL,DH) = 窗口右下角的(X,Y)位置
;无返回值:
   mov     ax, 0600h
   mov     bx, 0700h
   mov     cx, 0               ; 左上角: (0, 0)
   mov     dx, 184fh	       ; 右下角: (80,25),
			       ; 因为VGA文本模式中,一行只能容纳80个字符,共25行。
			       ; 下标从0开始,所以0x18=24,0x4f=79
   int     10h                 ; int 10h

   ; 输出背景色绿色,前景色红色,并且跳动的字符串"1 MBR"
   mov byte [gs:0x00],'1'
   mov byte [gs:0x01],0xA4     ; A表示绿色背景闪烁,4表示前景色为红色

   mov byte [gs:0x02],' '
   mov byte [gs:0x03],0xA4

   mov byte [gs:0x04],'M'
   mov byte [gs:0x05],0xA4   

   mov byte [gs:0x06],'B'
   mov byte [gs:0x07],0xA4

   mov byte [gs:0x08],'R'
   mov byte [gs:0x09],0xA4

   jmp $		       ; 通过死循环使程序悬停在此

   times 510-($-$$) db 0
   db 0x55,0xaa

运行结果:

计算机启动

:学习笔记,整理操作系统真象还原文章来源地址https://www.toymoban.com/news/detail-492724.html

到了这里,关于计算机启动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机启动过程(万字长文)

    当电源通电后,计算机系统的启动过程始于主板上的固件,通常是BIOS(基本输入/输出系统)或UEFI(统一可扩展固件接口)。基本流程如下: 1、电源通电 用户按下计算机电源按钮,电源开始供给计算机各个组件。此时,CPU并没有直接开始执行指令。 2、BIOS/UEFI 自检 : 电源

    2024年02月02日
    浏览(70)
  • 计算机启动过程uefi+gpt方式

    启动过程: 一、通电 按下开关,不用多说 二、uefi阶段 通电后,cpu第一条指令是执行uefi固件代码。 uefi固件代码固化在主板上的rom中。 (一)uefi介绍 UEFI,全称Unified Extensible Firmware Interface,即“统一的可扩展固件接口”,是适用于电脑的标准固件接口,旨在代替BIOS。 UEF

    2024年02月16日
    浏览(41)
  • 聊聊x86计算机启动发生的事?

    大家好,我是呼噜噜,最近在看linux早期内核 0.12 的源码,突然想到一个困扰自己好久的问题:当我们按下电源键,计算机发生了什么?神秘地址0x7C00究竟是什么?操作系统又是如何被加载到硬件中的?带着这些问题,继续往下阅读本文。 x86计算机启动过程,主要分为这几个

    2024年01月24日
    浏览(36)
  • 用Python写一个计算机

    如果你想用Python写一个计算器,可以按照以下步骤进行: 1. 设计计算器界面:可以使用Python图形库Tkinter等创建计算器的UI界面,包括数字和计算符号等。 2. 定义数字按钮和计算符号按钮:在UI界面上添加数字按钮和计算符号按钮,并绑定对应的点击事件。 3. 实现计算逻辑:

    2024年02月10日
    浏览(36)
  • 记录一次sqlserver启动不了的问题,windows不能在本地计算机启动sql server

    如果你是开机后突然启动不了的,大概率是关机的时候vpn忘了停止,然后开机后网络出现问题造成sqlserver用不了。用下面这个方法大概率可以启动吗,如果启动成功的话记得给我点个赞吧 第一步,关闭这三个sqlserver配置服务 第二步,重启电脑 第三步,从任务管理器打开服务,找到

    2024年02月03日
    浏览(63)
  • 计算机图形学:绘制一个3d交互场景(1)

    OpenGL作为一种图形与硬件的接口,与其他图形程序开发工具相比较,它提供了众多图形函数,直观的编程环境简化了三维图形的绘制过程,使用OpenGL搭建一个三维场景,能够通过输入设备与场景内物体交互。 豪华单间 配置环境:vs22+freeglut库 1.绘制墙体使其成为封闭空间,在

    2024年02月11日
    浏览(108)
  • 因为计算机中找不到mfc140.dll无法启动修复步骤分享

    mfc140.dll是Microsoft Foundation Class Library(微软基础类库)的一个组件,它是许多Windows应用程序(尤其是使用MFC编写的程序)所必需的动态链接库。MFC(Microsoft Foundation Classes)是一个用于简化Windows应用程序开发的C++类库,它提供了丰富的类和函数,帮助开发者更容易地创建具有

    2024年02月07日
    浏览(54)
  • 无法启动此程序,因为计算机中丢失vcruntime140.dll”的解决方法

    扩展名“.dll”与动态链接库(dll)有关,动态链接库是包含程序使用的代码和数据的库。一旦一个程序被创建,它就与一个DLL相关联,这个DLL只有在特定程序启动时才会被触发。因此,如果此时系统找不到带有“.dll”扩展名的文件,那么就可能会导致您无法打开当前的应用

    2024年02月04日
    浏览(76)
  • 【趣话计算机底层技术】一个故事看懂各种锁

    我是一个线程,一个卖票程序的线程。 自从我们线程诞生以来,同一个进程地址空间里允许有多个执行流一起执行,效率提升的同时,也引来了很多麻烦。 我们卖票线程的工作很简单,比如票的总数是100,每卖一张就减1,直到变成0售完为止。 以前单线程的时候没啥问题,

    2024年02月05日
    浏览(40)
  • 计算机中丢失msvcp140.dll无法启动此程序怎么办(修复教程)

    DLL是Dynamic Link Library的缩写,意为动态链接库。dll文件是电脑系统及软件运行的重要文件,电脑如果丢失dll文件,那么很多软件跟游戏都是无法运行的,msvcp140.dll丢失这个问题就有很多小伙伴遇到,小编今天就分享msvcp140.dll丢失的解决方法。 首先在电脑随便打开一个浏览器后

    2024年02月10日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包