MINIXOS之MINIXMBR代码分析

合集下载

解读C写的操作系统MINIX

解读C写的操作系统MINIX

解读C写的操作系统MINIX操作系统是计算机系统中不可或缺的组成部分,它为用户与硬件之间提供了桥梁,负责协调、管理与控制各种资源。

MINIX是一款由荷兰计算机科学家安德鲁·S·塔能鲍姆(Andrew S. Tanenbaum)编写的操作系统,它以其简洁、模块化和可靠性而闻名于世。

本文将深入解读C语言编写的操作系统MINIX,从其背景、特点和设计原则等方面进行探讨。

一、背景介绍MINIX(Mini-Unix)最初是塔能鲍姆教授为了教学目的于1987年编写的,以它为基础的操作系统原本被设计为一个小型而完整的Unix系统。

其目的是通过代码简洁、易读的特点来帮助学生理解操作系统的核心概念。

MINIX在计算机科学教育中一直扮演着重要的角色,而且它的设计思路也对其他操作系统的发展产生了深远的影响。

二、特点分析1. 简洁模块化: MINIX的核心设计思路是模块化,它将操作系统划分为多个独立的模块,每个模块只关注特定的功能,并通过明确定义的接口进行相互通信。

这个设计使得MINIX的代码简洁易读,易于理解和修改。

2. 可靠性: MINIX追求高可靠性,通过模块化设计和清晰的接口定义,减少了不同模块之间的耦合,从而降低了系统崩溃的概率。

此外,MINIX还引入了进程间通信和保护机制,保证不同进程之间的互不干扰,增强了系统的稳定性。

3. 支持多用户: MINIX是一个多用户的操作系统,它允许多个用户同时使用计算机资源。

通过引入用户管理、权限控制和文件系统等机制,MINIX实现了不同用户之间的隔离和资源共享,使得系统更加灵活和安全。

4. 教学价值: MINIX作为一个设计简洁、易于理解的操作系统,对操作系统教学有着重要的意义。

它提供了一个理想的学习平台,帮助学生深入理解操作系统的核心概念和原理,为他们进一步研究和开发操作系统奠定了坚实的基础。

三、设计原则MINIX的设计遵循着一些重要的原则,下面将分别进行阐述:1. 极简主义: MINIX追求代码简洁、清晰易读的特点。

Minix系统核心数据结构及核心操作分析

Minix系统核心数据结构及核心操作分析

Minix 系统核心数据结构及核心操作分析华中科技大学计算机学院 计算机系统结构 张寅摘要:本文主要以Minix 操作系统为例介绍有关操作系统的关键数据结构以及相关的操作。

主要涉及Minix 的内核、进程结构及管理、存储管理、文件系统几个方面。

通过对其的分析,能够较好的理解操作系统的实现原理。

关键字:Minix 核心,操作系统,核心分析1.Minix 进程1.1 Minix 内部结构首先大致了解一下Minix3的整体结构。

Minix3被组织成四层,每一层都有一套定义明确的功能模块。

如下图所示。

本节关心Minix 的内核和进程管理器,文件系统模块在后续小节会介绍。

其他模块不作介绍,读者可以参考相关书籍。

图1.1 Minix3的四层结构Minix3的进程管理主要由进程管理器(Process Manager ,PM )来实现。

而像进程调度等进程重要相关的管理功能交由内核来管理。

Minix3把进程管理分开实现可能是为了实现微内核结构。

在这里,把Minix 的内核相关结构和操作归入进程管理来一起论述。

后面可以看到,进程管理器还包括的存储管理功能,因此在Minix 存储管理部分还要介绍进程管理器。

1.2 Minix 内核内核进行最底层的进程调度,负责进程在就绪态、运行态、阻塞态之间的转换。

内核还会处理所有进程间的消息。

出内核本身外,内核层还包括类似设备驱动的功能模块:时钟任务、系统任务。

尽管时钟任务和系统被编译进了内核地址空间,但它们作为单独的进程调度,并用自己的堆栈。

大部分内核程序和所有的时钟任务及系统任务由C 语言编写。

汇编语言编用户进程内核 设备驱动程序服务器进程写的部分负责中断处理、进程切换的底层上下文管理、MMU硬件的底层操作。

下面介绍时钟任务和系统任务,因为这两者为内核提供基本支持。

时钟(定时器)是任何分时系统运行所必需的。

系统时钟由硬件定时器产生。

定时器每计数完一次,便产生一个硬件中断,这称为一个系统滴答,然后再由时钟中断处理程序处理相关操作。

简述mbr含义,举例说明

简述mbr含义,举例说明

简述mbr含义,举例说明
MBR全称Master Boot Record,中文称为主引导记录,是位于计
算机硬盘的第一个扇区中的一段特殊的启动代码和分区表。

MBR的主要作用是告诉计算机如何启动操作系统并且对硬盘进行分区。

MBR通常占据了硬盘的第一个扇区,大小为512字节。

其中,前
446字节是引导代码,后64字节是分区表。

引导代码是一段特殊的程序,它会告诉计算机要从哪个分区中去寻找操作系统的引导文件。


区表则记录了硬盘的分区信息,包括分区的类型、起始扇区、结束扇
区和分区的状态等信息。

举个例子,当我们插入安装Windows系统的安装盘后,计算机将
会从这个盘中读取MBR并执行引导代码。

引导代码会提示计算机用户
选择安装的操作系统和进行相应的安装操作。

安装完成后,MBR会重新被操作系统的引导程序所覆盖。

对于计算机用户来说,MBR所包含的分区表信息非常重要,因为它指导计算机硬盘,告诉计算机通过哪个分区去查找相应的文件。

因此,如果MBR损坏了或者被病毒感染、系统崩溃导致系统不能启动,我们
需要通过一些专业软件对MBR进行修复来解决这个问题。

在日常使用电脑的过程中,我们应该避免任意更改MBR中的分区
表信息,以免造成不必要的损伤。

同时也需要保持注意每次系统启动
时硬盘的各个分区是否正确,以确保计算机能够正常运行。

Minix 进程调度代码详解

Minix 进程调度代码详解

1.Minix3中为每个进程分配的时间片,当进程的时间片用完后,将进行进程调度。

进程的时间片以时钟滴答为单位进行分配。

每次时钟中断,中断处理程序将减少当前进程的时间片。

当时间片减小到0时,进行进程调度,选择一个合适的进程来拥有CPU。

Minix3以每秒钟60次的频率进行时钟中断,即时钟中断处理程序每秒执行60次。

每次执行,减少当前进程的时间片:/* Get number of ticks and update realtime. */ticks = lost_ticks + 1; /* lost_ticks为BIOS中断所花费的时间 */lost_ticks = 0; /* lost_ticks清0 */realtime += ticks; /* 更新时间 */proc_ptr->p_user_time += ticks; /* 更新当前进程的user_time */if (priv(proc_ptr)->s_flags & PREEMPTIBLE) {/* 如果进程可被抢占,则减少时间片 */proc_ptr->p_ticks_left -= ticks;}if (! (priv(proc_ptr)->s_flags & BILLABLE)) {/* 如果当前进程能付费,则修改sys_time及减少时间片 */bill_ptr->p_sys_time += ticks;bill_ptr->p_ticks_left -= ticks;}如果时间片用完,则向clock_task发送通知。

因为该进程的时间片用完,需要重新调度,所以该进程就成为了上一个执行的进程。

