- 浏览: 1400143 次
- 性别:
- 来自: 火星
文章分类
最新评论
-
aidd:
内核处理time_wait状态详解 -
ahtest:
赞一下~~
一个简单的ruby Metaprogram的例子 -
itiProCareer:
简直胡说八道,误人子弟啊。。。。谁告诉你 Ruby 1.9 ...
ruby中的类变量与类实例变量 -
dear531:
还得补充一句,惊群了之后,数据打印显示,只有一个子线程继续接受 ...
linux已经不存在惊群现象 -
dear531:
我用select试验了,用的ubuntu12.10,内核3.5 ...
linux已经不存在惊群现象
大体的引导过程可以看我前面写的博客:
http://simohayha.iteye.com/blog/269093
masterboot的主要功能是从硬盘的一个已激活分区装载引导分区的第1个扇区的引导信息,并将控制权交给此引导程序。
引导过程中,未分区磁盘和已分区磁盘的布局是不同的,已分区磁盘的话,第一个扇区是主引导记录和分区表,而masterboot就存放在这里,将由它来查找激活分区的引导块(也就是在激活分区的第一个扇区里面),也就是下一次我们要分析的bootblock程序。而未分区磁盘的话第一个扇区直接存储的就是引导块。然后由引导块去加载引导程序也就是boot monitor 。
这里它会一个硬盘一个硬盘的去查找,如果都不符合条件那么就提示出错。
我们来看masterboot.s的源码:
这段代码中,定义了一些数据段,比如代码的加载地址LOADOFF(也就是这段代码被固件加载到的内存位置),以及BUFFER(也就是要把当前的代码拷贝到这个地址,然后再load).以及分区表的大小以及位置,魔术数。。
下面的代码主要是拷贝代码从LOADOFF到buffer,以及一些初始化
这个图就是开始的内存模型。
下面的代码主要是用来查找激活分区,以便加载执行,以及一些处理错误。
这个图就是分区表的内存模型。
下面的这段代码从当前的激活扇区读取引导块,然后将控制权交给引导块,这里主要是一些处理磁盘的操作,很繁琐,看的头大的说。。这里要注意的就是几个读取扇区的指令,比如int 0x13.
更多的细节的部分还是要去看源码。。
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
更多的细节的部分还是要去看源码。。
发表评论
-
Receive packet steering patch详解
2010-07-25 16:46 12103Receive packet steering简称rp ... -
内核中拥塞窗口初始值对http性能的影响分析
2010-07-11 00:20 9690这个是google的人提出的 ... -
linux 内核tcp拥塞处理(一)
2010-03-12 16:17 9567这次我们来分析tcp的拥塞控制,我们要知道协议栈都是很保守的, ... -
内核tcp协议栈SACK的处理
2010-01-24 21:13 12152上一篇处理ack的blog中我 ... -
内核tcp的ack的处理
2010-01-17 03:06 11152我们来看tcp输入对于ack,段的处理。 先是ack的处理, ... -
内核处理time_wait状态详解
2010-01-10 17:39 6801这次来详细看内核的time_wait状态的实现,在前面介绍定时 ... -
tcp协议栈处理各种事件的分析
2009-12-30 01:29 13618首先我们来看socket如何将一些状态的变化通知给对应的进程, ... -
linux内核sk_buff的结构分析
2009-12-25 00:42 47888我看的内核版本是2.6.32. 在内核中sk_buff表示一 ... -
tcp的输入段的处理
2009-12-18 00:56 8346tcp是全双工的协议,因此每一端都会有流控。一个tcp段有可能 ... -
内核协议栈tcp层的内存管理
2009-11-28 17:13 12052我们先来看tcp内存管理相关的几个内核参数,这些都能通过pro ... -
linux内核定时器的实现
2009-10-31 01:44 10184由于linux还不是一个实时的操作系统,因此如果需要更高精度, ... -
linux内核中tcp连接的断开处理
2009-10-25 21:47 10303我们这次主要来分析相关的两个断开函数close和shotdow ... -
linux内核tcp的定时器管理(二)
2009-10-05 20:52 5412这次我们来看后面的3个定时器; 首先是keep alive定 ... -
linux内核tcp的定时器管理(一)
2009-10-04 23:29 9822在内核中tcp协议栈有6种 ... -
linux 内核tcp接收数据的实现
2009-09-26 20:24 14493相比于发送数据,接收数据更复杂一些。接收数据这里和3层的接口是 ... -
linux 内核tcp数据发送的实现
2009-09-10 01:41 19760在分析之前先来看下SO_RCVTIMEO和SO_SNDTIME ... -
tcp connection setup的实现(三)
2009-09-03 00:34 5176先来看下accept的实现. 其实accept的作用很简单, ... -
tcp connection setup的实现(二)
2009-09-01 00:46 8424首先来看下内核如何处理3次握手的半连接队列和accept队列( ... -
tcp connection setup的实现(一)
2009-08-23 04:10 5795bind的实现: 先来介绍几个地址结构. struct ... -
linux内核中socket的实现
2009-08-15 04:38 21089首先来看整个与socket相关的操作提供了一个统一的接口sys ...
相关推荐
在Minix的引导过程中,首先由硬件(ROM BIOS)加载软盘或硬盘的第一个扇区到内存的特定位置。对于Minix,这可能是`masterboot.s`或`bootblock.s`。如果是有分区的硬盘,主引导记录(MBR)包含了引导代码和分区表。`...
Minix 文件系统是一个轻量级的操作系统内核,它的核心特点之一是将设备驱动程序设计为用户空间中的独立进程,从而提高系统的可靠性和模块化程度。这种设计使得每个驱动程序都能独立于内核运行,降低了内核崩溃的风险...
本文提到的Minix网卡驱动程序分析与设计,是以3C589d网卡驱动程序为例进行研究的。通过分析网卡驱动程序,作者提出了一些针对Minix网卡驱动程序设计与开发的方法和建议。在驱动程序的设计中,使用了消息传递机制,以...
### MINIX 2.0操作系统详细分析 #### 1. MINIX操作系统简介 MINIX操作系统是一种小型的操作系统,它与UNIX操作系统兼容。MINIX的设计初衷是为了教学和学习目的,因此它的设计非常小巧并且高度模块化,这使得它非常...
Minix3是一款开源的操作系统,其设计理念源自于最初的Minix系统,由荷兰计算机科学家Andrew S. Tanenbaum教授创建。Minix3的核心特色在于它的微内核架构,这种设计将操作系统的基本服务限制在内核中,其他服务如文件...
通过分析“fsys_minix.c”文件,我们可以更深入地了解GRUB如何在底层与Minix文件系统交互,这对于优化引导过程,解决引导问题,甚至为其他类似文件系统的支持提供参考都极其有用。总之,这个压缩包提供的资源对理解...
MINIX之父的这个称号源于Tanenbaum教授在1987年创建的MINIX1.0,它是教育界广泛使用的一个操作系统,用于教授操作系统原理。MINIX3是其后续版本,旨在提供更高级别的可靠性和安全性,尤其适合于嵌入式系统和关键任务...
### MINIX文件系统彻底分析:深入理解Linux下的MINIX文件系统 #### MINIX文件系统概览 MINIX文件系统作为早期UNIX系统的一种实现,虽然在现代操作系统中已不多见,但在Linux内核的发展历程中占有不可忽视的地位。...
5. **设备驱动**:Minix 的设备驱动程序也是用户空间服务器,这使得内核更加稳定,因为设备故障不会直接影响到核心功能。 6. **网络堆栈**:Minix 内置了一个完整的网络协议栈,包括 TCP/IP 协议族。通过阅读源代码...
在深入研究MINIX文件系统的过程中,我们可以阅读"MINIX File System探悉"、"MINIX文件系统彻底分析"以及"MINIX-File-System-analysis.pdf"这些文档,它们应该提供了更详尽的理论知识和实践经验,帮助我们更好地理解...
minix源码,linux操作系统之父。两万多行代码 是你进入操作系统大门的钥匙
总之,武昊的Minix分析实验报告深入剖析了再生服务器在维持Minix系统服务稳定性和容错性方面的关键作用。通过对代码的详细分析,读者可以了解到Minix操作系统如何在面对服务故障时进行自我恢复,从而增强其整体的...
2. **boot**:这部分包含了引导加载程序,负责在系统启动时加载内核。引导加载器通常是 GRUB 或其他类似工具,它们会找到内核映像并将其加载到内存中执行。 3. **lib**:库文件夹包含了各种系统库,这些库提供了...
minix3 源码下载,码云平台地址 https://gitee.com/wllw7176/minix3.git 包括代码,编译脚本,工具等众多minix3 相关的东西
这份资料提供了Minix 2.0操作系统的源代码分析,并且附带了详尽的注释。源代码分析对于理解操作系统内部工作原理至关重要,它涵盖了内核、进程管理、内存管理、文件系统、网络协议栈等多个核心模块。通过阅读和理解...
### MINIX3内核分析知识点 #### 一、MINIX3简介及内核源码分析 **MINIX3**是一款基于微内核架构的操作系统,主要用于教学和研究目的。它是由荷兰阿姆斯特丹自由大学的Andrew S. Tanenbaum教授开发的,旨在作为一个...
驱动程序目录包含了 Minix 3.1.0 对各种硬件设备的支持代码,如网络接口卡、硬盘控制器、键盘和显示器等。这些驱动程序是操作系统与硬件之间的桥梁,负责将操作系统服务转化为硬件可执行的指令。通过分析这些源码,...