《一个操作系统的实现》读书笔记-- 第一章--最小的“操作系统”

2023-11-19

一、最简单的“操作系统”

最最简单的“操作系统”就是一个最最简单的引导扇区(Boot Sector)。虽然它不具有任何功能,但是它却能够直接在裸机上运行,不依赖其他软件。一个引导扇区是512个字节,并且以0xAA55为结束标识的扇区。下面就是那个最最简单的引导扇区。

org 07C00h                   		; 告诉编译器程序加载到07C00处
       mov ax, cs
       mov ds, ax
       mov es, ax
       call DispStr                    	; 调用显示字符串例程
       jmp $              		; 无限循环
DispStr:
       mov ax, BootMessage
       mov bp, ax                    	; es:bp = 串地址
       mov cx, 16                    	; cx = 串长度
       mov ax, 01301h            	; ah = 13, al = 01h
       mov bx, 000Ch              	; 页号为0(bh = 0) 黑底红字 (bl = 0Ch,高亮)
       mov dl, 0
       int 10h                          ; 10h号中断
       ret
BootMessage:  db "Hello,OS world!"
times 510-($-$$)   db   0            	; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55                               ; 结束标志

1、org 07C00h

org伪指令: org + 数值表达式

其中,org是操作码,不可省略。数值表达式给出偏移地址值,即org语句后的指令或数据以数值表达式给出的值作为起始的偏移地址。数值表达式必须是一个可计算得到的正整数,数值范围在0~65535之间。

org伪指令用来指出其后的程序段或数据块存放的起始地址的偏移量。汇编程序汇编时把语句中表达式的值作为起始地址,连续存放org语句之后的程序和数据,直到出现一个新的org指令。若省略org语句,则从本段起始地址开始连续存放。

在大多数情况下,不需要用org语句设置位置指针。由于段定义语句是段的起点,它的偏移地址为0000H,以后每分配一个字节,位置指针自动加1,所以每条指令都有确定的偏移地址。只有程序要求改变这个位置指针时,才需要安排org语句。通常org语句可以出现在程序中任何位置上。   

org示例:

在数据段中依次定义以下变量,由于此时没有使用org语句,则变量word1的偏移地址为0。
word1 DW  1234h
byte1  DB   56h
word2 DW  abcdh
其在数据段中word1,byte1,word2的存储位置如下图所示(采用小端存储,按单字节对齐)。


在数据段中依次定义以下变量,由于此时使用org语句,则变量word1的偏移地址为1。
org 0001h
word1 DW  1234h
byte1  DB   56h
word2 DW  abcdh
其在数据段中word1,byte1,word2的存储位置如下图所示(采用小端存储,按单字节对齐)。

我们知道编译器本身在汇编时对指令的地址计算是相对地址,而对于引导扇区,是按绝对地址执行,那么对于用相对地址编译的执行码就要换算成绝对地址。一般而言,“真实开始执行的引导扇区”都会固定装载到07C00h处。

由于编译器在编译时的地址是从第一行开始用0000h开始相对计算的,而且我们要写的是“引导扇区”程序,所以我们要将下面的代码加载到地址07C00h处,所以我们需要org 07C00h,通过该伪指令,将代码和数据加载到07C00h地址。

2、jmp $

$被称为当前位置计数器

在汇编程序对源程序进行汇编的过程中,使用地址计数器来保证当前正在汇编的指令地址。地址计数器值可用“$”来表示,汇编语言也允许用户直接用“$”来引用地址计数器的当前值,因此,org $+5可表示从当前地址开始跳过5个字节存储单元,在指令和伪指令中,也可直接用“$”表示地址计数器的当前值。故jmp $进入了一个无限循环。

3、int  10h

int  10H号中断

int 10H 是由BIOS 对屏幕及显示器所提供的服务程序。使用int 10H 中断服务程序时,先指定 AH 寄存器为下表编号其中之一,该编号表示欲调用的功用,而其他寄存器的详细说明,参考表后文字,当一切设定好之后再调用 int 10H。

在这里我们只详细讲解本程序中的10号中断。由于ah=13,故调用编号为13的功能:即显示字符串。其中ES:BP=串地址,CX=串长度 ,AH=13,当AL=01h时,光标会跟随显示移动。BH为页号,BH=0表示页号为0,BL=0CH,表示属性,即黑底红字高亮。因此在调用10号中断之前,无非就是对各个寄存器进行初始化。

关于10号中断的其他信息,请参考 http://blog.csdn.net/yes_life/article/details/6778834

4、times 510-($-$$)  db  0

times:重复指令或数据