if((next_timeout <= realtime)||(proc_ptr->p_ticks_left<= 0)) { /* 如果定时器到期或者进程时间片用完,则进行调度 */prev_ptr = proc_ptr; /* 当前进程成为上一次执行的进程 */lock_notify(HARDWARE, CLOCK); /* send notification */ /* 时间到期时发送通知给clock_task,由该函数进行后续处理 */}2.clock_task为时钟任务的主程序,用一个无限循环等待并处理时钟中断处理程序发来的通知。

MBR代码分析【转载,学习使用】

MBR代码分析【转载,学习使用】

MBR代码分析【转载,学习使⽤】MBR代码分析西西,很早以前的东东了,都不太记得了,有什么错误和不⾜欢迎⼤家指出机器加电或按reset键后都要进⾏系统复位,复位后CS=FFFFH,IP=0000H那么⾃然就从FFFF:0000H处开始执⾏指令,这个地⽅只有⼀条JMP指令跳转到系统⾃检程序处,系统⾃检完成后把软盘的第⼀个扇区(如果由软盘启动)或者硬盘的第⼀个扇区,即MBR扇区(如果由硬盘启动)读⼊到0:7C00H处然后把控制权交出,从0:7C00H处继续执⾏,下⾯就是硬盘的MBR代码分析其中的引导扇区是指硬盘相应分区的第⼀个扇区,是和操作系统有关的操作系统的引导是由它来完成的,⽽MBR并不负责,MBR和操作系统⽆关他的任务是把控制权转交给操作系统的引导程序程序流程:1 将程序代码由0:7C00H移动到0:0600H(注,BIOS把MBR放在0:7C00H处)2 搜索可引导分区,即80H标志成功:goto 3失败:跳⼊ROM BASIC⽆效分区表:goto 53 读引导扇区失败:goto 5成功:goto 44 验证引导扇区最后是否为55AAH失败:goto 5成功:goto 65 打印错误进⼊⽆穷循环6 跳到0:7C00H进⾏下⼀步启动⼯作下⾯将⽤汇编语⾔写出这⼀段代码,并进⾏说明。

