前言

一直想着要多了解一下操作系统但是由于各种原因一直拖, 来英国这段时间发生了很多事, 眨眼半年过去了, 博客也没更新几篇, 之前看现在也没什么心思看了. 这几天一直在看操作系统, 想想看操作系统这一块一直都是自己比较好奇但又不是很了解的一块, 想着这里概念也挺多的, 就准备搞出这一系列, 也算是做做笔记, 方便以后复习整理.

计算机的启动过程

关于这个部分我个人也是参考了这个计算机是如何启动的这篇文章, 然后结合一些书籍谈一下个人理解吧. 这一块首先是写在ROM芯片里面的程序BIOS(Basic Input/Output System), 正常情况下按下电源键之后, BIOS程序启动, 他的任务按照执行顺序主要是下面几个 :

  1. POST (Power-On Self-Test) : 主要是检查各种计算机硬件, 此时如果一切正常屏幕上打印CPU, 硬盘, 内存等各种硬件信息, 否则计算机蜂鸣并停止启动.
  2. 接下来BIOS会主动寻找下一阶段的启动程序, 该启动程序可能存在于CD/DVD等存储设备, BIOS会依次检查, 具体设备检查的先后可以在BIOS中进行设置. 判断方式也比较简单, 如果该设备的第一个扇区(512bytes)的最后两个字节是0x55和0xAA, 表明这个设备可以用于启动, 这也就是我们通常所说的引导扇区, 否则继续检查下一个设备.
  3. 然后被找到的引导扇区将被加载到内存中的0000:7c00处(现在还是实模式).

然后控制权限交给了被加载的引导扇区中的代码, 这512字节也被称之为MBR(master boot record). MBR也分三部分 :

  1. 第1-446字节:调用操作系统的机器码 .
  2. 第447-510字节:分区表(Partition table) .
  3. 第511-512字节:主引导记录签名(0x55和0xAA) .

分区表什么的这里不提, 具体可以看上面提到的那篇文章. 这一部分暂时只需要提这么多就足够了. 那么如果要编写操作系统, 就必须从引导扇区开始写, 这一块当时是用汇编代码, 市面上大多数将编写操作系统的书籍都无一例外地使用的汇编器nasm, 它所支持的汇编格式是Intel格式的汇编, 和AT&T汇编(gcc那一套)有一定的区别, 具体可以看我之前写过的文章程序机器级表示(0), 另外这里还需要掌握一些nasm的基本语法, 这个我主要是参考Intel汇编-NASM这篇文章, 讲的还是比较详细的.

下面我从书中截取了一个引导扇区的源代码, 可以感受一下 :

    org 07c00h          ; 告诉编译器程序加载到7c00处;@接下来的三行用来初始化段寄存器mov ax, csmov ds, axmov es, axcall    DispStr         ; 调用显示字符串例程jmp $           ; 无限循环;@该函数主要用于负责打印, 当前阶段看不懂可以忽略.
DispStr:mov ax, BootMessagemov bp, ax          ; ES:BP = 串地址mov cx, 16          ; CX = 串长度mov ax, 01301h      ; AH = 13,  AL = 01hmov bx, 000ch       ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)mov dl, 0int 10h         ; 10h 号中断ret
BootMessage:        db  "Hello, OS world!";@这里我感觉应该是   510 - ($ - $$ + 1)  才对
times   510-($-$$)  db  0   ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw  0xaa55              ; 结束标志

所有前面加过@的注释都是我写的.

那么来讲一下如何把这段代码运行起来 :

工具很简单 :

  1. nasm 汇编器, 主要用于把汇编语言编译成elf格式的可执行文件.
  2. linux指令dd, 主要用于将编译完成的可执行文件转移到虚拟软盘中.
  3. qemu 虚拟机, 主要用于模拟计算机的运行, 可以执行我们制作的软盘镜像.

这里只需要即可, 需要注意的是第二行中制作出来的img格式的虚拟光盘之中并没有文件系统, 所以不能直接被mount到linux上. 所以想使用mount挂载到linux上在进行复制是行不通的.

nasm xxx.asm -o boot
dd if=boot of=fred.img bs=512 count=1
qemu fred.img

一些疑问

从上述过程中了解到, MBR被加载到07C00位置是作为一种BIOS的默认行为, 既然这样的话为什么我们需要显示地声明org 07c00h呢? 我尝试着做了如下工作 :

  1. 修改上述代码, 只留下最后两行, 也就是只是指定最后两个字节为0xAA55, 这样事实上仍然能够被操作系统识别为引导扇区.
  2. 修改上述代码, 除掉/更改 第一行, 能够别识别为引导扇区但是输出异常.
  3. 除去所有代码, 无法识别.

这里可以肯定的是, 决定是否是引导扇区完全了07C00无关, 只要扇区末尾是0Xaa55即可. 那么为什么不加org 07coo就不行呢? 最终看完这篇文章org 0x7c00解疑我才算理解, 就是说这一行的作用在于表明所有数据的偏移量, 因为正常的操作系统中, 由于虚拟内存的存在(而不是物理内存), 每个程序看到的其实内存地址都是0, 所以编译器并不需要为代码中每个地址添加偏移量. 而这里是BIOS强行将这段代码添加到了物理内存的07C00, 这时候如果不添加第一行, 编译器并不知道这一点, 所以会出现输出异常, 为了验证我的理解, 我将07C00改成了07C01, 输出果然变成了ello, OS world! ".

