阅读分析Linux0.11 /boot/bootsect.s

目录

  • entry_start
  • load_setup
  • print_message
  • load_system
  • kill_motor
  • root_defined
  • jmpi 0,SETUPSEG

    bootsect.s是操作系统安装好后,操作系统所在磁盘引导扇区中的代码。 开机时CPU处于实模式 CS=0XFFFF;IP=0X0000,先执行烧录在主板ROM中的BIOS程序, BIOS会映射到内存的0XFFFF0处。BIOS会进行硬件检测、 安装BIOS提供的中断例程到中断向量表等工作,最重要的是将磁盘中(最初使用的软盘)0磁头0磁道1扇区的 引导程序bootsect.s加载到内存的0X7C00处,然后设置CS=0X7C0;IP=0X0000,开始执行引导扇区的引导程序bootsect.s。


    bootsect.s源码的大致结构如下。最复杂的是 load_system模块,我会单独列出它的流程图。

entry_start
load_setup
print_message
load_system
kill_motor
root_defined
jmpi 0,SETUPSEG

entry_start

  • 功能:将加载到内存0X7C0处的引导扇区内容bootsect.s,整体移动到内存的0X90000处,目的是为了腾出更多的空间,后面的system模块会加载到内存0X10000处。
  • 掌握汇编的串传送指令rep movsw、实模式段地址和偏移地址、扇区的大小是512字节就能看懂这段代码。

load_setup

  • 功能:将 紧跟在磁盘引导扇区 后面的SETUP模块(4个扇区)加载到内存中,也是紧跟在移动到内存0X90000处的引导扇区(bootsect.s)之后。
  • 主要就是使用了磁盘IO的中断例程int 0X13 ah=0X2 读取磁盘中扇区加载到内存指定位置。
  • 加载完SETUP模块后,又调用中断例程int 0X13 ah=0X8 获取磁盘的参数,将每磁道的扇区数保存在sector中,最复杂的load_system模块需要这个数据。

print_message

  • 功能:在等待计算机启动时显示信息,就好像安装windows系统的电脑开机后,看到的windows的相关logo。
  • 通过中断例程 int 0X10 ah=0x13 屏幕显示服务,打印字符串。

load_system

  • 功能:system模块是操作系统的核心,这段代码就是加载操作系统的核心模块。阅读这段时,深深理解了,为什么程序员宁愿自己重写,不想维护别人的代码。
  • 读懂这段代码的知识点1:实模式下访存方式,内存分为多个段,每段大小为64KB。内存地址分为段地址和偏移地址,对内存写时,如果写入的内容超过了64KB,在写到偏移地址0XFFFF时,要及时对段寄存器修改,加0X1000,指向下一个64KB的边界。如果不修改段寄存器,只会破坏该段开始处写入的内容。
  • 知识点2:磁盘的读写方式。现代机械硬盘由多个盘片组成,每个盘片都有一个磁头,盘片上有多个同心的磁道,每个磁道有多个扇区。硬盘所有盘片的同一半径的磁道组成一个柱面。顺序读写磁盘就是按柱面读写,读写完一个柱面再换下一个柱面。采用这个方式是为了加快磁盘IO的速度,因为磁盘读写中通过摇头臂调整磁头指向的磁道最费时,所以按所有盘片同一半径的磁道顺序读取(柱面读取)减少调整磁头臂的次数,加快了磁盘IO。
  • load_system部分的代码就是围绕上面两个知识点写的,操作系统的核心模块System肯定远远超过64KB,加载时要注意判断内存段是否写满,写满就要更改段寄存器,指向下个段;通过中断例程int 0X13读磁盘时,判断磁道有没有读完,读完切换磁头到同一个柱面的下一个磁头指向磁道继续读,柱面是否读完,读完磁道加1,换到另一个柱面,从磁头0指向的磁道开始读


    下面是load_system部分的代码流程图:
