`
simohayha
  • 浏览: 1404173 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

minix引导程序剖析之masterboot

阅读更多
大体的引导过程可以看我前面写的博客:

http://simohayha.iteye.com/blog/269093


masterboot的主要功能是从硬盘的一个已激活分区装载引导分区的第1个扇区的引导信息,并将控制权交给此引导程序。

引导过程中,未分区磁盘和已分区磁盘的布局是不同的,已分区磁盘的话,第一个扇区是主引导记录和分区表,而masterboot就存放在这里,将由它来查找激活分区的引导块(也就是在激活分区的第一个扇区里面),也就是下一次我们要分析的bootblock程序。而未分区磁盘的话第一个扇区直接存储的就是引导块。然后由引导块去加载引导程序也就是boot monitor 。

这里它会一个硬盘一个硬盘的去查找,如果都不符合条件那么就提示出错。

我们来看masterboot.s的源码:

! To make things a little clearer, the boot path might be:
!	/dev/fd0	- Floppy disk containing data, tries fd1 then d0
!	[/dev/fd1]	- Drive empty
!	/dev/c0d0	- Master boot block, selects active partition 2
!	/dev/c0d0p2	- Submaster, selects active subpartition 0
!	/dev/c0d0p2s0	- Minix bootblock, reads Boot Monitor /boot
!	Minix		- Started by /boot from a kernel image in /minix

	LOADOFF	   =	0x7C00	! 0x0000:LOADOFF is where this code is loaded
	BUFFER	   =	0x0600	! First free memory
	PART_TABLE =	   446	! Location of partition table within this code
	PENTRYSIZE =	    16	! Size of one partition table entry
	MAGIC	   =	   510	! Location of the AA55 magic number

	! <ibm/partition>.h:
	bootind	   =	     0
	sysind	   =	     4
	lowsec	   =	     8


这段代码中,定义了一些数据段,比如代码的加载地址LOADOFF(也就是这段代码被固件加载到的内存位置),以及BUFFER(也就是要把当前的代码拷贝到这个地址,然后再load).以及分区表的大小以及位置,魔术数。。

下面的代码主要是拷贝代码从LOADOFF到buffer,以及一些初始化


这个图就是开始的内存模型。

master:
	xor	ax, ax          !寄存器ax清零
	mov	ds, ax          
	mov	es, ax
	cli                      !关闭中断
	mov	ss, ax			! ds = es = ss = Vector segment
	mov	sp, #LOADOFF            !设置栈指针为LOADOFF
	sti                       !打开中断
 
! Copy this code to safety, then jump to it.
	mov	si, sp			! si 保存代码的开始地址
	push	si			!  si进站,当下面的ret指令的时候会直接返回到初始地址。
	mov	di, #BUFFER		! Buffer area
	mov	cx, #512/2		!  主要这里是实模式和保护模式1个字所表示的字节数是不同的。cx保存下面我们要拷贝的大小
	cld
  rep	movs                           !这句也就是拷贝从LOADOFF的数据代码到buffer所指的地址的位置.
	jmpf	BUFFER+migrate, 0



下面的代码主要是用来查找激活分区,以便加载执行,以及一些处理错误。




这个图就是分区表的内存模型。



findactive:
	testb	dl, dl              !检测dl的正负.dl里保存有当前设备的编号,0x00是第一块软盘,0x01第二块软盘,0x80,0x81,0x82,0x83...是指硬盘的编号。因此当为软盘时dl才是正数。所以这里也就是判断当前启动的设备。

	jns	nextdisk		!  如果为正数的话,也就是软盘.跳转到nextdisk
	mov	si, #BUFFER+PART_TABLE   ! 讲分区表的地址付给寄存器si.

!find用来搜索分区表,查找激活的分区,在当前设备的其他分区
find:	cmpb	sysind(si), #0		! 分区类型,如果已使用的话,就是0.
	jz	nextpart                ! 查找未使用的分区.
	testb	bootind(si), #0x80	! 检测是否是已激活的分区
	jz	nextpart		! 不是已激活的,就去下一分区查找
loadpart:
	call	load			! Load partition bootstrap
	jc	error1			! Not supposed to fail
bootstrap:
	ret				! Jump to the master bootstrap
nextpart:
	add	si, #PENTRYSIZE
	cmp	si, #BUFFER+PART_TABLE+4*PENTRYSIZE
	jb	find
! No active partition, tell 'em
	call	print
	.ascii	"No active partition\0"
	jmp	reboot
! 去下一个设备查找激活分区。
nextdisk:
	incb	dl			! Increment dl for the next drive
	testb	dl, dl
	js	nexthd			! 负数的话,就是硬盘,因此直接跳转到nexthd,然后调用load。
	int	0x11			! Get equipment configuration
	shl	ax, #1			! Highest floppy drive # in bits 6-7
	shl	ax, #1			! Now in bits 0-1 of ah
	andb	ah, #0x03		! Extract bits
	cmpb	dl, ah			! Must be dl <= ah for drive to exist
	ja	nextdisk		! Otherwise try disk 0 eventually
	call	load0			! Read the next floppy bootstrap
	jc	nextdisk		! It failed, next disk please
	ret				! Jump to the next master bootstrap
nexthd:	call	load0			! 从硬盘开始
error1:	jc	error			! No disk?
	ret



下面的这段代码从当前的激活扇区读取引导块,然后将控制权交给引导块,这里主要是一些处理磁盘的操作,很繁琐,看的头大的说。。这里要注意的就是几个读取扇区的指令,比如int 0x13.
! 
load0:
	mov	si, #BUFFER+zero-lowsec	! si = where lowsec(si) is zero
	!jmp	load

load:
	mov	di, #3		! Three retries for floppy spinup
retry:	push	dx		! Save drive code
	push	es
	push	di		! Next call destroys es and di
	movb	ah, #0x08	! Code for drive parameters
	int	0x13
	pop	di
	pop	es
	andb	cl, #0x3F	! cl = max sector number (1-origin)
	incb	dh		! dh = 1 + max head number (0-origin)
	movb	al, cl		! al = cl = sectors per track
	mulb	dh		! dh = heads, ax = heads * sectors
	mov	bx, ax		! bx = sectors per cylinder = heads * sectors
	mov	ax, lowsec+0(si)
	mov	dx, lowsec+2(si)! dx:ax = sector within drive
	cmp	dx, #[1024*255*63-255]>>16  ! Near 8G limit?
	jae	bigdisk
	div	bx		! ax = cylinder, dx = sector within cylinder
	xchg	ax, dx		! ax = sector within cylinder, dx = cylinder
	movb	ch, dl		! ch = low 8 bits of cylinder
	divb	cl		! al = head, ah = sector (0-origin)
	xorb	dl, dl		! About to shift bits 8-9 of cylinder into dl
	shr	dx, #1
	shr	dx, #1		! dl[6..7] = high cylinder
	orb	dl, ah		! dl[0..5] = sector (0-origin)
	movb	cl, dl		! cl[0..5] = sector, cl[6..7] = high cyl
	incb	cl		! cl[0..5] = sector (1-origin)
	pop	dx		! Restore drive code in dl
	movb	dh, al		! dh = al = head
	mov	bx, #LOADOFF	! es:bx = where sector is loaded
	mov	ax, #0x0201	! Code for read, just one sector
	int	0x13		!  Call the BIOS for a read
	jmp	rdeval		! Evaluate read result



更多的细节的部分还是要去看源码。。


  • 大小: 4 KB
  • 大小: 3.7 KB
分享到:
评论

相关推荐

    品评Minix内核源码

    在Minix的引导过程中,首先由硬件(ROM BIOS)加载软盘或硬盘的第一个扇区到内存的特定位置。对于Minix,这可能是`masterboot.s`或`bootblock.s`。如果是有分区的硬盘,主引导记录(MBR)包含了引导代码和分区表。`...

    minix文件系统分析

    Minix 文件系统是一个轻量级的操作系统内核,它的核心特点之一是将设备驱动程序设计为用户空间中的独立进程,从而提高系统的可靠性和模块化程度。这种设计使得每个驱动程序都能独立于内核运行,降低了内核崩溃的风险...

    Minix操作系统网卡驱动程序分析与设计.pdf

    本文提到的Minix网卡驱动程序分析与设计,是以3C589d网卡驱动程序为例进行研究的。通过分析网卡驱动程序,作者提出了一些针对Minix网卡驱动程序设计与开发的方法和建议。在驱动程序的设计中,使用了消息传递机制,以...

    操作系统MINIX2.0详细分析

    ### MINIX 2.0操作系统详细分析 #### 1. MINIX操作系统简介 MINIX操作系统是一种小型的操作系统,它与UNIX操作系统兼容。MINIX的设计初衷是为了教学和学习目的,因此它的设计非常小巧并且高度模块化,这使得它非常...

    Minix3 源码解析(精华!)

    通过对Minix3中核心头文件的深入分析,我们不仅能够了解到这些头文件的功能和用途,还可以进一步理解Minix3的整体架构和技术实现细节。这对于学习操作系统的设计原理和技术实现具有重要意义。通过掌握这些知识,...

    Minix3最新源码 minix 3.2.0版本

    Minix3是一款开源的操作系统,其设计理念源自于最初的Minix系统,由荷兰计算机科学家Andrew S. Tanenbaum教授创建。Minix3的核心特色在于它的微内核架构,这种设计将操作系统的基本服务限制在内核中,其他服务如文件...

    fsys_minix.rar_grub_minix

    通过分析“fsys_minix.c”文件,我们可以更深入地了解GRUB如何在底层与Minix文件系统交互,这对于优化引导过程,解决引导问题,甚至为其他类似文件系统的支持提供参考都极其有用。总之,这个压缩包提供的资源对理解...

    MINIX3 英文版MINIX之父力作

    MINIX之父的这个称号源于Tanenbaum教授在1987年创建的MINIX1.0,它是教育界广泛使用的一个操作系统,用于教授操作系统原理。MINIX3是其后续版本,旨在提供更高级别的可靠性和安全性,尤其适合于嵌入式系统和关键任务...

    MINIX 操作系统源码分析

    minix源码,linux操作系统之父。两万多行代码 是你进入操作系统大门的钥匙

    MINIX文件系统彻底分析

    ### MINIX文件系统彻底分析:深入理解Linux下的MINIX文件系统 #### MINIX文件系统概览 MINIX文件系统作为早期UNIX系统的一种实现,虽然在现代操作系统中已不多见,但在Linux内核的发展历程中占有不可忽视的地位。...

    minix3.1.6源代码

    5. **设备驱动**:Minix 的设备驱动程序也是用户空间服务器,这使得内核更加稳定,因为设备故障不会直接影响到核心功能。 6. **网络堆栈**:Minix 内置了一个完整的网络协议栈,包括 TCP/IP 协议族。通过阅读源代码...

    MINIX File System 探悉,MINIX文件系统彻底分析,MINIX-File-System-analysis

    在深入研究MINIX文件系统的过程中,我们可以阅读"MINIX File System探悉"、"MINIX文件系统彻底分析"以及"MINIX-File-System-analysis.pdf"这些文档,它们应该提供了更详尽的理论知识和实践经验,帮助我们更好地理解...

    武昊minix分析实验报告

    总之,武昊的Minix分析实验报告深入剖析了再生服务器在维持Minix系统服务稳定性和容错性方面的关键作用。通过对代码的详细分析,读者可以了解到Minix操作系统如何在面对服务故障时进行自我恢复,从而增强其整体的...

    minix3.1.8

    2. **boot**:这部分包含了引导加载程序,负责在系统启动时加载内核。引导加载器通常是 GRUB 或其他类似工具,它们会找到内核映像并将其加载到内存中执行。 3. **lib**:库文件夹包含了各种系统库,这些库提供了...

    minix3-源码-gitee

    minix3 源码下载,码云平台地址 https://gitee.com/wllw7176/minix3.git 包括代码,编译脚本,工具等众多minix3 相关的东西

    Minix学习资料大全

    这份资料提供了Minix 2.0操作系统的源代码分析,并且附带了详尽的注释。源代码分析对于理解操作系统内部工作原理至关重要,它涵盖了内核、进程管理、内存管理、文件系统、网络协议栈等多个核心模块。通过阅读和理解...

    MINIX3内核分析文档(纯原创)

    ### MINIX3内核分析知识点 #### 一、MINIX3简介及内核源码分析 **MINIX3**是一款基于微内核架构的操作系统,主要用于教学和研究目的。它是由荷兰阿姆斯特丹自由大学的Andrew S. Tanenbaum教授开发的,旨在作为一个...

    minix-3.1.0-BOOKSRC

    驱动程序目录包含了 Minix 3.1.0 对各种硬件设备的支持代码,如网络接口卡、硬盘控制器、键盘和显示器等。这些驱动程序是操作系统与硬件之间的桥梁,负责将操作系统服务转化为硬件可执行的指令。通过分析这些源码,...

Global site tag (gtag.js) - Google Analytics