自己动手写一个操作系统——loader(1)

news2024/12/23 18:24:08

前言

上篇文章中,我们写了一个简单的 loader 作为被加载的演示对象。我们知道 loader 是用来加载 kernel 的,今天我们就编写 loader 代码完成这件事情。

实模式下的内存地址

我们计划把 kernel 加载到内存的 0x10000 地址处。
在这里插入图片描述
不过面临一个挑战,实模式下地址线为 20 位,寄存器只有 16 位,要想通过寄存器去构成这 20 位的主存地址,必须采取一种特殊的方式。
当指令要想访问某个内存地址时,它通常需要用下面的这种格式来表示:
(段基址:段内偏移)
其中第一个字段是段基址,它的值由段寄存器来提供(一般来说,段寄存器有 6 种,分别为 cs、ds、ss、es、fs、gs),其中 cs 不可以直接通过汇编指令赋值,其它可以。
最终:
物理地址 = (段基址 << 4) + 段内偏移

段基址

我们想要把 kernel 加载到 0x10000 处,就要计算段基址和段内偏移,可知段基址为 0x1000,段内偏移为 0x0。
所以就要给段基址寄存器赋值 0x1000,段偏移寄存器赋值 0x0。

代码

loader.S

.code16
.global _start

_start:
    mov $0x1000, %ax
    mov %ax, %ds
	mov %ax, %ss
	mov %ax, %es
	mov %ax, %fs
	mov %ax, %gs
    # 加载 loader 到内存
    mov $0x0000, %bx    # 要加载到的内存地址
    mov $0x0003, %cx    # ch:磁道号(0x00),cl:起始扇区号(0x03),(扇区 0x01 为 MBR, 扇区 0x02 为 loader)
    mov $0x02, %ah      # ah:读磁盘命令
    mov $1, %al         # al:读取的扇区数量,必须小于128,暂时设置成 1 个扇区
    mov $0x0080, %dx    # dh:磁头号,dl:驱动器号0x80(磁盘1)
    int $0x13

    # 跳转到 loader
    jmp $0x1000, $0x0000

    jmp .

我们可以通过 mov 指令,向 ds、ss、es、fs、gs 段寄存器赋值 0x1000,但是 cs 段基址寄存器就不可以使用 mov 指令赋值了,需要使用 jmp 指令。如 jmp $0x1000, $0x0000 就会将 cs 赋值为 0x1000。

start.S

.code16
.global _start

_start:
    jmp .

kernel 的代码目前作为演示就写个简例。
不过注意要在链接时指定代码入口地址为 0x0000(为调试做准备)。
Makefile


OUTPUT=../_build/kernel

all:
	mkdir -p ${OUTPUT}
	as --32 -g -o ${OUTPUT}/start.o start.S
	ld -m elf_i386 -Ttext=0x00000 ${OUTPUT}/start.o -o ${OUTPUT}/start.elf
	objcopy -O binary ${OUTPUT}/start.elf ${OUTPUT}/kernel.bin	

	objdump -x -d -S  ${OUTPUT}/start.elf > ${OUTPUT}/start_dis.txt

clean:
	-rm ${OUTPUT}/*

调试

最终 loader 将 kernel 加载到内存的 0x10000 处,并跳转到该位置运行。
可以看到,段寄存器值全为 0x1000,段内偏移为 0x0(eip),该位置对应的汇编代码为 start.S:5 jmp .
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pug模板在Express框架中的集成

在未讲相关的模板引擎之前前面的篇目中所使用的网页页面大多是静态资源的网页内容&#xff0c;如在之前的案例中就使用过 app.use(express.static(path.join(__dirname&#xff0c;public))) &#xff0c;通过在本地上进行搭建服务器之后使用express.static()方法讲public下静态…

uni-app从入门到上天视频教程 23讲 我终于卷完了

大家好&#xff0c;我是锋哥&#xff01;祝大家新年快乐&#xff01; 过年走亲访友&#xff0c;休息了几天&#xff0c;今天把uni-app课程卷完了&#xff0c;23讲&#xff0c;免费基础课程。 uni-app技术介绍 uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;…

(免费分享)springboot音乐网站系统

开发工具&#xff1a;eclipse&#xff0c;数据库mysql5.7 jdk1.8技术&#xff1a;springbootmybatis/** * * * */package com.bjpowernode.music.ss.service.impl;import java.util.List;import javax.annotation.Resource;import com.bjpowernode.music.common.AbstractServ…

即时通讯开发之TCP/IP基本概念

在世界上各地&#xff0c;各种各样的电脑运行着各自不同的操作系统为大家服务&#xff0c;这些电脑在表达同一种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱 了各地人的口音&#xff0c;让他们无法合作一样。计算机使用者意识到&#xff0c;计算机只是单兵作战并不…

【数据结构】详解顺序表

目录 1.线性表和顺序表 1.线性表 2.顺序表 2.接口的实现 1. 接口1---初始化顺序表 2. 接口2&#xff0c;3---头插&#xff0c;尾插 3. 接口4&#xff0c;5---头删&#xff0c;尾删 4. 接口6&#xff0c;7---插入&#xff0c;删除 5. 接口8---查找 6. 接口9---修改 7.…

什么是HTTPS?为什么要为您的网站购买一个?