;MBR.ASM; MASM MBR; LINK MBR; EXE2BIN MBR.MODEL tiny.CODE;设置寄存器及堆栈值org 0Head:Start:clixor ax,axmov ss,axmov sp,7C00H ;ss:sp=0:7C00Hmov si,sppush axpop espush axpop ds ;es=ds=0sti;将程序代码由0:7C00H移动到0:0600H处cldmov di,600Hmov cx,100H ;100H Words=512 Bytes,即⼀个扇区⼤⼩repne movswdb 0EAH ;这个是FAR JUMP的机器码dw offset Continue+600H, 0000H ;这个是跳转⽬的地址,即0:061DH ;搜索可引导分区Continue:mov si,600H+1BEH ;si指向分区表mov bl,4 ;四个分区FindBoot:cmp byte ptr[si],80Hje SaveRec ;读扇区位置cmp byte ptr[si],0jne Invaild ;⽆效分区add si,10Hdec bljnz FindBootint 18H ;进⼊ROM BASIC;读取引导分区的扇区,柱⾯号SaveRec:mov dx,[si]mov cx,[si+2]mov bp,si;检查其余分区表FindNext:add si,10Hdec bljz SetReadcmp byte ptr[si],0 ;是否存在⾮法分区je FindNextInvaild:mov si,offset ErrMsg1+600H;字符串输出⼦程序PrintStr:lodsbcmp al,0je DeadLockpush simov bx,7mov ah,0EH ;输出字符int 10Hpop sijmp short PrintStr ;下⼀字符jmp short DeadLock ;⽆穷循环,也可以写成jmp $;读引导扇区SetRead:mov di,5 ;读取次数ReadBoot:mov bx,7C00Hmov ax,201Hpush diint 13H ;cx,dx已经在SaveRec处得到pop dijnc GoBoot ;成功则启动xor ax,axint 13H ;reset驱动器,然后再读取dec dijnz ReadBootmov si,offset ErrMsg2+600Hjmp short PrintStr 失败输出信息,并进⼊⽆穷循环;检查读⼊的引导扇区GoBoot:mov si,offsetErrMsg3+600Hmov di,7C00H+1FEHcmp word ptr[di],0AA55Hjne PrintStr ;⾮AA55标志则输出错误信息mov si,bp ;si指向可启动分区db 0EAH,0,7CH,0,0 ;跳转⾄0:7C00HErrMsg1 db Invaild partition table,0ErrMsg2 db Error loading operating system,0ErrMsg3 db Missing operating system,0Tail:FillNum equ 1BEH-(Tail-Head) ;计算填0数⽬db FillNum dup(0);四个分区表项数据,跟分区情况有关,详细含义另解PartTable db 80H,1,1,0,4,4,0D1H,2,11H,0,0,0,0FEH,0FFH,0,0db 0,0,0C1H,3,5,4,0D1H,0FEH,0FFH,0FFH,0,0,0ACH,53H,0,0db 20H dup(0)ID dw 0AA55Hend start;如果开始试⽤org 600H,那么访问数据时就不必加上600H,如mov si,offset ErrMsg2+600H;可写为mov si,offset ErrMsg2,这时就不能⽤exe2bin得到数据,必须试⽤debug ;debug mbr.exe;-nmbr.bin;-rcx 200;-q在硬盘的第⼀个扇区上保存着分区信息,称为主分区表,共有四项读取分区表必须使⽤bios的int 13h,⼀般使⽤debug就可以了debug-axxxx:0100 mov ax,201mov bx,200mov cx,1mov dx,80 ;如果是第⼆个硬盘则是81...int 13int 20xxxx:-g这时xxxx:0200开始的512字节就是分区表所在的扇区,前⾯⼀部分为MBR,在debug中⽤-d3be l40就可以看到64字节的分区表信息,16个字节为⼀项⽤-e命令就可以修改,改完后可以重新写回去,只要把前⾯代码中的mov ax,201改为mov ax,301即可,或者直接把102处的2改成3,⽐如:-e 102xxxx:0102 02.3-g=100这样就写回去了,不过要⼩⼼哦,呵呵,弄不好就坏了,⼤家还是把分区表⼿抄⼀份存下来吧,会省去很多⿇烦的下来说⼀下分区表项的具体意义,取其中⼀项举个例⼦:80 01 01 00 0B 3F FF 00 3F 00-00 00 81 4F 2F 001 (80)引导标志,80代表可引导,00代表不可引导,⼀般必须且只能有⼀个分区表项的引导标志为80,除⾮你⾃⼰修改MBR2 (01)分区开始磁头3,4 (01 00)=(1,0)分区开始柱⾯和扇区(后⾯后详解)5 (0B)分区类型(后⾯有详解)6 (3F)=(63)分区结束磁头7,8 (FF 00)=(768,63分区结束柱⾯和扇区(同上)9-12 (3F 00 00 00)=(63)此分区前扇区总数,即相对扇区数13-16 (81 4F 2F 00)=(002F4F81H=3100545)此分区扇区总数由于柱⾯和扇区共⽤两个字节表⽰,⽽柱⾯号为10位,最⼤1023,扇区号为6位,最⼤63扇区号______|____| |( 7 6 5 4 3 2 1 0 ) ( 7 6 5 4 3 2 1 0 )|___| |_____________||________________________||_柱⾯号关于分区类型,常见的有:00 未⽤,Unused01 DOS-12(FAT 12)02 XENIX04 DOS-16(FAT 16)(分区<32M时⽤的,还有么?)05 EXTEND(DOS扩展分区)06 BIGDOS(>32M)(这个才是现在常说的FAT 16)07 HPFS(OS/2)(好像NTFS也是这个标记)0B FAT 320F 这个⼀时不确定,西西50 DM63 386/ix(unix)64 NET286(Novell)65 NET386(Novell)FF BBT(UNIX Bad Block Table)下⾯有⼏个平衡式⽤来计算分区参数:1 第⼀分区参数平衡式扇区总数=(结束柱⾯+1)*磁头数*每柱⾯扇区数-相对扇区数例如:3100545=(768+1)*64*63-632 其它分区参数平衡式扇区总数=(结束柱⾯-起始柱⾯+1)*磁头数*每柱⾯扇区数00 00 C1 01 05 3F FF FD C0 4F-2F 00 C0 90 0F 00000F90C0H=1020096,(FF FD)=(1021,63),(C1 01)=(769,1)例如:1020096=(1021-769+1)*64*633 第⼀分区相对扇区=每柱⾯扇区数其它分区相对扇区=上⼀分区相对扇区+上⼀分区扇区总数扩展分区信息是⼀个链状结构,很多⼈不知道在删分区时把前⾯的分区删掉导致后⾯的分区找不到,原因就在于此,我们从主分区表中取出扩展分区项进⾏⼀下分析,如下:00 00 01 C0 05 FE BF 6E C0 10-2F 00 EF A6 69 00由此我们可以得到数据:开始磁头:00开始柱⾯扇区:01 C0=(192,0)⽤debugdebug-a100xxxx:0100 mov ax,201mov bx,200mov cx,05c0 ;开始柱⾯扇区号mov dx,80 ;dh中为开始磁头号,这⾥为0int 13int 20xxxx:-g=100-d3be l10读出的扇区中有两个16字节的分区表项和最后的⼀个55AA标志,这两个分区表项为:00 01 01 C0 06 FE 7F 97 3F 00-00 00 99 F2 34 0000 00 41 98 05 FE BF 6E D8 F2-34 00 17 B4 34 00第⼀个分区类型为6,其实这是第⼀个逻辑分区,含义和主分区表项相同第⼆个分区类型为5,这其实是指向下⼀个扩展分区表的从这⾥我们可以得到:开始磁头:0开始柱⾯扇区:41 98=(408,1)继续⽤debug读出(mov cx,9841)得到00 01 41 98 06 FE BF 6E 3F 00-00 00 D8 B3 34 00只有⼀个表项,是第⼆个逻辑盘,⽽且是逻辑盘链的最后⼀个可以看到,主分区表是⾮常重要的,所以除了⼩⼼操作外,还应当进⾏备份最安全的备份⽅式就是⽤笔抄下来,呵呵,放到安全的地⽅,当然,每次重新进⾏分区后还应当及时更新的说,:P从前⾯可以看出,分区表⾥最重要的还是柱⾯号,其它⽐如磁头号都是0或者1或者最⼤值,扇区号都是1或63(最⼤值),扇区总数什么的也都能算出来,所以分区时最好把各分区的柱⾯号记下来,这样⼀旦分区信息被破坏就可以进⾏恢复了。

MBR引导代码分析

MBR引导代码分析

MBR引导代码分析整理:太虚野老用WinHex读MBR,如下:图中3个用红色矩形框框住的是3个字符串(Invalid partition table、Error loading operating system、Missing operating system)的地址相关的,分别是0x12C、0x144、0x 163。

用蓝色矩形框框住的,MBR里面的1B8偏移位置为磁盘签名,该签名由ntldr写入,W indows就是靠这个磁盘签名来确定是从哪块硬盘启动的,如果两个磁盘签名相同了,那么n tldr就会随机更改一块磁盘,但是下次就不会出现这种情况了。

实际MBR的可执行代码到0 x12B处结束。

MBR引导代码的作用就是加载活动分区的引导代码。

用IDA Pro反汇编MBR 后如下(包括分析):;//MBR在系统启动时由BIOS INT 19H自动加载到0000:7c00处,为512个字节.下面这段代码实现把0000:7c1b处MBR代码复制485个字节到0000:061b处,为什么不从0000:7c00开始复制512个到0000:06cc处,因为前面1b 个字节为复制代码,所以忽略.空出的0000:7c00 开始的空间将读入活动分区的操作系统的引导扇区.seg000:0000 33 C0 xor ax, ax ;//ax寄存器清0seg000:0002 8E D0 mov ss, ax ;//栈寄存器ss=0seg000:0004 BC 00 7C mov sp, 7C00h ;//栈指针—SS:SP=0000:7C00seg000:0007 FB sti ;//允许中断seg000:0008 50 push ax ;这条PUSH指令在0008处,前面的8个字节指令已经执行,所以push指令输入的数据覆盖前面的0000-0001空间,没有关系. seg000:0009 07 pop es ;//附加数据段寄存器es=0seg000:000A 50 push ax;seg000:000B 1F pop ds ;//数据段寄存器ds=0seg000:000C FC cld ;//使方向标志寄存器DF=0,规定其后的串操作为正向串操作;把7C1Bh处的长1E5h的代码拷贝到61Bh处seg000:000D BE 1B 7C mov si, 7C1Bh ;//用于movsbseg000:0010 BF 1B 06 mov di, 61Bh ;//用于movsb ,将[DS:SI]中字节传送到[ES:DI]中seg000:0013 50 push ax ;//保存ax,di,用于第001a处指令retf(同ret),使ax->cs,di->ip,实现指令跳转seg000:0014 57 push diseg000:0015 B9 E5 01 mov cx, 1E5h ;//用于rep movsb中的rep,每次cx 减1,到0不执行movsb ,200H-1BH=1E5seg000:0018 F3 A4 rep movsbseg000:001A CB retf ;//相当于pop ip; pop cs,即执行retf指令后跳转到061BH处执行seg000:001B; ---------------------------------------------------------------------------seg000:001B BD BE 07 mov bp, 7BEh ;// 600h+1BEh=7BEh,分区表起始偏移为1BEh,07BEH开始的16个字节是第一个分区表项seg000:001E B1 04 mov cl, 4 ;//硬盘的mbr分区表最多有4个表项,用于loopseg000:0020seg000:0020 loc_10020: ; CODE XREF: seg000:002A↓j seg000:0020 38 6E 00 cmp [bp+0], ch ;//检查分区指示符.cx寄存器前面用movsb减为0,所以ch=0.判断第一个分区表项的第一个字节是否为活动分区,因为cmp是有符号数据比较,如果[bp+0]=80,80H为负数,则其比0小seg000:0023 7C 09 jl short loc_1002E ;//如果是80,活动分区,则跳到002E地址.这里有点问题,如果[bp+0x0]是符号位为1的任意数的话,也是小于0,也会跳到002E地址seg000:0025 75 13 jnz short loc_1003A;//分区指示符不为0就跳转(显示分区表无效)seg000:0027 83 C5 10 add bp, 10h ;//指向下一个表项(每一个表项的长度为10h字节)seg000:002A E2 F4 loop loc_10020 ;//cx不为0就循环;四表项的状态字节都为0就执行ROM BASIC中断.只有IBM个人计算机有Basic包括在ROM中;Int 18h中断服务程序就是启动ROM-Basic,如果没有ROM BASIC,中断18H通常会显示消息 NO ROM BASIC 然后"系统暂停",并且系统中断seg000:002C CD 18 int 18h;//找到活动分区后,还要检查剩余分区的启动标志是否为0;不允许存在多个活动分区seg000:002Eseg000:002E loc_1002E: ; CODE XREF: seg000:0023 j seg000:002E 8B F5 mov si, bpseg000:0030seg000:0030 loc_10030: ; CODE XREF: seg000:0038↓j seg000:0030 83 C6 10 add si, 10h ;//下一个分区表表项seg000:0033 49 dec cx ;//分区表表项数量减1seg000:0034 74 19 jz short loc_1004F ;//如果4个表项都检查完毕就跳转seg000:0036 38 2C cmp [si], ch ;//检查分区指示符是否为0 seg000:0038 74 F6 jz short loc_10030 ;//如果分区指示符是0就跳转检查下一分区,否则分区表是无效的seg000:003Aseg000:003A loc_1003A: ; CODE XR EF: seg000:0025 j seg000:003A A0 B5 07 mov al, ds:7B5h ;// 01B5+0600=7B5h,0x1B5偏移地址处一般为2C,0x12C偏移地址处指向字符串“Invalid partition table”seg000:003Dseg000:003D loc_1003D: ; CODE XREF: seg000:0069↓j seg000:003D B4 07 mov ah, 7 ;//例如:AX=72C,原0x12C偏移地址处指向字符串“Invalid partition table”,012C+0600=72C,即AX指向错误信息seg000:003F 8B F0 mov si, ax ;//si就指向字符串seg000:0041seg000:0041 loc_10041: ; CODE XREF: seg000:004D↓j seg000:0041 AC lodsb ;//读取一个字节到alseg000:0042seg000:0042 loc_10042: ; CODE XREF: seg000:0044↓j seg000:0042 3C 00 cmp al, 0 ;//字符串是否显示完成,MBR中三个错误信息字符串都以00结尾seg000:0044 74 FC jz short loc_10042 ;// 如果字符串显示完成,则进入死循环。

minix操作系统设计与实践 概述及解释说明

minix操作系统设计与实践  概述及解释说明

minix操作系统设计与实践概述及解释说明1. 引言1.1 概述引言部分将对整篇长文进行简要概述,并介绍文章的结构和目的。

本文将讨论MINIX操作系统的设计与实践,包括MINIX的概述、设计原则以及实践应用等方面内容。

同时,我们还会对MINIX的内核架构进行详细分析,包括内核组成部分、进程管理子系统以及文件系统子系统等。

此外,我们也会介绍MINIX的用户界面和工具集,包括用户界面概述、Shell命令解析器以及编译和调试工具链等内容。

最后,文章将以总结和展望作为结尾。

1.2 文章结构本文共分为五个部分:引言、MINIX操作系统设计与实践、MINIX内核架构分析、MINIX用户界面和工具集介绍以及结论。

其中,引言部分主要是对全文进行简要概述,并介绍了每个部分的内容安排。

1.3 目的本文旨在深入了解和解释MINIX操作系统的设计与实践,并对其各个方面进行详细探讨。

通过对MINIX操作系统的研究,在学术领域中推动操作系统领域的发展,并为读者提供一个全面了解MINIX操作系统的参考资料。

此外,通过对MINIX内核架构和用户界面工具集的分析,读者将能够更好地掌握操作系统的设计原则和实践应用,从而为自己的研究和开发工作提供有益指导。

以上是引言部分的内容,主要包括概述、文章结构和目的三个方面的说明。

希望能够清晰明了地介绍本文的主题和内容安排,以吸引读者继续阅读。

2. MINIX操作系统设计与实践:2.1 MINIX概述:MINIX是一个小型的Unix-like操作系统,由Andrew S. Tanenbaum 教授在1987年首次发布。

它的名称“MINIX”代表“Minimal Unix”,这意味着它被设计成轻量级且具有最基本的功能。

MINIX旨在用于教学目的,并作为学生了解操作系统原理和实践的工具。

2.2 MINIX设计原则:MINIX的设计遵循几个关键原则。

首先,它被设计成非常模块化和可扩展的,使得内核中的各个功能模块可以独立开发、测试和维护。

minix代码解读

minix代码解读

Minix源码解读报告学号:5100309002姓名:邢佳楠以下是我这学期主要阅读过的minix源码内容,主要从几个比较重点的系统调用的实现入手,阅读的足迹涉及KERNEL、PM、VM、VFS和一点PFS:一、系统的初始化进程:系统启动后,系统将提示选择多个image中一个进行处理。

选择映像后,系统进入pre_init() (kernel/arch/i386/pre_init.c) ,做一些开机准备,之后,完成一些参数的设置,读入相应选择的映像。

pre_init() 完成后,进入mpx.S 中的kernel_init 下的汇编代码。

之后进入main() (kernel/main.c) 函数。

在main中:(1) 初始化进程表,标记为空。

进程结构proc 在kernel/proc.h 中定义。

(2) 初始化特权表。

亦标记为空。

特权表记录了进程对应的能够执行的命令,如能够使用的内存范围,能够使用的I/O 地址,所使用的信号管理器,能够使用Kernel_call 的权限等等。

关于特权的配置,可以看include/minix/priv.h 其中的常量(3)初始化boot image所提供的一些默认的进程。

按照先后次序一一进行初始化,将他们放进进程表中(复制数据),如果进程是IDLE, CLOCK, SYSTEM,或者根系统进程(即再生服务器),那么他们当前可被调度,否则,初始不应该被调度。

对于再生服务器进程,作为系统进程且可以被抢占(这是所有系统服务的共性),另外,设置允许陷入等等。

对于其它进程,暂时不允许运行。

(4)之后设置堆栈,内存映像,将proc_ptr 指向当前进程,清除标记,入队,设置为可调度状态,开始调度。

(5)初始化中断、System Call数组等等二、IPC的实现:在上一层,由库函数产生中断进入到kernel 中(lib/libc/arch/ui386/rts/_ipc.S),具体没看,相关头文件主要是include/minix/ipc.h定义,在这个头文件里定义了9 种消息类型以及IPC 函数原型。

MBR内容解析

MBR内容解析

1C6H
4B
本分区之前的扇区数,该分区开始的偏移量,以扇区数表示
1CAH
4B
分区的总扇区数
红色部分(1FEH-1FFH):结束标志 作用:表示这个分区表是否有效,非"55 AA"表示这个分区表是无效的.
注意: x86构架上存储数据都是由低位到高位的
附录:
cannotreadpropertyencryptionofnull请尝试刷新页面或更换浏览器重试
放弃使用,几篇文章搬运过来 MBR(Master Boot Record)即主引导记录. 使用Winhex打开,磁盘的第一扇区:
MBR内 容 解 析
黄色部分(000H-1B7H):引导分区 作用:在主板BIOS完成自检之后,将整个MBR完全读取到内存当中,然后执行引导程序.然后依次执行:检测最后两个字节是否为"55 AA",检测是否有活动分区,若有,读入 活动分区的引导扇区地址,判断其是否合法,若合法,将控制权交给操作系统. 需要注意的是,每个磁盘的引导程序都不是一样的,它在格式化磁盘的时候有格式化程序自动产生.
绿色部分(1B8H-1BBH):磁盘签名 作用:Windows系统在对磁盘进行初始化的时候写入的标签,不可或缺,Windows依靠它来识别硬盘. 若丢失,Windows认为硬盘没有初始化.
橙色部分(1BEH-1FDH):分区表 作用:管理磁盘分区,丢失或损坏都会导致分区丢失或损坏. 格式: 1. 分成四部分,每一部分都表示一个独立的分区.一部分16B,即:1BEH-1CDH,1CEH-1DDH,1DEH-1EDH,1EEH-1FDH四部分,总共64B. 2.
字节偏移
字段长度 值
字段名和定义
0H代表活动分区,00代表非活动分区,其它的值非法

MBR引导代码详解

MBR引导代码详解

MBR引导代码详解MBR主引导扇区前139个字节引导代码详解1(前27字节,作用:复制)默认分类 2009-12-01 14:50:48 阅读127 评论0 字号:大中小订阅MBR在系统启动时自动加载到0000:7c00处,为512个字节.下面这段代码实现把0000:7c1b处MBR代码复制485个字节到0000:061b处,为什么不从0000:7c00开始复制512个到0000:0600处,因为前面1b 个字节为复制代码,所以忽略.空出的0000:7c00开始的空间将读入活动分区的操作系统的引导家扇区.0000 xor ax,ax '置ax为00002 mov ss,ax '把堆栈代寄存器置为00000004 mov sp,7c00 '把堆栈指令置为7c00,把以堆栈指向0000:7c00,0007 sti '中断使能0008 push ax '这条PUSH指令在0008处,前面的8个字节指令已经执行,所以push指令输入的数据覆盖前面的0000-0001空间,没有关系.这条PUSH ax指令与下面一条指令一起是把es置为0,es用于movsb指令,'REP MOVSB (同repz movsb)的作用是重复CX次将[DS:SI]中字节传送到[ES:DI]中。

SI、DI加或减1由DF确定,DF=0,加。

REP使CX减1,到0后结束传送。

所以REP MOVSB 指令与CX、SI、DI、ES、DS寄存器和Flag的DF位设置有关。

0009 pop es000a push ax '作用同上000b pop ds000c cld '使方向标志寄存器DF=0000D mov si, 7c1b '用于movsb0010 mov di, 061b '用于movsb ,将[DS:SI]中字节传送到[ES:DI]中0013 push ax '保存ax,di,用于第001a处指令retf(同ret),使ax->cs,di->ip,实现指令跳转0014 push di0015 mov cx,01e5 '用于repz movsb中的repz,每次cx减1,到0不执行movsb,为485,除去复制代码27个字节,即复制001B开始的代码0018 repz0019 movsb '复制字节001a retfMBR主引导扇区前139个字节引导代码详解2默认分类 2009-12-01 19:15:58 阅读55 评论0 字号:大中小订阅(第28到第76字节,共49个字节,作用:判断是否是活动分区,是否是非活动分区),一个扇区是512个字节,所以MBR主引导扇区也是512个字节,最后两个字节是55 AA,是表示结束的字节.而次后64个字节是硬盘分区表字节,每16个字节代表一个分区表项,所以最多有4项分区表项(如最多分为C,D,E,F盘),如果分区个数多于4个,则用虚拟MBR技术,即在MBR 扇区的分区表中用2项就行,第一项分区表为主分区C盘,第2项分区表为扩展分区,它指向这项中磁头,扇区,柱面3维地址所指向的扇区(为第二个分区的第一个扇区,如D),在这个扇区中的分区表项也只有2项,第一项是这个分区,第二个分区表项为扩展分区.这个分区项指向下一个分区(如E盘)的的第一个扇区.,以此推之,就是一个分区链,这种就可以突破MBR中只有4个分区表项了.分区表项的第一个字节代表的是是否为活动分区,80表示是活动分区(主分区),00表示的是非活动分区(扩展分区,或没有用到的分区表项这个标志也为00),除这两个标示外.其它标示为非法.下面是这17个字节的代码:001B mov si,07BE '因为前面27个字节代码把MBR内容复制到0000:0600处(其实前面27个复制代码字节为00,没有复制过来,一开始就复制到0000:061b 处),所以分区表的位置就为0000:06BE(第一项的开头地址).所以这句代码是把si指向MBR 中硬盘分区表的第一项的首地址.001E mov cl,04 '分区表有4项,4*16=64个字节,用于loop0020 cmp [si],ch 'cx寄存器前面用movsb减为0,所以ch=0,判断第一个分区表项的第一个字节标示是否为非活动分区,因为cmp是有符号数据比较,如果[si]=80,则其比0小0022 jl 002D '如果是80,活动分区,则跳到002D地址,这里有点问题,如果是81非法数据,也是小于0,也会跳到002D地址,所以用JZ比较好点0024 jne 003B ' 如果不等于00,(即不为非活动分区),则跳到003B,显示错误信息.0026 add si,0010 '使si指向下一个分区项,即跳过16个字节.0029 loop 0020 '循环取出4个分区表项.loop由cx次数决定002B int 18 'INT 18 为ROM BASIC 入口代码,它指分区表项中没有活动分区标志或非活动分区标志时,进行ROM BASIC代码.002D mov dx,[si] '若找到活动分区,把分区表项的前2个字节放到DX中dl=80,dh=起始磁头号002F mov bp,si '把活动分区的起始位置保存到BP寄存器中0031 add si,0010 '指向下一个分区表项0034 dec cx '因为前面ch=0,就是把前面cl=4减1,0035 je 004D '分区检测完毕,则跳转到系统引导区0037 cmp [si],ch '判断是否为非活动分区,是则跳转检测下一个分区表项,就是一面这条指令0039 je 0031'下面地址003B,是前面在检测既不是活动分区时,也不是非活动分区时,跳过来显示错误信息003B mov si,0710 'MBR扇区中错误信息的地址(10fH),在这里起始地址是0600,所以为070f003e dec si '前一指令是0710,这里减1,正好是070f003F lodsb '把si指向的地址中的数据字节放到al中,执行后si+10040 cmp al,00 '如果指向的数据字节为00(到结束了),就跳到003E,这时因为上面si+1了,003E处减1还是指向这个00,所以就(循环)停止到这,显示错误信息0042 je 003E0044 mov bx,0007 'BIOS中断int 10h,BX=传输区地址0047 mov ah,0E '设置显示模式,AL=0E 640×200 彩色图形(EGA)0049 int 10 '中断10H 显示字符004B jmp 003f '跳转显示下一个字符.MBR主引导扇区前139个字节引导代码详解3默认分类 2009-12-02 12:03:23 阅读46 评论0 字号:大中小订阅最后一段字节的作用是把活动分区对应的第一个扇区的512个字节数据读到0000:7C00处,如果读取不成功再读,读取的次数赋到DI中,如果读取成功,判断结束标志是否为AA 55,则恢复活动分区指针到SI,转到0000:7c00处,执行活动分区的系统引导程序.mov si,bpjmp 0000:7c00。

详细介绍minix3的MBR源代码

详细介绍minix3的MBR源代码
and cl, 0x3f ; cl = 获得每磁道的扇区数 (1为起点)。
inc dh ; dh原位磁头数,但起点为0,所以要加1才是正确的磁头数。
mov al, cl ; al = cl = 每磁道的扇区数
mul dh ; dh = 磁头数, ax 等于 磁头数×每磁道的扇区数=一个柱面的扇区数。
inc cl ; 由于原来是以0为起点,为了和中断兼容,转换至1为起点。
pop dx ; 恢复驱动器号dl
mov dh, al ; 磁头号传入dh
mov bx, LOADOFF ; es:bx 是装入位置,此处为 0:0x7c00
mov ax, 0x0201 ; 读磁盘扇区的入口参数
; [si +lowsec]就变成了[BUFFER + zero]。也就是变量zero,而它的值是0,意为这要加载的就是0扇区。
mov ax, word [si + lowsec + 0x0]
mov dx, word [si + lowsec + 0x2] ; dx:ax = 需要加载的次级引导的偏移扇区。
ret ; 加载成功,将控制权交给软盘引导。
nexthd:
call load0 ; 加载硬盘的引导程序。
error1:
jc error ; 加载失败,跳转的错误处理子过程。
ret ; 加载成功,向硬盘引导交出控制权。
; 加载硬盘上的引导程序,也可以是软盘上的第0扇区。
find:
cmp byte [si + sysind], 0x0 ; 分区的状态,如果不为0,则这个分区是以使用的。
jz nextpart ; 分区没被使用,检查下一个分区。

Minix源码解读:Minix总体框架 MousicHome

Minix源码解读:Minix总体框架  MousicHome

Minix源码解读:Minix总体框架MousicHomeMinix源码解读:Minix总体框架Posted 2013/08/18 by mousic &amp; filed under Minix源码解读.Minix Source Interpretation: Framework1.1 minix初始化过程系统启动,选择映像,进入pre_init()(kernel/arch/i386/pre_init.c)在MINIX3内核被成功加载到内存后,控制权会转移到kernel/mpx.s文件并执行。

设置boot栈,以便MINIX3结束后交还控制权将boot的GDT(保护模式的GDT数据结构)拷贝到内核地址空间,并加载设置内核段寄存器和栈初始化kernel所对应的text段、data段等调用start.c文件中的cstart函数来保存内核信息(进入保护模式)重新加载GDT和IDT初始化段选择子,初始化中断调用main.c文件中的main函数运行boot image初始化进程proc表(kernel/proc.h),设置标记为空初始化特权表初始化boot image中的进程初始化栈(内核载入内存,其他部分载入扩展内存)内核进程设置栈保护构建进程内存映像初始化寄存器、服务器栈指针为进程分配代码段和数据段boot image processes全部进入等待队列初始化时钟中断等switch_to_user()1.2 体系结构第四层:init进程(用户根进程),其他用户进程第三层:向用户进程提供服务的服务进程第二层:I/O进程(driver)第一层:包含kernel,系统任务、时钟任务1.3 消息机制实现include/minix/IPC.hecho,notify,sendrec,receive,send,sendnb,senda,do_kernel_call/kernel/Proc.c调用do_sync_ipc()判断消息类型,并检查消息情况,根据同步异步来分别调用函数。

mbr详细解析

mbr详细解析

mbr详细解析硬盘MBR全面分析MBR, 硬盘硬盘MBR全面分析在分析MBR的结构之前,先有来看看计算机的引导顺序(System Boot Sequence)Step 1. 内部电源打开,初始化,等待一小段时间用来产生稳定的电流。

如果主板芯片和CPU 收到了不符合规定的电流,将自动产生一个RESET信号。

在主板没有收到电源的Power Good 信号之前,重复步骤1。

Step 2. 执行BIOS中0FFF0h处的代码。

这里只有一条JMP指令,将跳转到真正的BIOS启动程序处。

Step 3. BIOS开始加电自检(Power-On Self Test, POST),如果出现错误,启动停止。

成功的话执行INT 19h(SYSTEM - BOOTSTRAP LOADER)Step 4. BIOS开始寻找显卡,找到的话将执行显卡的BIOS。

接着显卡初始化,将显示一段显卡信息,我们开机看到的第一屏就是它。

Step 5. BIOS开始执行所有其他设备的BIOS,包括软驱,硬盘等。

Step 6. BIOS显示启动信息Step 7. BIOS开始额外的检测。

一般有内存检测,如果内存有问题,将显示错误消息。

Step 8. BIOS探测所有的硬件,将显示如硬盘/光区信息等Step 9. BIOS给出一个已知硬件的列表Step 10. BIOS按照设置的驱动器顺序找驱动器,如果驱动器存在的话继续找启动扇区,软驱/硬盘的启动扇区都在0柱0头1扇区(cylinder 0, head 0, sector 1)Step 11. 将启动扇区读到内存0000:7c00处,接着INT 19h开始执行0000:7c00处代码Step 12. 如果找不到驱动器,系统显示错误信息并停止。

通常是"No boot device"或"NO ROM BASIC -SYSTEM HALTED"上面是冷启动的过程,热启动将从步骤8开始磁盘的启动扇区就是主引导记录(Master Boot Record),包括0柱0头1扇区的512个字节,它的任务是完成BIOS到操作系统的交接。

mbr案例分析报告

mbr案例分析报告

MBR案例分析报告1. 简介本文档旨在对MBR(Master Boot Record)案例进行全面分析和报告。

MBR是计算机硬盘上的一个特殊区域,用于存储引导程序和分区表等重要信息。

在本次案例中,我们将深入探讨MBR的作用、相关问题和解决方案。

2. MBR的作用MBR是计算机启动过程中的关键组成部分,它负责加载操作系统的引导程序和分区表。

具体而言,MBR的主要作用包括:•引导加载程序:MBR中存储了引导加载程序的代码,该程序负责加载操作系统的核心组件。

•分区表:MBR还包含了磁盘分区表的信息,用于确定磁盘上各个分区的位置和大小。

3. MBR案例概述在这个案例中,我们将探讨一个与MBR相关的问题。

具体来说,我们将分析一种特定情况下MBR被破坏的情况,以及如何解决这个问题。

4. 案例分析在本次案例中,我们遇到了一个MBR被破坏的问题。

当用户尝试启动计算机时,系统提示找不到可启动的设备。

通过进一步的调查和分析,我们发现MBR已经被病毒或恶意软件感染,导致其无法正常工作。

4.1 问题诊断为了确定MBR的问题,我们采取了以下步骤:1.检查启动错误:我们首先观察到系统提示找不到可启动设备的错误信息,这是启动问题的明显迹象。

2.检查MBR状态:通过使用磁盘工具,我们查看了MBR的状态,并发现它已经被感染或破坏。

4.2 解决方案针对以上问题,我们制定了以下解决方案:1.使用安全启动:为了防止类似的问题再次发生,我们建议用户启用安全启动功能。

安全启动可以检测并阻止不信任的引导加载程序执行,从而保护系统安全。

2.修复MBR:为了解决当前的问题,我们采取了以下步骤修复MBR:–启动到恢复环境:我们使用操作系统安装光盘或USB驱动器启动计算机,并选择恢复环境。

–执行修复命令:在恢复环境中,我们使用相关的修复命令来修复MBR。

具体的命令取决于使用的操作系统和工具。

3.安全扫描和清除:为了确保系统的安全性,我们建议用户进行全面的安全扫描和清除,以防止其他恶意软件的存在。

mbr方案

mbr方案

MBR方案什么是MBR?MBR(Master Boot Record)是计算机硬盘上的一个特殊扇区,其位于硬盘的第一个扇区(逻辑扇区号为0),大小为512字节。

这个扇区存储了计算机的引导程序和分区表信息,是计算机系统启动的关键部分。

MBR的作用MBR起到了以下几个重要的作用:1.引导程序:MBR中存储了引导程序(Boot Loader),当计算机启动时,BIOS(Basic Input Output System)会加载并执行MBR中的引导程序,从而实现操作系统的加载和启动过程。

2.分区表信息:MBR中的分区表记录了硬盘的分区布局,用于管理硬盘上的分区。

每个分区表项包含了该分区的起始扇区、结束扇区等信息。

3.唯一标识符:MBR中还包含了一个唯一标识符,称为磁盘ID,用于标识硬盘的唯一性。

MBR的结构MBR的结构如下所示:偏移量大小(字节)描述0x000 446 引导程序(512字节)0x1BE 16 第一个分区表项(16字节)0x1CE 16 第二个分区表项(16字节)0x1DE 16 第三个分区表项(16字节)0x1EE 16 第四个分区表项(16字节)0x1FE 2 魔数标识(0x55AA表示有效MBR,其他值表示无效MBR)MBR引导程序MBR中的引导程序是CPU可以直接执行的机器码,其作用是加载并执行操作系统的引导加载程序,从而启动计算机。

MBR引导程序的大小为446字节,其他部分为分区表项和魔数标识。

引导程序通常包括以下几个步骤:1.加载启动程序:MBR引导程序会加载硬盘上的启动程序,一般在主引导分区(主分区表项)的起始扇区中。

2.启动操作系统:启动程序会加载操作系统的内核文件,并开始执行操作系统的初始化过程。

MBR分区表MBR中的分区表用于管理硬盘上的分区。

每个分区表项占据16字节,共可记录4个分区。

分区表项的结构如下所示:偏移量大小(字节)描述0x00 1 引导标志(0x80表示可引导分区,0x00表示非引导分区)0x01 1 起始磁头号0x02 2 起始扇区和柱面号的高4位0x03 1 结束扇区和柱面号的低6位与起始柱面号的低2位0x04 1 分区类型(例如FAT32、NTFS等)0x05 1 结束磁头号0x06 2 结束扇区和柱面号的高4位0x08 4 起始扇区的逻辑扇区号0x0C 4 分区的总扇区数MBR最多可以记录4个分区,其中0号分区为主引导分区(Primary Boot Partition),用于存储操作系统的引导文件。

东北大学 MINIX MBR bootblock 分析

东北大学 MINIX MBR bootblock 分析

Minix代码分析之一:引导扇区代码作者:聪聪()本文本可以任意发布,在发布时注意请保持原作者的姓名。

email: luocong@1.1 计算机加电当我们打开计算机电源时,计算机叽叽嘎嘎进行设备和内存检测过后就读取硬盘或者软盘的引导扇区,这个扇区只有512字节(每个扇区都一样大),显然这512字节不能够有多大作用,操作系统需要通过这个引导扇区代码再装载操作系统的其他部分。

这512字节的代码被BIOS放在地址从0x0000:0x7c00开始处。

然后直接跳转到0x0000:0x7c00处去执行。

以上工作是BIOS干的,你什么也不用作在还没有跳转到这段代码之前,也就是BIOS把磁盘的引导扇区读入到内存之后,其DL和ES、SI寄存器的内容如下:DL:表示启动设备,例如,如果计算机是从软盘启动的则DL=0,若是从IDE的C、D盘启动的则DL分别为0x80和0x81。

如果是从硬盘启动的话,ES:SI是指向BIOS中的硬盘分区表存放的地址。

1.2 执行引导扇区代码好了,我们现在已经知道,计算机的BIOS已经把引导扇区的512字节的内容读入到了0:0x7c00处,然后就跳转到0:0x7C00处去执行,也就是执行引导扇区代码,其引导扇区代码见后面。

下面对引导扇区代码进行解释。

引导扇区代码的执行过程如下:1.2.1 BIOS在把引导扇区装载到地址0:0x7C00处后,引导扇区代码首先设置正确的堆栈。

其堆栈内容如下图所示:1.2.2 调用BIOS中断:ah=0x08,int 0x13得到磁盘驱动器参数。

其BIOS中断调用ah=0x08,int 0x13说明如下:中断调用ah=0x08,int 0x13返回后,在以下寄存器返回以下信息:DL:本机软盘驱动器的数目DH:最大磁头号(或说磁面数目)。

0表示有1个磁面,1表示有2个磁面CH:存放10位磁道柱面数的低8位(高2位在CL的D7、D6中)。

1表示有1个柱面,2表示有2个柱面,依次类推。

minix操作系统分析

minix操作系统分析

Minix操作系统内核源代码概要分析版本号:0.01(2004-5-28更新)作者:guokun email:guo_kun@ 第一部分 PC外围设备的相关分析.第二部分总体结构分析第三部分头文件及数据结构分析第四部分 kernel代码分析第五部分内存管理器的分析第六部分文件系统分析第七部分总结第一部分 PC外围设备的相关分析.●处理器复位后的状态分析●处理器的体系结构分析●硬盘Winchester硬盘结构分类分区表 Io端口地址硬盘控制器●软盘软盘结构分区表马达控制软盘控制器●时钟(PT)8253●实时时钟(RT)●总线时钟●可编程中断控制器8259A(PIC)●显示卡 6845-→vram→frame Buffer●串口●并口 8255●DMA控制器8237 基地址,控制字●键盘 8248●ISA 总线 ISA 端口的地址范围●PCI 总线 PCI IO/ MEM/ Configure第二部分总体结构分析总体结构分析概论源代码结构分解为树形结构。

如下所示:源代码总体组织结构.sys/ibm/include/ minix/net/...kernel/mm/fs/src/ boot/inet/tools/test/etc/lib/第三部分头文件及数据结构分析头文件详细分析include 目录结构include/a.out.hinclude/ansi.hinclude/errno.hinclude/fcntl.hinclude/ibm/partition.hinclude/limits.hinclude/minix/boot.hinclude/minix/callnr.hinclude/minix/com.hinclude/minix/config.hinclude/minix/const.hinclude/minix/keymap.hinclude/minix/partition.hinclude/minix/syslib.hinclude/minix/type.hinclude/signal.hinclude/stdlib.hinclude/string.hinclude/sys/dir.hinclude/sys/ioctl.hinclude/sys/ptrtrace.hinclude/sys/sigcontext.hinclude/sys/stat.hinclude/sys/types.hinclude/sys/wait.hinclude/termios.hinclude/unistd.hinclude/terminos.hinclude/ansi.h这个文件检测这个编译器是不是基于ANSI的编译器。

分析minix磁盘驱动程序

分析minix磁盘驱动程序

目录摘要 (1)1 引言 (1)1.1 研究背景 (1)1.2 研究目的和意义 (2)1.3 主要研究工作 (2)2 MINIX硬盘驱动程序 (2)2.1 MINIX硬盘驱动程序原理 (2)2.2 MINIX硬盘驱动程序实现 (4)2.2.1 主要数据结构分析 (4)2.2.2 主要操作实现 (5)3 总结 (7)致谢 (8)参考文献 (8)MINIX磁盘驱动程序研究摘要本文对I/O设备及驱动程序进行了分析,主要研究了MINIX硬盘驱动程序的基本原理,通过阅读代码,分析了MINIX硬盘驱动程序所用的主要数据结构及主要函数的实现。

关键词:MINIX,I/O设备,磁盘驱动程序1 引言1.1 研究背景I/O设备作为计算机的一个重要组成部分占据整个操作系统的相当部分,对计算机的整体性能有很大影响。

操作系统的主要功能之一是控制所有输入输出设备,它必须向设备发出命令,捕获中断并进行错误处理,还必须提供一个设备与系统其余部分之间的简单易用的接口。

设备管理的一个基本特征是设备处理的抽象性,即所有硬件设备都被看成普通文件,可以通过与操纵普通文件相同的系统调用来打开、关闭、读取和写入设备。

图1表示了设备访问的层次关系。

图1 设备访问层次图I/O设备大致可以分为两类:块设备和字符设备。

块设备将信息存储在固定大小的块中,每个块都有自己的地址。

块设备的基本特征是每个块都能够独立于其他块而读写。

磁盘是最常见的块设备。

块设备和字符设备的模型具有足够的一般性,可以作为使处理不同I/O设备的操作系统软件具有设备无关性的基础。

例如,文件系统仅仅控制抽象的块设备,而把与设备有关的部分留给较低层软件,即设备驱动程序去处理。

设备驱动程序是操作系统内核和机器硬件之间的接口,设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作,设备驱动程序是内核的一部分,它完成以下的功能:对设备初始化和释放;数据从内核传送到硬件和从硬件读取数据;读取应用程序传送给设备文件的数据和回送应用程序请求的数据;检测和处理设备出现的错误。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
call print
.data2 BUFFER+devhd
getkey:
xorb ah,ah !Waitforkeypress
int 0x16
movb BUFFER+choice,al
subb al,#0x30 !al-=&#39;0&#39;
print: pop si !returnaddress
lods !ax=*si++=wordafter&#39;callprint&#39;
push si !newreturnaddress
mov si,ax
prnext: lodsb !al=*si++ischartobeprinted
!Copythiscodetosafety,thenjumptoit.
mov si,sp !si=sta源自tofthiscode push si !Alsowherewe&#39;llreturntoeventually
mov di,#BUFFER !Bufferarea
我们将启动设备前512个字节称作MBR(全称是MasterBootRecord);通常MBR指的就是硬盘的第一个扇区,但是在MINIXOS中我们可能将其放置到软盘中,所以叫启动设备更贴切。MBR的最后两个字节就是魔力数字。BIOS负责将找到的第一个启动设备的MBR导入内存中的0x7C00开始的一段空间,之后将控制权交给这段MBR;接下来CPU开始执行MBR中的内容;由于MBR只有512个字节,这么短小的一段程序通常被用来导入真正的操作系统程序。接下来让我们看看MINIX的MBR:
!ALTkeypressedtooverrideactivedeviceboot?
key:
movb ah,#0x02 !Keyboardshiftstatus
int 0x16
testb al,#0x08 !Bit3=ALTkey
jz noalt !NoALTkeypressed
在导入MBR并复制完成后,本段代码的任务就是找到活动分区并将本活动分区上的操作系统导入到内存;接下来就是寻找活动分区。活动分区可能存在于插入的软盘中,也可能在本地硬盘中。MINIX在接下来的启动过程中会给用户一次机会来选择活动分区,并依据用户提示的内容来引导指定活动分区中的系统。首先调用中断,测试ALT键是否被按下,如果被按下则调用打印过程并继续提示用户选择相应的活动分区;这里需要说明的是用户可以选择0到9,a到j共20项,这是由MINIX磁盘分区的规则决定的;之前我们说过,MINIX对磁盘划分为4块子硬盘,每块硬盘又包含4个分区,这样就是4个子硬盘加上16个分区共20个选择(可见这段代码并不能使你选择活动的子分区)。如果用户键入一个输入,则程序对输入进行判断,并在检测通过后显示用户的选择并跳转到override继续执行;如果用户输入错误,则minix让用户重新输入;如果用户没有选择按下ALT键,则程序跳转到noalt处执行;现将print代码与数据段一并列出:
本文写给所有对OS感兴趣并喜欢挖代码的兄弟。水平所限,还望大家多包涵哪。
PC机在加电开启的过程中,要完成自检以及载入操作系统的工作。这篇文章借助MINIX这个简单的操作系统来探寻一下计算机是如何完成载入操作系统的准备工作的。
本文章读者需要熟悉汇编语言(不涉及到保护模式的编程),BIOS中断调用,熟悉计算机体系结构。
PART_TABLE= 446 !Locationofpartitiontablewithinthiscode
PENTRYSIZE= 16 !Sizeofonepartitiontableentry
MAGIC = 510 !LocationoftheAA55magicnumber
.bss
begbss:
.text
begtext:
_main:
以上定义了MBR导入的地址,即BIOS将其初始导入的地址0x7c00;0x0600为稍后整段MBR被重新拷贝到的地址;这样做是为了后面的程序腾地方。至于为何选择0x0600为拷贝的目的地址,我想这里应该因人而异吧,只要避开底端的中断向量表由不会覆盖0x7c00的代码就可以了。接下来定义了分区表结构的位置446以及单个分区表项的大小16,最后是魔力数字的位置510;这个魔力数字由另一个程序installboot添加进MBR,这里暂且不讨论这个程序。之后定义的是三个重要的分区表项变量的偏移地址。接下来是代码段:
cmpb al,#10
jae getkey !Keynotin0-9range
keyok:
push ax
call print !Showthekeytyped
.data2 BUFFER+choice
pop ax
jmp override
2.MINIX的MBR结构:
------------------------
0 code

445-----------------------
partitionentry1
461-----------------------
partitionentry2
477-----------------------
由于MBR除了代码还包含了硬盘的分区信息,则计算机可根据这些分区信息找到需要导入的操作系统。MINIX中,启动可以从软盘或者硬盘完成;如果启动从软盘完成,则软盘上的MBR指明了硬盘的分区信息;计算机首先将软盘中的MBR导入内存,之后按照此MBR的指示将相应硬盘分区中的系统导入内存;如果从硬盘启动,则系统首先导入第一块硬盘的MBR(因为它在最前面),之后按照这个MBR的信息导入相应硬盘分区的系统;如果此MBR指示系统存在于另一个硬盘的某分区,则还需继续导入此硬盘的分区表。可见MBR记录了硬盘分区的信息,并提供给系统活动分区的位置;MBR的代码根据分区表提供的活动分区的位置,进而将活动分区的首扇区导入,之后将活动权交给这段首扇区的代码,完成操作系统的导入。下面让我们看看MBR的代码部分。
[原创]MINIXOS之MINIXMBR代码分析
文章标题:[原创]MINIXOS之MINIXMBR代码分析顶部 bideyore 发布于:2005-09-1118:17 [楼主][原创]MINIXOS之MINIXMBR代码分析
文章作者:Bideyore[E.S.T]
信息来源:邪恶八进制信息安全团队()
.text
!Findactive(sub)partition,loaditsfirstsector,runit.
master:
jmp over
fix: .data1 0 !If1-9thenalwaysbootthatdevice
over:
xor ax,ax
partitionentry3
493-----------------------
partitionentry4
509----------------------
magicnumber
----------------------
代码段最长可达446个字节,如果实际代码少于这个数字则用0补齐。后面接着64个字节被分为4个部分,每部分由16字节的partitionentry(分区项)组成,partitoinentry的结构如下:
!<ibm/partition>.h:
bootind = 0
sysind = 4
lowsec = 8
;段定义
.definebegtext,begdata,begbss,endtext,enddata,endbss,_main
.data
begdata:
last_sec
----------------------
last_head
----------------------
sysind &#61663;-------本分区使用的文件系统类型;如果为零则表示本分区未被使用
4 ---------------------
start_cyl
1.首先让我们对计算机的启动过程有一个大概的了解:
计算机加电后,由BIOS完成一系列的检测工作,如果所有设备都工作正常,则接下来BIOS开始检测启动设备;计算机会在启动设备第一个扇区偏移量为510的地方寻找一个魔力数字(MagicNumber)0xAA55,如果没有这个魔力数字则不是启动设备。每个启动设备的第一个扇区偏移量510byte处都会有这个数字,那么一个计算机如果有多个启动设备(软盘,硬盘,光盘等),则PC就要按照一定的顺序依次检查这些启动设备;这个次序就是我们在BIOS中设置的bootsequence。
----------------------
start_sec
----------------------
start_head
----------------------
0 bootind &#61663;------如果为可启动(活动)设备则非零
----------------------
在MINIX系统中,MINIX允许将硬盘进行分区;一整块硬盘可以分为4块子硬盘,每块子硬盘又可由4个子分区构成;一个硬盘的分区大小可以为0,但必须有4个分区;Hd0是整个第一级硬盘,hd1是硬盘的第一个分区,hd2是第二个,hd3是第三个,hd4是第四个。Hd5是第二块硬盘,hd6-hd9是这块硬盘的分区。Hd10是第三块硬盘,hd11-hd14是这块硬盘的分区,hd15是第四个硬盘,hd16-hd19是这块硬盘的分区。每一个分区还可以有4个子分区。Hd1a是第一个分区hd1的子分区,hd1b是第二个子分区,hd1c是第三个子分区,hd1d是第四个。(累死人了;明白不?)
相关文档
最新文档