操作系统真象还原《二》启动流程

计算机通电启动时,第一件事时需要找到BIOS的入口地址,首先cpu 的 cs:ip 寄存器被强制初始化为 0xF000:0xFFF0,由实模式下寻址可知,BIOS的入口地址即为0xFFFF0,而这个地址并不是BIOS的起始代码而是一个长跳转指令 jmp far  f000:e05b,如下图:

而f000:e05b处才是真正的BIOS起始代码,然后接下来 BIOS 便马不停蹄地检测内存、显卡等外设信息,当检测通过,并初始化好硬件后,开始在内存中 0x000~0x3FF 处建立数据结构,中断向量表 IVT 并填写中断例程。BIOS工作完后会将0盘0道1扇区的硬盘内容加载到以 0x7c00开头的内存区域,即加载MBR程序。之后MBR会加载loader内核加载程序代码。loader内核加载器会实现由实模式向保护模式的转换。值得注意的是BIOS是自动加载MBR到内存0x7c00处,而MBR是通过操作磁盘将扇区里loader加载到内存里的。实模式下具体磁盘操作函数如下:

;功能:读取硬盘n个扇区
rd_disk_m_16:
;-------------------------------------------------------------------------------
                       ; eax=LBA扇区号
                       ; ebx=将数据写入的内存地址
                       ; ecx=读入的扇区数
      mov esi,eax      ;备份eax
      mov di,cx          ;备份cx
;读写硬盘:
;第1步:设置要读取的扇区数
      mov dx,0x1f2
      mov al,cl
      out dx,al            ;读取的扇区数

      mov eax,esi       ;恢复ax

;第2步:将LBA地址存入0x1f3 ~ 0x1f6

      ;LBA地址7~0位写入端口0x1f3
      mov dx,0x1f3
      out dx,al                          

      ;LBA地址15~8位写入端口0x1f4
      mov cl,8
      shr eax,cl
      mov dx,0x1f4
      out dx,al

      ;LBA地址23~16位写入端口0x1f5
      shr eax,cl
      mov dx,0x1f5
      out dx,al

      shr eax,cl
      and al,0x0f       ;lba第24~27位
      or al,0xe0       ; 设置7~4位为1110,表示lba模式
      mov dx,0x1f6
      out dx,al

;第3步:向0x1f7端口写入读命令,0x20
      mov dx,0x1f7
      mov al,0x20
      out dx,al

;第4步:检测硬盘状态
  .not_ready:
      ;同一端口,写时表示写入命令字,读时表示读入硬盘状态
      nop
      in al,dx
      and al,0x88       ;第4位为1表示硬盘控制器已准备好数据传输,第7位为1表示硬盘忙
      cmp al,0x08
      jnz .not_ready       ;若未准备好,继续等。

;第5步:从0x1f0端口读数据
      mov ax, di
      mov dx, 256
      mul dx
      mov cx, ax       ; di为要读取的扇区数,一个扇区有512字节,每次读入一个字,
               ; 共需di*512/2次,所以di*256
      mov dx, 0x1f0
  .go_on_read:
      in ax,dx
      mov [bx],ax
      add bx,2
      loop .go_on_read
      ret

原文地址:https://www.cnblogs.com/HonkerYblogs/p/10385485.html

时间: 2024-11-06 17:25:05

操作系统真象还原《二》启动流程的相关文章

《操作系统真象还原》bochs安装

在安装bochs之前,我们先需要安装虚拟机和linux发行版,也可以安装双系统,总之有个linux操作系统就好. 我是在ubuntu14.04系统下安装bochs的. 安装Bochs 以下为安装步骤 下载bochs.官方地址是http://sourceforge.net/projects/bochs/files/bochs/,安装的版本是2.6.2,下载后的文件是bochs-2.6.2.tar.gz. 解压压缩包 tar zxvf bochs-2.6.2.tar.gz 编译.先进入到目录 cd

操作系统真象还原 文件系统的建立

