标签: bios

启动后的寄存器状态

我正在使用x86机器上的引导加载程序.

当BIOS将MBR的内容复制到0x7c00并跳转到该地址时,寄存器的内容是否有标准含义?寄存器是否有标准值?

我知道段寄存器通常设置为0,但有时会为0x7c0.其他硬件寄存器怎么样?

boot bios

7
推荐指数
1
解决办法
190
查看次数

AH = 2的BIOS INT 13H每次只能读取72个扇区.为什么?

我正在使用Bochs 2.4.5编写引导扇区代码.我使用INT 13H从软盘读取扇区.但我发现如果扇区计数读数> 72,则INT13将失败.返回码为AH = 1.下面是代码,这里是INT13.返回码为AH = 1.

为什么INT 13H不能读取超过72个扇区?

   xorb %ah, %ah
   xorb %dl, %dl
   int $0x13      # reset the floppy

   movw $0x8000, %ax
   movw %ax,%es        
   movw $0, %bx  # ES:BX is the buffer  
   movb $0x02, %ah
   movb $73, %al # how many sectors to read. 72 is ok, but >=73 is wrong.
   movb $0, %ch
   movb $1, %cl
   movb $0, %dh
   movb $0, %dl

   int $0x13
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

更新

按照Matthew Slattery的指示,我找到了相应的代码.我在这里列出的其他人和我一样困惑.完整代码位于此处.

7220       if …
Run Code Online (Sandbox Code Playgroud)

c operating-system dos bios

7
推荐指数
1
解决办法
2913
查看次数

BIOS中断中的页码

我正在为x86构建一个小型引导加载程序作为项目.目前我正在编写几个函数来处理屏幕,因为它有点单调乏味.大多数BIOS中断函数都涉及页码参数,我不知道这是为了什么.我认为,维基百科没有什么可说的.

有谁知道页码代表什么?

谢谢

x86 assembly bios bootloader

7
推荐指数
1
解决办法
1980
查看次数

PC启动:dl注册和驱动器号

我在互联网的某个地方读到,在跳到0x7c00之前,BIOS加载到启动设备的"驱动器号"%dl.但这个"驱动器号码"是什么?连接到计算机的每台设备都由BIOS分配了一个号码?如果是这样,我怎么知道分配给哪个设备的号码?

读取我在%dl设置了位0x80和0x70时发现的GRUB源代码,它用0x80覆盖整个寄存器.这是为什么?这是代码:

jmp 3f      /* grub-setup may overwrite this jump */
testb $0x80, %dl
jz 2f
3:
/* Ignore %dl different from 0-0x0f and 0x80-0x8f.  */
testb $0x70, %dl
jz 1f
2:     
movb $0x80, %dl
1:
Run Code Online (Sandbox Code Playgroud)

顺便说说.网络上的PC启动过程是否有详细的资源?特别是在将控件提供给引导加载程序之前BIOS的作用以及用于与之通信的标准代码(如"驱动器数").我希望编写自己的引导加载程序,我发现的所有内容都过于模糊,技术性不足以告知我的引导加载程序开始运行时计算机的确切状态.

x86 assembly bios bootloader x86-16

7
推荐指数
1
解决办法
2684
查看次数

谁在启动期间加载BIOS和内存映射

对于BIOS,维基百科说:

BIOS内存的地址位于首次启动计算机时执行.然后,跳转指令指示处理器开始在BIOS中执行代码.

我知道BIOS存在于非易失性存储器中.但它必须加载到RAM中才能执行.那么谁将BIOS加载到RAM中?

我还读到在启动时加载了内存映射.BIOS加载此内存映射吗?存放在哪里?

memory boot x86 operating-system bios

7
推荐指数
1
解决办法
6961
查看次数

BIOS在保护模式下中断

我正在开发一个操作系统项目,使用isolinux(syslinux 4.5)作为引导加载程序,使用组织在0x200000的多引导头加载我的内核.

据我所知,内核已经处于32位保护模式.我的问题:有没有更简单的方法来访问BIOS中断?(基本上我想要0x10:D)