内存地址是
64KB的边界
不是64KB的边界
内存地址小于
分配空间的最大地址
大于等于分配
空间的最大地址
原内存偏移地址加上要加载
扇区的字节数不能超过64KB
超过64KB
磁道未读完
磁道读完
柱面未读完
切换磁头
柱面读完
先换磁道
磁头归零
切换柱面
未达到64KB
达到64KB
read_it
mov ax,es
test es:ax,0X0FFF
jne die
rp_read
判断初始的段地址
是否合法以及
判断磁盘读取
是否结束
mov ax,es
cmp ax,#ENDSEG
jb ok1_read
ok1_read
程序返回
shl cx,#9
add cx,bx
jnc ok2_read
je ok2_read
ok2_read
算出不超过64KB加载的最大扇区数
xor ax,ax
sub ax,bx
shr ax,#9
call read_track
read_track
子程序read_track
负责读磁盘扇区
判断磁道是否读完
add ax,sread
seg cs
cmp ax,sectors
jne ok3_read
ok3_read
判断柱面是否读完
mov ax,#1
sub ax,head
jne ok4_read
此系统安装在软驱,磁头只有0和1
ok4_read
磁道自增
inc track
判断从磁盘读入的
数据是否达到64KB
shl cx,#9
add bx,cx
jnc rp_read
es:bx指向下一个
相邻的64KB边界
mov ax,es
add ax,#0x1000
mov es,ax
xor bx,bx
jmp rp_read

kill_motor

  • 功能:查deepseek得知,这段的功能是通过向端口写入参数关闭软驱。虽然写入端口的参数不是那么懂,软驱早就被淘汰了,也就没纠结。大致就是关闭软驱的功能,毕竟代码执行到此处,软盘中的操作系统都已经加载到内存了。

root_defined

  • 功能:查deepseek得知,这段涉及文件系统设备的初始化选择。
  • 这段代码能看懂,就是不理解。第一个不理解,就是软盘的相关的东西,软驱已经淘汰,不用在意;第二个不理解是几个16进制的数字,怎么跟设备,文件系统挂钩了?相信继续学习下去应该就懂了。
  • ROOT_DEV = 0x306这参数不止在这里bootsect.s定义了,fs/super.c中同样也定义了。fs我猜测应该表示filesystem文件系统,等学习到文件系统部分应该就理解现在的疑问了。

jmpi 0,SETUPSEG

  • 功能:执行到这儿,表示引导扇区的代码bootsect.s都执行完了,该执行已加载到内存的SETUP模块了,SETUP模块的段地址就是SETUPSEG = 0x9020

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

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

相关文章

Ubuntu24.04 离线安装 MySQL8.0.41

一、环境准备 1.1 官方下载MySQL8.0.41 完整包 1.2 上传包 & 解压 上传包名称是:mysql-server_8.0.41-1ubuntu24.04_amd64.deb-bundle.tar # 切换到上传目录 cd /home/MySQL8 # 解压: tar -xvf mysql-server_8.0.41-1ubuntu24.04_amd64.deb-bundl…

【算法应用】基于粒子群算法PSO求解无人机集群路径规划问题

目录 1.无人机路径规划模型2.粒子群算法PSO原理3.结果展示4.参考文献5.代码获取 1.无人机路径规划模型 路径最优性 为了实现UAV的高效运行,计划的路径需要在某一特定标准上达到最优。UAV飞行路径Xi表示为UAV需要飞过的一系列n个航路点,每个航路点对应搜…

电脑ip地址每次开机会换吗?全面解析

在探讨“电脑IP地址每次开机会换吗”这一问题时,我们首先需要明确的是,IP地址的更换情况并非一成不变,而是受到多种因素的影响,其中最核心的是IP地址的类型——动态IP还是静态IP。这两种类型的IP地址在分配方式、稳定性以及使用场…

sqli-labs靶场 less 8

文章目录 sqli-labs靶场less 8 布尔盲注 sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、’、“”&#xf…

docker-Dify外接Fastgpt知识库

参考地址:https://mp.weixin.qq.com/s/crQrneHZ0sT-c04YanofSw 总体步骤 部署fda(fastgpt-dify-adapter)docker 部署dify,fastgpt在fastgpt创建open apikey,复制知识库id;在dify外接fastgpt知识库; docker安装 下载…

Django学习笔记

Django学习笔记 安装django pip install django创建APP 用django来写后端的时候,要把各个功能分散到各个创建好的APP去实现 在终端输入 python manage.py startapp app01(APP名称)APP内部文件 admin.py django默认提供了admin后台管理 apps.py app启动类 mo…

向量数据库是什么,它有什么作用?

环境: 向量数据库 问题描述: 向量数据库是什么,它有什么作用 解决方案: 向量数据库是一种专门设计用于高效处理高维向量数据的系统,主要用于存储、索引、查询和检索高维向量数据,特别适合处理非结构化数…

【SPP】蓝牙串口协议应用层深度解析:从连接建立到实战开发

