我正在使用x86机器上的引导加载程序.
当BIOS将MBR的内容复制到0x7c00并跳转到该地址时,寄存器的内容是否有标准含义?寄存器是否有标准值?
我知道段寄存器通常设置为0,但有时会为0x7c0.其他硬件寄存器怎么样?
我正在使用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) 我正在为x86构建一个小型引导加载程序作为项目.目前我正在编写几个函数来处理屏幕,因为它有点单调乏味.大多数BIOS中断函数都涉及页码参数,我不知道这是为了什么.我认为,维基百科没有什么可说的.
有谁知道页码代表什么?
谢谢
我在互联网的某个地方读到,在跳到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的作用以及用于与之通信的标准代码(如"驱动器数").我希望编写自己的引导加载程序,我发现的所有内容都过于模糊,技术性不足以告知我的引导加载程序开始运行时计算机的确切状态.
对于BIOS,维基百科说:
BIOS内存的地址位于首次启动计算机时执行.然后,跳转指令指示处理器开始在BIOS中执行代码.
我知道BIOS存在于非易失性存储器中.但它必须加载到RAM中才能执行.那么谁将BIOS加载到RAM中?
我还读到在启动时加载了内存映射.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"
我试图了解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(使用十六进制编辑器),并且偏移量如上所述.
任何帮助,将不胜感激.谢谢!
我用窗口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) 我是汇编语言的绿手.这些天我用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) 一段时间以来,我一直在四处寻找有关 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 映像实际是什么或看起来像什么的内容,这将非常有帮助。