《Linux0.11源码解读》理解(二) 加载setup、加载system

news2024/11/24 19:02:43

现在CPU开始执行bootsect,它的作用是把第二部分、第三部分程序陆续加载到内存中。把放到合理的内存位置需要先对内存进行规划。

根据上一节,boostsect当前所在内存位置是0x07c0,大小为512byte,现在要将其挪动到内存的0x9000(INITSET)。除此以外,还要将位于硬盘上的4个(SETUPLEN)扇区的setup程序加载到内存的0x9020(SETUPSEG);最后要将system程序(内核)加载到内存的0x1000(SYSSEG),并指定了其末尾位置(ENDSEG)。

SYSSIZE = 0x3000
SETUPLEN = 4				; nr of setup-sectors
BOOTSEG  = 0x07c0			; original address of boot-sector
INITSEG  = 0x9000			; we move boot here - out of the way
SETUPSEG = 0x9020			; setup starts here
SYSSEG   = 0x1000			; system loaded at 0x10000 (65536).
ENDSEG   = SYSSEG + SYSSIZE		; where to stop loading

注意,这里的INITSET,SETUPSEG,SYSSEG会被ds(数据段基址)载入,因此在实模式下的实际加载内存位置是0x90000,0x90200(bootsect占据的512字节内存末尾正是0x90000+0x200,说明bootsect和setup在内存里紧挨着),0x10000。

如何将已位于内存的bootsect挪动位置

通过ds:si和es:di指定源地址和目的地址,cx指定重复操作的次数,movw每次复制2字节一共是512字节。然后jmpi段间跳转将cs:ip设置为0x9000:go以让程序从go标签继续。

cs已被更新为0x9000,同样将其赋予ds、es,并设置栈顶为0x9ff00,为后续栈操作做好准备。

	mov	ax,#BOOTSEG
	mov	ds,ax
	mov	ax,#INITSEG
	mov	es,ax
	mov	cx,#256
	sub	si,si
	sub	di,di
	rep
	movw
	jmpi	go,INITSEG
go:	mov	ax,cs
	mov	ds,ax
	mov	es,ax
; put stack at 0x9ff00.
	mov	ss,ax
	mov	sp,#0xFF00		; arbitrary value >>512

如何将setup加载到指定位置

答案仍是调用BIOS的0x13中断,只不过和上一节课0x19中断不同的是,0x13的参数由我们bootsect的程序来指定,其中包括指定硬盘0盘面0磁头、2扇区0磁道、偏移地址512(0x200)、ah中断所属的功能号0x02,al待读setup的扇区数是4。最后调用int 0x13,通过cf标志是否为0判断0x13执行是否成功:失败并则重试,成功则无条件跳转到ok_load_setup。

load_setup:
	mov	dx,#0x0000		; drive 0, head 0
	mov	cx,#0x0002		; sector 2, track 0
	mov	bx,#0x0200		; address = 512, in INITSEG
	mov	ax,#0x0200+SETUPLEN	; service 2, nr of sectors
	int	0x13			; read it
	jnc	ok_load_setup		; ok - continue
	mov	dx,#0x0000
	mov	ax,#0x0000		; reset the diskette
	int	0x13
	jmp	load_setup

如何将system加载到指定位置

核心代码就这几行,其作用是把从硬盘第 6 个扇区开始往后的 240 个扇区,加载到内存 0x10000 处,和之前的从硬盘复制到内存类似,read_it归根到底也用到了0x13。其原理都是通过磁盘控制器访问磁盘,要给出柱面,磁头,扇区等信息。详细read_it参考:https://blog.csdn.net/kunkliu/article/details/126294876

ok_load_setup:
    ...
    mov ax,#SYSSEG
    mov es,ax       ; segment of 0x10000
    call read_it
    ...
    jmpi 0,0x9020

 现在所有操作系统代码都已加载内存,给一张来自于《Linux0.11源码解读》的内存图景:

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

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

相关文章

无代码时代来了,程序员会失业吗?不,程序员又不够用了!