加载后,我的内核设置了自己的GDT和IDT条目,并进一步重新映射IRQ.因此,在内核加载并设置VGA/SVGA模式(VBE 2.0模式)后,是否可以跳转到实模式.然后,我将继续我的内核并跳转到保护模式,我使用VBE 2.0物理缓冲区地址写入屏幕?如果有,怎么样?我尝试了很多,但没有成功:(

旁注:我在互联网上搜索了很多,发现syslinux 1.x +提供了_intcall api,我对此并不是100%肯定.请参阅"syslinux 4.5\com32\lib\sys\initcall.c"

interrupt bios protected-mode osdev syslinux

7
推荐指数
2
解决办法
2339
查看次数

如何在VMDK文件中找到MBR扇区?

我试图了解vmware bios在加载之前如何找到MBR.

在物理硬盘中很容易 - MBR位于第一个扇区.
但是......在VM中会发生什么?

我创建了2个VM - 在第一个vmdk(安装了基于linux的系统)上,我发现MBR偏移量为0x2A0000.
在第二个vmdk文件(安装了Windows XP)中,我发现MBR不止一次 - 但我发现的所有偏移量都不能除以512(扇区大小),这有点奇怪(就我而言)知道,MBR应该从一个扇区的开头开始+扇区大小是512字节,在vmdk中=> MBR的起始偏移必须除以512.如果我错了,请纠正我.
所以他们可能是备份的副本我想..不用说xp .vmdk中的@偏移0x2A0000没什么好玩的.

那么.. vmware的BIOS如何找到MBR?这个可配置参数位于何处?如何计算?

附加信息:
- 两个VMDK都是1个文件硬盘文件(并且可以增长到40GB).
他们所服务的系统只使用它们(XP使用xp.vmdk,linux使用linux.vmdk,没有额外的VMDK).

- @Windows VM我在\.\ PhysicalDrive0上使用WinHex来获取MBR.it看起来没问题(签名等等).
- @Linux VM我使用命令"dd if =/dev/sda of = mbr.bin bs = 512 count = 1",然后查看十六进制字节以获得MBR.我看着它看起来很好(GRUB,最后签名等).
从VM获取MBR之后,我在每个相应的.vmdk文件中搜索了主机pc中的MBR(使用十六进制编辑器),并且偏移量如上所述.

任何帮助,将不胜感激.谢谢!

mbr bios virtual-disk

7
推荐指数
1
解决办法
2795
查看次数

引导arch时出现nouveau错误

我用窗口8.1双启动了arch linux.安装后,第一次启动时,发生此错误.

Here is the error I found.
{ [0.063411] Ignoring BGRT: Invalid status 0 (expected 1)
starting version 218
Arch_Linux: clean, 70622/18677760 files, 1643393/74703025 blocks
[    15.759913] nouveau E[  PIBUST][0000:01:00.0] HUBO: 0xffffffff (0x1a
[    15.759952] nouveau E[  PIBUST][0000:01:00.0] GPCO: 0x00000001 (0x1a
[    15.823494] nouveau E[    PBUS][0000:01:00.0] MMIO: 0x00000000 FAULT a
[    15.824050] nouveau E[     DRM]Pointer to TMDS table invalid
[    15.824072] nouveau E[     DRM]Pointer to flat panel table invalid}
Run Code Online (Sandbox Code Playgroud)

graphics boot window bios archlinux

7
推荐指数
1
解决办法
5686
查看次数

CS寄存器在启动时的值是多少?

我是汇编语言的绿手.这些天我用bochs来模拟虚拟软盘的启动过程.但我不知道的一件事CS是系统初始化时寄存器值是什么.

;;  init registers

org 0x7c00

BaseOfStack equ 0x7c00

Label_Start:

mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
mov sp, BaseOfStack

;; clear screen

mov ax, 0600h
mov bx, 0700h
mov cx, 0
mov dx, 0184h
int 10h
Run Code Online (Sandbox Code Playgroud)

上面的代码只是其中的一部分.ORG执行命令时,指令的CS寄存器值是多少mov ax, cs.它与0x7c00相同吗?谢谢.

下面是bochsrc配置:

romimage: file="$BXSHARE/BIOS-bochs-latest"
vgaromimage: file="$BXSHARE/VGABIOS-lgpl-latest"
boot: floppy
floppy_bootsig_check: disabled=0
floppya: type=1_44, 1_44="myboot.img", status=inserted
pci: enabled=1, chipset=i440fx
vga: extension=vbe, update_freq=15
cpu: ips=15000000
log: bochsout.txt
mouse: enabled=0 …
Run Code Online (Sandbox Code Playgroud)

boot assembly bios bochs x86-16

7
推荐指数
1
解决办法
79
查看次数

BIOS 如何初始化 DRAM?

一段时间以来,我一直在四处寻找有关 BIOS 究竟是如何工作的解释。我设计了一个引导加载程序,并在成功初始化 IDT 和 GDT 的同时用它跳到了 32 位模式,但这样做时,我发现“操作系统”似乎很简单,感觉就像“ BIOS”是每台计算机的实际操作系统。

所以现在我接受了一个新的挑战,试图发现 BIOS 如何实际初始化自身,发现有多少 RAM 可用,以及如何/从何处将附加卡 ROM 导入到 RAM 中。据我了解,处理器不是通过跳转,而是自动开始在 RAM 内的 16 位段:偏移地址 0xFFFF:0x0000 处执行代码。这意味着从技术上讲,由于处理器的起始位置,所有计算机最初必须至少有 1MB 的 RAM 才能启动,并且由于这些知识,我一直假设所有 BIOS 都会在启动之前自动将自己写入 RAM处理器获取其 RST 信号。我觉得这不是真的,因为这正是我相信可以通过 BIOS 禁用的“Shadow BIOS”。然而,我一直在到处寻找“BIOS 设计师指南”,

BIOS 如何真正知道有多少 RAM?它是否只是在最高内存区域进行位写入位读取测试并从那里下降?以及如何将附加卡 ROM 加载到 RAM 中?据我了解,BIOS 构建了一个非常基本的中断和/或“入口点”列表,附加卡 ROM 可以利用这些中断和/或“入口点”,并使它们能够“锁定”其他 BIOS 的中断,例如“$PMM”?BIOS 制造商如何知道他们的 BIOS 中需要哪些确切的锚字符串才能启动像 Windows 这样的操作系统?? BIOS 制造商如何知道他们的 BIOS 中需要哪些确切的锚字符串才能启动像 Windows 这样的操作系统?? BIOS 制造商如何知道他们的 BIOS 中需要哪些确切的锚字符串才能启动像 Windows 这样的操作系统?

任何答案都会非常有帮助,以及任何推荐的规范和/或任何能够引导我了解我一直在寻求的知识的指南。例如,可能有一个指南说“在移交给 IPL 之前,BIOS 需要完成的最低要求的过程?” 或者甚至是一个 C 或汇编源代码示例,其中包含一些可以向我展示附加卡的 ROM 映像实际是什么或看起来像什么的内容,这将非常有帮助。

x86 assembly post bios

7
推荐指数
2
解决办法
1825
查看次数