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

news/2024/11/29 5:28:55/

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

根据上一节,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,#BOOTSEGmov	ds,axmov	ax,#INITSEGmov	es,axmov	cx,#256sub	si,sisub	di,direpmovwjmpi	go,INITSEG
go:	mov	ax,csmov	ds,axmov	es,ax
; put stack at 0x9ff00.mov	ss,axmov	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 0mov	cx,#0x0002		; sector 2, track 0mov	bx,#0x0200		; address = 512, in INITSEGmov	ax,#0x0200+SETUPLEN	; service 2, nr of sectorsint	0x13			; read itjnc	ok_load_setup		; ok - continuemov	dx,#0x0000mov	ax,#0x0000		; reset the disketteint	0x13jmp	load_setup

如何将system加载到指定位置

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

ok_load_setup:...mov ax,#SYSSEGmov es,ax       ; segment of 0x10000call read_it...jmpi 0,0x9020

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


http://www.ppmy.cn/news/61637.html

相关文章

【Cutlass】tile iterator concept

简介 在Cutlass 2.x之前将matix或者tensor切分成固定尺寸的操作都是在tile iterator当中(Cutlass 3.0之后对于matrix和tensor的操作都放到了cute::Tensor里面)。tile_iterator_concept不同于c20里面的concept,这里不使用concept作为key word…

数据结构入门--栈和队列

栈 栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除的一段为栈顶,另一端为栈底。栈中元素遵循后进先出LIFO(Last In First Out)原则。 压栈:栈的插…

springboot网上商城项目(一)

springboot网上商城项目(一) (一)项目分析1.项目分析2.开发顺序3.前端资源测试 (二)用户注册1.创建数据库2.实体类编写3.注册(持久层)4.注册(业务层)5.注册&a…

【深度学习】模型如何加载至 cpu 和 gpu

【深度学习】模型如何加载至 cpu 和 gpu 文章目录 【深度学习】模型如何加载至 cpu 和 gpu1. 采用 from_pretrained 的方式2. 采用 load_state_dict 的方式参考 1. 采用 from_pretrained 的方式 这种情况下,BertMoldel.from_pretrained() 是会 load 在 cpu 上的&am…

归排、计排深度理解

归并排序:是创建在归并操作上的一种有效的排序算法。算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。归并排序思路简单,速度仅次于快速排序,为稳定排序算法&#…

SpringCloud 分布式事务组件之Seata

目录 背景介绍什么是分布式事务什么叫做逆向补偿呢互联网最流行的分布式事务组件seata总结 背景 大家好,今天给大家分享一个在2022年出去面试Java几乎必问的一个技术,那就是seata。什么??你才看了第一句话心里有闪现了无数个问…

面了一圈,还没拿到offer.....

最近收到很多小伙伴的留言,金三银四过完了一个offer都没收到。还有遇到那种特别喜欢怼人的面试官,直接面到怀疑人生,真是让人费解。。。 其实面试受打击是正常的,关键是要在面试中总结自己的不足!提前做好面试准备和技…

数控新代系统解锁解密 数控机床车床使用期限破解

时效性保证了良好的用户体验,根据经验在交易环节,延迟越低转化效果也会越好。传统的直播延迟问题已经成为了一个不容忽视的问题,高延迟不仅破坏了用户的观看体验,也让主播难以实时获取到用户的反馈。为了进一步优化直播时效体验&a…