times前缀引起指令被汇编多次。其中$$表示是该程序的初始代码段的地址,故该指令将会被执行510-($-$$)次。也就是用0来填充剩下的空间,达到510字节。

二、如何运行该“操作系统”

1、环境准备

(1)计算机操作系统(Windows)
(2)虚拟机(VMware)
(3)汇编编译器(NASM)
(3)软盘(虚拟软盘RamDiskNT)
(4)rawrite.exe/本书光盘自带OS/Tools/FloppyWriter,负责将程序写入到软盘。

2、编译boot.asm

将上述代码文件命名为boot.asm,然后使用nasm命令编译该文件。
nasm boot.asm –o boot.bin

3、虚拟软盘A


点击Start之后,查看“我的电脑”里是否有虚拟软盘A,如果没有,重启。

4、将boot.bin写入到软盘A


点击Enter。(注意boot.bin与Rawrite.ext在同一文件目录下)。

5、创建虚拟机

安装VMware,在VMware创建一个虚拟机,命名为Tinix,并设置系统引导盘为软盘A。


启动该系统,得出结果图为:


三、本操作系统启动流程

打开计算机电源;加电自检(POST);寻找启动盘,该系统设置从软盘启动,计算机检查软盘的0面0磁道1扇区,如果发现它以0xAA55结束,则BIOS会认为它是一个引导扇区;BIOS将该512字节扇区内容加载到内存地址0000:7c00;跳转到0000:7C00出将控制权交给这段引导代码。到此为止,计算机不再由BIOS中固有的程序来控制,而变成由操作系统的一部分来控制。

上述工具下载地址 http://download.csdn.net/detail/zgh1988/6922887


最近做了一个 Json 格式化,在线时间戳转换,Md5 编码,URL 编码,Base64 编解码,正则表达式,Linux 命令大全 等功能,欢迎大家使用和加入。