目录 一、SPP应用层协议框架与角色模型 1.1 分层协议栈模型 1.2 设备角色模型(DevA 与 DevB 交互) 二、连接建立流程:从 SDP 到 RFCOMM 2.1 服务发现(SDP)流程(SDP 记录关键参数) 2.2 连接…

【Portainer】Docker可视化组件安装

Portainer Portainer 是用于管理容器化环境的一体化平台工程解决方案,提供广泛的定制功能,以满足个人开发人员和企业团队的需求。 官方地址: https://www.portainer.io/ 安装 在 WSL / Docker Desktop 上使用 Docker 安装 Portainer CE 通过命令或UI页…

【第33节】windows原理:初探PE文件

目录 一、PE文件概述 二、DOS头部 三、DOS头部与NT头部之间 四、NT头部 五、文件头区段 六、了解个别概念 七、扩展头 八、区段头表 一、PE文件概述 PE文件是有特定格式的文件,像后缀名是EXE的可执行文件、后缀名是DLL的动态链接库文件、sys格式的驱动文件&…

谷粒微服务高级篇学习笔记整理---异步线程池

多线程回顾 多线程实现的4种方式 1. 继承 Thread 类 通过继承 Thread 类并重写 run() 方法实现多线程。 public class MyThread extends Thread {Overridepublic void run() {System.out.println("线程运行: " Thread.currentThread().getName());} }// 使用 pub…

网络运维学习笔记(DeepSeek优化版) 024 HCIP-Datacom OSPF域内路由计算

文章目录 OSPF域内路由计算:单区域的路由计算一、OSPF单区域路由计算原理二、1类LSA详解2.1 1类LSA的作用与结构2.2 1类LSA的四种链路类型 三、OSPF路由表生成验证3.1 查看LSDB3.2 查看OSPF路由表3.3 查看全局路由表 四、2类LSA详解4.1 2类LSA的作用与生成条件4.2 2…

飞桨PP系列新成员PP-DocLayout开源,版面检测加速大模型数据构建,超百页文档图像一秒搞定

背景介绍 文档版面区域检测技术通过精准识别并定位文档中的标题、文本块、表格等元素及其空间布局关系,为后续文本分析构建结构化上下文,是文档图像智能处理流程的核心前置环节。随着大语言模型、文档多模态及RAG(检索增强生成)等…

以科技赋能,炫我云渲染受邀参加中关村文化科技融合影视精品创作研讨会!

在文化与科技深度融合的时代浪潮下,影视创作行业经历着前所未有的变革。影视创作行业发展态势迅猛, 同时也面临着诸多挑战。为促进影视创作行业的创新发展,加强业内交流与合作, 3月25日下午,海淀区文化创意产业协会举办…

NFS挂载异常排查记录

互相PING服务器看是否通;在ubuntu下看下服务器是否正常运行。导出目录是否导出了。最后发现在挂载目录的地方目录路径和后面没有加空格。

flutter 专题 七十一 Flutter 自定义单选控件

在Flutter 应用开发中,经常会遇到各种单选效果,虽然官方提供了Radio组件,但是并不能满足我们实际的开发需求,所以往往还需要自定义控件才能满足平时的开发需求。下面就平时开发中用到的单选进行介绍: 自定义SegmentBa…

在Cesium中使用ThreeJs材质(不是场景融合哦)

在Cesium中使用ThreeJs材质(不是场景融合哦)_哔哩哔哩_bilibili

浅谈Thread类及常见方法与线程的状态(多线程编程篇2)

目录 前言 1.Thread类及常见方法 Thread类中常见的属性 1. getId() 2. getName() 3. getState() 4. getPriority() 5. isDaemon() 6. isAlive() 7. isInterrupted() 2.Thread类中常见的方法 Thread.interrupt() (中断线程) Thread.start()(启动线程) 1. 覆写 run…

Elasticsearch:人工智能时代的公共部门数据治理

作者:来自 Elastic Darren Meiss 人工智能(AI)和生成式人工智能(GenAI)正在迅速改变公共部门,从理论探讨走向实际应用。正确的数据准备、管理和治理将在 GenAI 的成功实施中发挥关键作用。 我们最近举办了…

使用事件监听器来处理并发环境中RabbitMQ的同步响应问题

RabbitListener 是 Spring AMQP 提供的核心注解,用于简化 RabbitMQ 消息监听器的创建。以下是对 RabbitListener(queues "balloonWords.queue") 的详细解析: 一、基础功能 队列监听 通过 queues 属性指定监听的队列名称(如 "…