Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何检测多个HDD的可用性?_Assembly_Operating System_Kernel_Hard Drive_Mbr - Fatal编程技术网

Assembly 如何检测多个HDD的可用性?

Assembly 如何检测多个HDD的可用性?,assembly,operating-system,kernel,hard-drive,mbr,Assembly,Operating System,Kernel,Hard Drive,Mbr,我正在学习操作系统开发。我最近读到硬盘用80h表示,以此类推。但在MBR中,MBR必须检测多个HDD以选择引导 这是怎么做到的?如何检测多个硬盘驱动器的可用性并在其中切换 我正在使用: Ubuntu 气体汇编器 注:我想在系统的实模式下用汇编语言给出答案 谢谢。问题的标题和主体问了两个不同的问题 关于引导加载程序,或者更确切地说,是IPL(初始程序加载程序)如何检测要引导的设备,您可以在第6.5.1节中看到它的内容 这样,一旦引导处理程序成功启动 已将设备的引导扇区加载到内存中,地址为0000:

我正在学习操作系统开发。我最近读到硬盘用80h表示,以此类推。但在MBR中,MBR必须检测多个HDD以选择引导

这是怎么做到的?如何检测多个硬盘驱动器的可用性并在其中切换

我正在使用:

Ubuntu

气体汇编器

注:我想在系统的实模式下用汇编语言给出答案


谢谢。

问题的标题和主体问了两个不同的问题

关于引导加载程序,或者更确切地说,是IPL(初始程序加载程序)如何检测要引导的设备,您可以在第6.5.1节中看到它的内容

这样,一旦引导处理程序成功启动 已将设备的引导扇区加载到内存中,地址为0000:7C00h,执行控制 可通过以下寄存器内容进行传输:

  • ES:DI=指向PnP安装检查结构的指针
  • DL=用于INT 13h(00h、80h等)的驱动器号
因此,IPL提供了加载设备的驱动程序编号。
然后,IPL可以将其与INT13h一起用于加载第二阶段引导加载程序

简单地说,如果您正在编写MBR引导加载程序,您可以在
dl
中找到驱动程序号,在保存之前不要覆盖它

;Simple snippet that load one sector from the booting device

mov ax, LOAD_SEG
mov es, ax
mov bx, LOAD_OFF           ;ES:BX = Where to load the data
mov ax, 0201h              ;AL = How many sectors
mov cx, 0001h              ;CX = Cylinder and sector
xor dh, dh                 ;DH = Head, DL = Driver number (As given by the BIOS)
int 13h
jc _handle_err
您最好使用,而不是其本身,尽管出于教育目的,后者更简单


如果您正在编写一个引导加载程序,那么从技术上讲,您需要自己完成,VBR和MBR代码之间没有标准接口。
但是,每个MBR引导加载程序都至少向VBR引导加载程序提供驱动程序编号(仍在
dl

通常会传递更多元数据,但此类数据是专有的


加载MBR/VBR代码后要做什么取决于程序员,例如,有一个硬编码的LBA(在安装过程中写入)。
此LBA用于使用BIOS中的驱动程序号加载第二阶段。 第二阶段有一个小型文件系统驱动程序,用于通过路径读取内核中的配置文件

归根结底,引导加载程序必须知道在哪里可以找到要加载的其余代码

这通常是通过在将引导加载程序写入磁盘之前在引导加载程序的二进制映像中写入一些元数据来实现的。另一种策略是依靠MBR代码来传递分区号/启动,这样,如果第二阶段在第一阶段之前放置了固定数量的扇区,引导加载程序就会知道它在磁盘上的位置,从而知道第二阶段在哪里

说到元数据,我们就想到了这个问题。
尽管名称不同,但它不是由BIOS创建的,而是操作系统安装/格式化过程的结果

对于定制装载机来说,这并不是绝对必要的,使用它有两个原因:

  • 它包含驱动程序的几何图形。
    对于软盘来说,这很重要,因为软件必须告诉FDC要使用的几何图形(即扇区有多大)。
    现在,由于4KB扇区HDD的出现,这一点再次变得重要起来
  • 它包含查找文件系统的信息
  • 一些BIOS假设存在BPB,可能会尝试修补相同的值,特别是从USB引导时,因此最好至少包含一个类似NT引导加载程序的值


    通常,首先要做的是确定分区的布局,这包括FS类型和VBR格式。
    一般格式为

    +------------+------------------------------------+
    | boot block |              FS block              |
    +------------+------------------------------------+
    
    分区开头为引导加载程序代码保留了一些空间,VBR包含指向FS块的指针。
    如果FS足够简单(玩具操作系统可能就是这种情况),或者有特殊的支持,那么引导加载程序可以直接加载内核,从而将引导块仅压缩到第一个扇区

    另一种选择是,引导加载程序加载第二阶段,该阶段将具有最小但通用的FS驱动程序来按名称定位内核

    一般来说,VBR代码并不完全独立于卷的FS类型。

    例如,要在NTFS分区上安装GRUB,您需要使用它的特殊版本,而不使用经典的第二阶段

    关于引导加载程序,或者更确切地说,是IPL(初始程序加载程序)如何检测要引导的设备,您可以在第6.5.1节中看到它的内容

    这样,一旦引导处理程序成功启动 已将设备的引导扇区加载到内存中,地址为0000:7C00h,执行控制 可通过以下寄存器内容进行传输:

    • ES:DI=指向PnP安装检查结构的指针
    • DL=用于INT 13h(00h、80h等)的驱动器号
    因此,IPL提供了加载设备的驱动程序编号。
    然后,IPL可以将其与INT13h一起用于加载第二阶段引导加载程序

    简单地说,如果您正在编写MBR引导加载程序,您可以在
    dl
    中找到驱动程序号,在保存之前不要覆盖它

    ;Simple snippet that load one sector from the booting device
    
    mov ax, LOAD_SEG
    mov es, ax
    mov bx, LOAD_OFF           ;ES:BX = Where to load the data
    mov ax, 0201h              ;AL = How many sectors
    mov cx, 0001h              ;CX = Cylinder and sector
    xor dh, dh                 ;DH = Head, DL = Driver number (As given by the BIOS)
    int 13h
    jc _handle_err
    
    您最好使用,而不是其本身,尽管出于教育目的,后者更简单


    如果您正在编写一个引导加载程序,那么从技术上讲,您需要自己完成,VBR和MBR代码之间没有标准接口。
    但是,每个MBR引导加载程序都至少向VBR引导加载程序提供驱动程序编号(仍在
    dl

    通常会传递更多元数据,但此类数据是专有的


    加载MBR/VBR代码后要做什么取决于程序员,例如,有一个硬编码的LBA(在安装过程中写入)。
    此LBA用于使用BIOS中的驱动程序号加载第二阶段。 第二阶段有一个小型文件系统驱动程序,用于按路径进行读取