HTTPS或安全超文本传输协议是HTTP的安全版本&#xff0c;是一种用于在Web浏览器和网站之间通过Web传输数据的协议。HTTPS通过使用一种称为传输层安全性(TLS)的加密协议对服务器和浏览器之间传递的所有数据进行加密&#xff0c;以提高安全性&#xff0c;该协议前面是SSL&#xf…

【Pytorch项目实战】之人脸检测与识别:基于face_recognition开源人脸识别库

文章目录人脸检测与识别&#xff08;一&#xff09;实战&#xff1a;人脸检测&#xff08;图片&#xff09;&#xff08;二&#xff09;实战&#xff1a;人脸检测与识别&#xff08;视频&#xff09;人脸检测与识别 face_recognition 是开源人脸识别库。Face Recognition官网。…

启科 QuTrunk+Runtime+QuSaaS+亚马逊云科技量子计算编程实战

QuTrunk 是启科量子自主研发的一款免费、开源、跨平台的量子计算编程框架&#xff0c;包括量子编程 API、量子命令转译、量子计算后端接口等。它提供多种量子计算体验&#xff0c;提供本地量子计算 Python 计算后端&#xff0c;提供 OMP 多线程、MPI 多节点并行、GPU 加速等计算…

操作系统权限提升(一)之操作系统权限介绍

前言 操作系统权限提升简称提权,顾名思义就是提升自己在目标系统中的权限。现在的操作系统都是多用户操作系统,用户之间都有权限控制,比如通过Web漏洞拿到的是web进程的权限,往往Web服务都是以一个权限很低的账号启动的,因此通过 Webshell进行一些操作会受到限制,这就需要将其…

Leetcode力扣秋招刷题路-0094

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 94. 二叉树的中序遍历&#xff08;Easy&#xff09; 给定一个二叉树的根节点 root &#xff0c;返回它的 **中序 **遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出…

无线网络概论_4

成帧细节 数据帧&#xff1a;好比802.11中的驮马&#xff0c;负责在工作站直接板运输数据。控制帧&#xff1a;通常能够与数据帧搭配使用&#xff0c;负责区域的清空&#xff0c;信道的取得以及载波监听的维护并于收到数据时给予肯定确认&#xff0c;借此来增加数据传输的可靠…

垃圾收集器必问系列—CMS

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 应该相信&#xff0c;自己是生活的战胜者。——雨果 文章目录CMS简介运作过程CMS的缺陷处理器资源敏感无法处理“浮动垃圾”内存碎片纵观全书《深入理解JVM虚拟机》第三版&#xff0c;在垃圾回收器这一篇章&a…

CMakelists.txt简单介绍

先祝大家开工大吉&#xff0c;这篇策划一下CMakelists.txt&#xff0c;它依托在Cmake里&#xff0c;在大型工程、平台兼容方面非常好用的C项目编译工具&#xff0c;再此先对它做一个简短的介绍。 目录 一、CMakelists.txt简介 二、使用示例 三、总结 一、CMakelists.txt简介…

Eclipse swt环境搭建

通过Eclipse Marketplace安装打开eclipse&#xff0c;点击help&#xff0c;在弹出的框中&#xff0c;选择Eclipse Marketplace。如下所示。。。搜索windows 安装插件一、创建一个SWT项目点击左上角的File - > New -> Other...进入后搜索SWT ,选中在WindowBuilder下的SWT …

CnOpenData中国彩票销售数据

一、数据简介 彩票是一种编有号码的证券&#xff0c;按票面价格出售。开奖后&#xff0c;持有中奖号码奖券的&#xff0c;可按规定领奖。它是一种建立在机会均等基础上的、具有公平竞争特征的娱乐游戏。国家发行彩票的目的是筹集社会公众资金&#xff0c;资助福利、体育等社会公…

springboot中整合mybatis及简单使用

springboot中整合mybatis及简单使用1.引入依赖2.在applicaiton.yaml中配置数据源以及mybatis3.创建sql测试表4.编写mapper接口和mapper.xml文件4.1 mapper接口4.2 mapper.xml4.3 mybatisX快速开发插件5.创建service层和controller层5.1 创建service层5.2 创建controller层6.项目…

[网鼎杯 2018]Fakebook

目录 信息收集 代码审计 思路 解法一&#xff08;非预期解&#xff09; 解法二&#xff08;预期解&#xff09; 信息收集 目录扫描代码泄露扫描 robots.txt;flag.php;login.php;user.php;view.php;join.php; 直接打开flag.php后没有回显&#xff0c;应该需要通过ssrf来访…

Qt音视频开发12-easyplayer内核

一、前言 在视频监控行业经常看到两个厂家广告打得比较厉害&#xff0c;一个是青犀视频对应easyplayer&#xff0c;一个是大牛直播&#xff0c;两个最初都是sdk免费&#xff0c;并提供调用示例源码&#xff0c;后面大牛直播的sdk以及示例都无法运行&#xff0c;目前就剩下免费…

Word处理控件Aspose.Words功能演示:如何在 C# .NET 中将 PNG、JPG 转换为 Word

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…

git push clone 参数具体解析

1 问题背景 git远程仓库有很多命令&#xff0c;但是教程里面讲解的都是特别模糊的。 2 命令实例解析 2.1 git branch -vv -a命令具体解析 在开始下面的命令解析之前&#xff0c;我们一定要学会git branch -vv -a这个命令&#xff0c;这个是查询本地仓库远程仓库跟踪关系最全…