转载于:https://www.cnblogs.com/nzhl/p/6108053.html

操作系统的实现(0)相关推荐

  1. mysql 8.0.18安装,mysql 8.0.18 安装配置方法图文教程

    mysql 8.0.18 安装配置方法图文教程 本文记录了mysql 8.0.18 安装配置图文教程,供大家参考,具体内容如下 第一步:下载MySql 下载地址:MySQL 第二步:安装MySql 打 ...

  2. exit(0)和exit(1)解释

    exit(0)和exit(1) exit好象在"stdlib.h"头文件里面,所以要有包含头文件   return是返回函数调用,如果返回的是main函数,则为退出程序   exi ...

  3. 微软原版WINDOWS10-LTSB-X64位操作系统的全新安装与优化

    原版WINDOWS10_LTSB_X64位操作系统,安装U盘的制作 1.在一台能正常运行的电脑上,下载原版WINDOWS10_LTSB_X64位操作系统镜像(ISO)文件: 2.运行UltraISO. ...

  4. 估算带卷积核二分类0,3的网络的收敛时间和迭代次数

    制作一个网络分类minst的0和3求出这网络的迭代次数曲线表达式n(δ),和准确率表达式p-max(δ),用预期准确率去估算n,并推算需要的时间. 将minst的28*28的图片缩小到9*9,网络用一 ...

  5. SCSI 总线和协议

    I/O 技术实现在计算机和存储设备之间的数据交换.实现从CPU 到存储系统的I/O通路的一个中间就是SCSI(Small Computer System Interface). 一.  I/O 通路 ...

  6. 李洪强-C语言5-函数

    C语言函数 一.函数 C语言程序是由函数构成的,每个函数负责完成一部分的功能,函数将工恩呢该封装起来,以供程序调用. 二.函数定义 目的:将一些常用的功能封装起来,以供日后调用. 步骤:确定函数名,确 ...

  7. 最新 android系统 设备 分布情况,CNCERT 2018年第一季度国内操作系统及浏览器占比情况分析...

    原标题:CNCERT 2018年第一季度国内操作系统及浏览器占比情况分析 国家互联网应急中心(以下简称CNCERT)对2018年第一季度国内网络访问情况进行了抽样分析,重点针对操作系统及浏览器占比情况 ...

  8. B S架构 服务器虚拟化,基于KVM的B/S架构虚拟化管理系统

    云计算的提出为信息技术学术界和产业界的发展提供了一个全新的思路.虚拟化作为云计算Iaas层的关键技术,近年来也得到了迅速发展.20世纪60年代,IBM就开始研究虚拟化技术,使得大型机的资源能得被多用户 ...

  9. CPU硬件辅助虚拟化技术

    目前主要有Intel的VT-x和AMD的AMD-V这两种技术.其核心思想都是通过引入新的指令和运行模式,使VMM和Guest OS分别运行在不同模式(ROOT模式和非ROOT模式)下,且Guest O ...

最新文章

  1. 奇怪吸引子---Dadras
  2. 意法半导体STM32 ARM Cortex 32位微控制器
  3. NOIP2012开车旅行 【倍增】
  4. RS-485知识点小结
  5. 关系型数据库 (数据库类型)
  6. LeetCode 880. 索引处的解码字符串(找规律)
  7. vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多
  8. C++/C--浮点型数据的二进制表示及其内存存储形式
  9. 快手副总裁林粼:快手将从事5G相关业务线研究布局
  10. Zabbix(五)利用Zabbix部署onealert云告警平台
  11. 1.业务层 、服务层、数据层、表现层
  12. 什么软件可以测试网络的稳定性,手机怎么测试网络稳定性
  13. 已解决:网易邮箱smtphz.qiye.163.com在阿里云环境发不出邮件的问题
  14. 播放和保存视频,图像倒置纠正到本地文件夹(含ffmpeg ,pyav多线程读取多路网络摄像头)
  15. php关注账号,一键关注微信公众平台账号
  16. ML 能解决哪些问题?
  17. php梗相亲梗,没文化太可怕了,心疼这位相亲的php程序员
  18. postgre创建存储过程_postgre 存储过程
  19. 【附源码】计算机毕业设计JAVA茶店订购管理系统
  20. 断点续传的Java桌面程序

热门文章

  1. 利用js实现popup弹窗
  2. 类库,通用变量,is/as运算符,委托。
  3. spring中@param和mybatis中@param使用区别
  4. [BZOJ1177][Apio2009]Oil
  5. Matlab多项式回归实现
  6. 【转】 Linux内核中读写文件数据的方法--不错
  7. 自定义Dialog(图片,文字说明,单选按钮)----类ListPreference实现(2)
  8. 回车无法直接提交当前光标所在控件中的数据
  9. ls 命令还能这么玩?看一下这 20 个实用范例
  10. NVelocity的宏使用