Json 格式化在线时间戳转换Md5 编码Url 编码Base64 编解码 正则表达式 Linux 命令大全

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《一个操作系统的实现》读书笔记-- 第一章--最小的“操作系统” 的相关文章

  • Tomcat7安装及配置教程

    Apache Tomcat7 0安装及配置教程 Apache Tomcat7 0官方网站链接 http tomcat apache org apache tomcat 7 0 73 windows x64 先解压下载的压缩包 然后在bin目
  • java调优总结

    JVM调优总结 序 几年前写过一篇关于JVM调优的文章 前段时间拿出来看了看 又添加了一些东西 突然发现 基础真的很重要 学习的过程是一个由表及里 再由里及表的过程 呵呵 所谓的 温故而知新 而真正能走完这个轮回的人 也就能称为大牛或专家了
  • 文件管理系统(操作系统)——9张思维导图

    文件管理系统 1 文件管理 1 1 一个文件的逻辑结构 比如一个文本txt文件 又或者Excel文件 在我们用户看来 它是长什么样的 这个就是逻辑结构 几个概念 逻辑结构 就是指在用户看来 单个文件内部的数据应该是如何组织起来的 物理结构
  • linux 如何创建卷组

    1 创建一个物理卷 Pvcreate dev sd1 dev sd2 dev sd3 dev sd4 2 用刚才创建的物理卷创建一个卷组 Vgcreate 卷组名 dev sd1 dev sd2 dev sd3 dev sd4 3 创建逻辑
  • 掉电无法启动数据库问题解决

    由于突然掉电 造成客户在windows平台上10 2 0 1数据库无法驱动 以下是具体解决步骤 一 定位故障问题 1 启动数据库 查看错误 SQL gt startup ora 01113 file 1 needs media recove
  • VMware-Ubuntu安装bochs

    我的运行环境是VMware的Ubuntu 首先大家可以按照CSDN上的教程按照符合自己需求的虚拟机 我在上午还在VMware和virtualBox之间做选择 但是由于已经安装过了VMware 所以我就直接用了VMware 当然了 一千人眼中
  • pycharm内存不足时如何修改设置?

    Help gt Find Action gt type VM Options gt Click Edit Custom VM Options Pycharm 2016 2 will open the appropriate vmoption
  • Linux使用nvida-smi查看GPU类型

    nvida smi提供一个查看GPU信息的方法 然而这种方式不能查看GPU型号 型号被省略成了GeForce RTX 208 如果我们需要查看GPU的型号 只需要运行nvidia smi L即可 mrfive ubuntu nvidia s
  • 程序员的自我修养——链接、装载与库

    1 温故而知新 操作系统概念 北桥 连接高速芯片 系统调用接口 以软件中断的方式提供 如Linux使用0x80号中断作为系统调用接口 多任务系统 进程隔离 设备驱动 直接使用物理内存的弊端 地址空间不隔离 内存使用效率低 程序运行的地址不确
  • Linux alien命令

    一 简介 alien是一个用于在各种不同的Linux包格式相互转换的工具 其最常见的用法是将 rpm转换成 deb 或者反过来 二 安装 http toutiao com a6188997768449360129 三 实例 http www
  • Linux 内核中的 Device Mapper 机制

    Linux 内核中的 Device Mapper 机制 尹 洋 在读博士生 尹洋 中科院计算所国家高性能计算机工程技术研究中心的在读博士生 主要从事服务部署和存储资源管理以及Linux块设备一级的开发和研究工作 简介 本文结合具体代码对 L
  • Ubuntu9.04太多乱码(中文不能正常显示)

    最近在使用Ubuntu9 04的过程中 发现有好多地方都出现乱码 其实是中文不能正常显示 现在把我所遇到的所有乱码问题集中一下 方便以后查阅参考 一 Flash乱码 在终端输入 sudo gedit etc fonts conf d 49
  • 内存管理——分页分段

    一 分页存储管理 1 页面与页框 1 页面 将一个进程的逻辑地址空间分成若干个大小相等的片 称为页面或页 并为各页加以编号 2 页框 相应于页面 把内存空间分成和页面相同大小的若干个存储块 称为 物理 块或页框 frame 3 页内碎片 在
  • OS——文件管理系统磁盘的结构之搞清盘面和柱面

    如上图 每个柱面有三个盘面 即就是3个磁道 柱面可以抽象的理解成是一个套一个的立体的同心圆柱体 例 2019年408真题 磁盘有300个柱面 每个柱面有10个磁道 每个磁道有200个扇区 扇区大小为512B 则磁盘容量 分析 每个柱面有10
  • java IO、NIO、AIO详解

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 IO流 同步 阻塞 二 NIO 同步 非阻塞 三 NIO2 异步 非阻塞 正文 回到顶部 概述 在我们学习Java的IO流之前 我们都要了解几个关键词 同步与异步 sy
  • gdb attach 进程调试

    gdb调试正在运行的进程 GDB可以对正在执行的程序进行调度 它允许开发人员中断程序 并查看其状态 之后还能让这个程序正常地继续执行 gdb attach xxxxx xxxxx为利用ps命令获得的子进程process
  • 使用ShellJS提升你的开发效率(一)

    Shelljs Unix shell commands for Node js Shelljs是Node js下的脚本语言解析器 具有丰富且强大的底层操作 Windows Linux OS X 权限 Shelljs本质就是基于node的一层
  • I/O设备模型

    I O设备模型 绝大部分的嵌入式系统都包括一些I O Input Outut 输入 输出 设备 例如仪器上的数据显示屏 工业设备上的串口通信 数据采集设备上用于保存数据的Flash或SD卡 以及网络设备的以太网接口等 I O设备模型框架 R
  • 【操作系统xv6】学习记录4-一级页表与二级页表

    占位
  • 八股文打卡day20——操作系统(3)

    面试题 线程同步的方式有哪些 我的回答 多线程同时访问和修改某个数据的话 会造成数据的不一致和冲突问题 所以就需要线程同步 线程同步的方式有 1 互斥锁 互斥锁就是 当一个资源被访问和操作时 会对这个资源加锁 把这个资源锁定 其他线程不能对