有人问我无代码时代来了,程序员会失业吗?太难了,秃了头就算了,连工作也保不住了? 先说观点:并不会 因为,无代码不是真正意义上的无代码。 无代码开发的使用对象是编程小白(我猿是…

Redis的命令以及数据类型

1.Redis的通用命令 KEYS:查看符合模板的所有key,不建议在生产环境设备上使用 DEL:删除一个指定的key EXISTS:判断key是否存在 TTL:查看一个KEY的剩余有效期 2.String类型 String类型,也就是字符串类型…

【Halcon】 Halcon 22.11 安装详细教程

文章目录 1安装2 获取许可证 license2.1 license下载2.2 激活 license放置在相应文件夹下 3 DLT 安装 1安装 1.解压安装包 2.打开运行 exe 程序 跳转至页面 点击“可获得的”,并安装 选择: AVAILABLE ->INSTALL 可获得的 ->安装 5. 等待安装 6…

jQuery -- 常用API(下)

4. jQuery属性操作 4.1 设置或获取元素固有属性值prop() 所谓元素固有属性就是元素本身自带的属性,比如 元素里面的 href ,比如 元素里面的 type。 获取属性语法:prop(属性)设置属性语法:prop(属性, 属性值) 4.2 设置或获取元…

掌握黑客技术:从Kali渗透测试开始

前言 Kali Linux是一种流行的渗透测试和网络安全工具,广泛用于测试和评估网络系统和应用程序的安全性。下面是一个简单的Kali Linux使用教程(Kali使用教程中需要学习的知识点),旨在帮助初学者了解如何使用Kali Linux进行渗透测试…

【计算机网络】网络分层结构

应用层 软件 传输层 TCP UDP协议 网络层 实现源主机到目标主机的传输 IP协议 可能会丢失,可能失序、可能错误 工作设备:路由器、防火墙 链路层 相邻两点的数据传输以帧为单位的数据。 工作设备:交换机 物理层 光信号 电信号 网络边…

15.JVM8为什么要增加元空间

JVM从永久代至元空间内存结构变化图 变化后的java8图 变化之前java7以及之前各代的图 看出变化了吗?堆和方法区连在了一起,但这并不能说堆和方法区是一起的,它们在逻辑上依旧是分开的。但在物理上来说,它们又是连续的一块内存。…

面了一个4年经验的测试工程师,自动化都不会也要15k,我也是醉了····

在深圳这家金融公司也待了几年,被别人面试过也面试过别人,大大小小的事情也见识不少,今天又是团面的一天, 一百多个人都聚集在一起,因为公司最近在谈项目出来面试就2个人,无奈又被叫到面试房间。 整个过程…

mxf文件格式详解

MXF是英文Material eXchange Format(素材交换格式)的缩语。MXF是SMPTE(美国电影与电视工程师学会)组织定义的一种专业音视频媒体文件格式。MXF主要应用于影视行业媒体制作、编辑、发行和存储等环节。SMPTE381M(把MPEG格…

如何在 Linux 中使用 GPG 加密和解密文件?

什么是 GPG? GPG(GNU Privacy Guard)是一种免费的开源加密软件,用于保护计算机数据的机密性和完整性。 它使用非对称加密算法,也称为公钥加密算法,其中数据被加密和解密时使用不同的密钥。每个用户都有一个…

【C++】类与对象(2)

【C】类与对象(2) 作者:爱写代码的刚子 时间:2023.5.4 本篇博客有关构造函数、析构函数、拷贝构造的知识,由于本篇博客可能比较详细,还剩一些内容没介绍,所以我将剩余的知识放在下一篇博客。 目…

探究Spring中Bean的线程安全性问题

前言 今天同事笑嘻嘻的凑过来,问了我一个问题:spring中的bean是线程安全的吗?。我内心一想肯定是安全的,毕竟这样多项目在用。但是转念一想,他那贱兮兮的表情,多半是在给我挖坑。于是我自信的回答他&#x…

如何在 DigitalOcean 中部署 ONLYOFFICE 文档

现在您可使用通过 DigitalOcean 市场提供的一键式应用在 DigitalOcean 云架构中轻松部署 Docker 版本的 ONLYOFFICE 文档。 一键式应用是一个包含所有必要预配置组件的镜像,可用于便捷地在运行有 Ubuntu OS 的 DigitalOcean 服务器上部署 ONLYOFFICE: D…

单元测试~

文章目录 单元测试Junit单元测试框架 单元测试 Junit单元测试框架

客户端无法连接docker启动的nacos-config服务

nacos踩坑记录: 基于镜像仓库教程 : https://hub.docker.com/r/nacos/nacos-server 在虚拟机启动了nacos服务,控制台可以正常打开.但是客户端无法正确连接.但是又没有明确的异常信息,只有一行warn日志:There is no content for NacosPropertySource from dataId[application.ym…

面试必问的【网络io】,1.5W字超全面总结

今天分享的基本上一面试就会被问的网络IO。文中涉及的代码部分不太重要,重要的是对这概念的理解。在看文章之前大家也可通过下面的思维导图看看自己是否能回答出来。 ​大纲 1 阻塞与非阻塞--开胃菜 阻塞 我们知道在调用某个函数的时候无非就是两种情况&#xff0…

1553B总线与FlexRay总线的协议转换

1553B总线与FlexRay总线的协议转换 背景技术: 某一1553B数字时分系统,存在响应型和周期型两种类型的指令传输。如果在1553B总线上传输周期型指令,不仅会造成BC->RT调度指令的大量重复,还存在BC设备和RT设备时间不同步的风险&a…

API 渗透测试从入门到精通系列文章(下)

导语:在本系列文章的前面一部分我们从使用 Postman 开始,创建了集合和请求,并通过 Burp Suite 设置为了 Postman 的代理,这样我们就可以使用 Burp 的模糊测试和请求篡改的功能。 在本系列文章的前面一部分我们从使用 Postman 开始…

Unity 后处理(Post-Processing) -- (3)挑战:创建局部后处理Volume

为何使用局部Volume 在前面两节中,我们使用了一个Global Volume来应用后处理,其作用范围是整个场景。有些时候,我们需要实现当角色靠近某个地点后,进行一些特殊的后处理。这时我们就需要使用Local Volume来实现这个功能。 举个例子…

网络安全就业岗位与薪资

前段时间,知名机构麦可思研究院发布了《2022年中国本科生就业报告》,其中详细列出近五年的本科绿牌专业,*信息安全位列第一。* 对于网络安全的发展与就业前景已经说过很多,它是收入较高的岗位之一,在转行领域也占据着…