Linux 文件系统借鉴了inode,inode的结构是 也就是说,在一个分区中 有多少个文件 就有多少个inodes,而一个文件最大,不会超过(12 + 256 + 256 × 256 + 256 × 256 × 256)个数据块大小 同时,目录和普通文件一样,都是一个目录对应一个inode 在一个正常的硬盘中 会有MBR + 几个分区 每个子分区的结构为: (操作系统引导块EBR) + (超级块) + (空闲块位图) + (inode位图)  + (inode数组) + (根目录) + (空

《操作系统真象还原》ELF文件

下面是第五章部分内容的收获. 用C语言编写内核 一直以来我们都是用汇编语言编写程序的,但接下来我们或许很少用汇编语言编写代码了,大多数都是使用C语言.为什么要这样呢?书上的解释我看的不是很懂,只能结合书上谈谈我的见解,个人觉得有两个原因: 汇编语言编写代码较高级语言来说还是麻烦很多的,毕竟大家试试就知道了,一句C语言代码,可能要几句汇编语言代码才能与之对应.那有人说CPU能执行C语言代码吗,当然不,CPU最终执行的是机器指令,也就是由0和1组成的机器指令.所以肯定需要一个东西将C语言转换为机器指

Java内存管理-初始JVM和JVM启动流程(二)

勿在流沙住高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇分享了什么是程序,以及Java程序运行的三个阶段.也顺便提到了Java中比较重要的一个东西就是JVM(JAVA 虚拟机),那么今天在先了解一下JVM和JVM的启动流程. 知识地图: 1.什么是虚拟机 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统.[百度百科] 虚拟机通过仿真引擎(称为管理程序)处理虚拟硬

Caddy源码阅读(二)启动流程与 Event 事件通知

Caddy源码阅读(二)启动流程与 Event 事件通知 Preface Caddy 是 Go 语言构建的轻量配置化服务器.https://github.com/caddyserver/caddy Caddy 整个软件可以说是由不同的 插件 堆砌起来的.自己本身仅提供 Plugin 的注册运行逻辑和 Server 的监听服务功能. 学习 caddy 的源码,实际上是学习 如何构建一个 松耦合的 抽象 Plugin 设计,即模块化插拔的做法. 所以我们的源码阅读,围绕 Caddy 为 Plugin

<转>深入理解Activity启动流程(二)–Activity启动相关类的类图

本文原创作者:Cloud Chou. 出处:本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 在介绍Activity的详细启动流程之前,先为大家介绍Activity启动时涉及到的类,这样大家可以有大概的了解,不至于在细节中迷失. 深入理解Activity启动流程(一)--Activity启动的概要流程 深入理解Activity启动流程(三)--Activity启动的详细流程1 深入理解Activity启动流程(三)--Activity启动的详细流程2

深入理解Activity启动流程(二)–Activity启动相关类的类图

本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 在介绍Activity的详细启动流程之前,先为大家介绍Activity启动时涉及到的类,这样大家可以有大概的了解,不至于在细节中迷失. 深入理解Activity启动流程(一)--Activity启动的概要流程 深入理解Activity启动流程(三)--Activity启动的详细流程1 深入理解Activity启动流程(三)--Activity

从0移植uboot (二) _启动流程分析

来源:Linux社区  作者:xiaojiang1025  : http://www.linuxidc.com/Linux/2017-02/141019.htm 经过了上一篇的配置,我们已经执行make就可以编译出一个uboot.bin,但这还不够,首先,此时的uboot并不符合三星芯片对bootloader的格式要求,其次,此时的uboot.bin也没有结合我们的开发板进行配置,还无法使用.而要进行这样的个性化配置,前提条件就是对uboot开机流程和编译系统有所了解,本文主要讨论前者.uboo

Linux的启动流程以及GRUB详解

 一.Linux引导和启动流程       概述,计算机电源接通后通过BISO之后,没有问题,就会去硬盘上找到MBR(Main Boot Record 主引导记录区)位于整个硬盘的0磁道0柱面1扇区,它记录着主引导记录中包含了硬盘的一系列参数和一段引导程序,其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后引导具有激活标志的分区上的操作系统,并将控制权交给启动程序(GRUB).GRUB启动引导器是计算机启动过程中运行的第一个真正的软件,GRUB负责加载启动硬盘分区中的操作