随机推荐

  • 部署docker

    1 移除之前安装过的Docker sudo yum y remove docker docker client docker client latest docker common docker latest docker latest l
  • maven怎么引入jdom_如何在Maven项目中引入自己的jar包

    1 一般情况下jar包都可以使用pom xml来配置管理 但也有一些时候 我们项目中使用了一个内部jar文件 但是这个文件我们又没有开放到maven库中 我们会将文件放到我们项目中 以下以java工程为例随便放了个地方 2 jar包的引入和
  • RK3308 Ubuntu16.04移植

    一 概述 本章将介绍Ubuntu在RK平台上的移植以及AP配网 常用的fs为buildroot编译出来的linux文件系统 而本次则是ubuntu文件系统 系统启动后需要手动对WIFI驱动进行加载并配网 二 配置Kernel 为了支持ubu
  • python requests 爬虫--爬取HTML源码不显示正文已解决

    爬虫第一步 获取整个网页的HTML信息 源代码如下 coding UTF 8 import requests if name main target https www biqukan com 1 1094 5403177 html req
  • Wireshark过滤规则及使用方法

    前言 我看到的这篇文章是转载的 但我也不知道他是从哪转载的 o 转自 Wireshark 基本语法 基本使用方法 及包过滤规则 1 过滤IP 如来源IP或者目标IP等于某个IP 例子 ip src eq 192 168 1 107 or i
  • Java基础:常用类Compare

    Compare类 Comparable接口 自然排序 1 像String 包装类等实现了Comparable接口 重写了compareTo 方法 2 String 包装类重写了compareTo 方法后 进行了从小到大的排列 Test pu
  • Linux内核内存管理算法Buddy和Slab

    文章目录 Buddy分配器 CMA Slab分配器 总结 Buddy分配器 假设这是一段连续的页框 阴影部分表示已经被使用的页框 现在需要申请一个连续的5个页框 这个时候 在这段内存上不能找到连续的5个空闲的页框 就会去另一段内存上去寻找5
  • AtCoder Beginner Contest 169 B Multiplication 2 long long竟然不够用

    AtCoder Beginner Contest 169 比赛人数11374 比赛开始后15分钟看到A题 在比赛开始后第20分钟看到所有题 AtCoder Beginner Contest 169 B Multiplication 2 lo
  • OpenGL ES 2.0升级到3.0配置win32环境以及编译所遇bug

    安装win32平台的OpenGL ES 3 0模拟器 一 安装3 0模拟器 一般用32位的 https developer arm com products software development tools graphics devel
  • ctfshow-网络迷踪-初学再练( 一座雕像判断军事基地名称)

    ctf show 网络迷踪第4关 题目中只有一座雕像 需要根据雕像提交军事基地的名称 推荐使用谷歌识图 溯源到一篇博客 答案就在文章标题中 给了一座雕像 看样子不像是国内的风格 扔谷歌识图找找线索 访问谷歌识图 根据图片搜索 https w
  • kubernetes常见异常处理

    一 kubernetes常见Pod异常状态的处理 一 一般排查方式 无论 Pod 处于什么异常状态 都可以执行以下命令来查看 Pod 的状态 kubectl get pod
  • 拉格朗日乘数法

    拉格朗日乘数法
  • attention(注意力机制)原理和pytorch demo

    目录 说明 RNN的局限性 注意力机制原理 注意力机制实现 第一步 编码 第二步 第0次打分并解码 第三步 第1次打分并解码 Demo链接和结果分析 总结 改进 说明 demo源自吴恩达老师的课程 从tensorflow修改为pytorch
  • Selenium成长之路-01如何开始学习

    为什么最近要写selenium 是因为最近有不少同事问我关于selenium的问题 所以觉得有必要来写一篇selenium 从环境搭建到框架构成都写出来 也分享一下我的selenium的点点经验 有不足之处 欢迎吐槽 学习selenium之
  • 区块链技术是如何应用到版权维护上?

    随着视频和音乐行业的迅速发展 数字出版已经形成完整的产业链 带来一些可观的收入 但是也伴随侵权的现象发生 那么区块链技术怎么运用到作品版权保护上呢 1 时间戳 我们知道区块链有一个 时间戳 这个可信时间戳由权威机构签发 能证明数据电文在一个
  • 我的百度经验目录

    百度经验目录 进一步了解基于Mathematica的图像特征检测方法 http jingyan baidu com article a501d80c44a372ec630f5eb4 html 怎么把python代码打包成exe文件 http
  • Obsidian入门

    这里讲一下Obsidian 一款支持markdown语法的笔记软件 软件上手没有难度 会基本的markdown语法可以直接使用 但是Obsidian第三方库插件社区提供了近千种插件以及各种各样的主题 可以帮助用户更好的使用它 相信很多人都跟
  • Python 导出保存 MongoDB上数据到Excel(.xls和.csv)文件

    Python 中使用MongoDB存储数据 若需要导出数据到文件 可以使用pandas或xlwings导出到Excel xls和 csv 文件 本文主要介绍Python 中导出保存MongoDB上数据到Excel xls和 csv 文件的方
  • CVPR17(backbone) - ResNeXt : 引入网络设计中的新维度cardinality

    文章目录 原文地址 论文阅读方法 初识 相知 回顾 代码 论文全称 Aggregated Residual Transformations for Deep Neural Network 原文地址 原文地址 论文阅读方法 三遍论文法 初识
  • 《一个操作系统的实现》读书笔记-- 第一章--最小的“操作系统”

    一 最简单的 操作系统 最最简单的 操作系统 就是一个最最简单的引导扇区 Boot Sector 虽然它不具有任何功能 但是它却能够直接在裸机上运行 不依赖其他软件 一个引导扇区是512个字节 并且以0xAA55为结束标识的扇区 下面就是那