- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在引导加载程序的第二阶段,我尝试将虚拟软盘上的一些扇区加载到 bochs 中的内存中。 ,但是在调用 int 0x13
时,例程不会返回。
我相信我的第二阶段的相关代码是:
bootsys_start:
mov %cs, %ax
mov %ax, %ds
/*
* Remap IRQs. Interrupts have been disabled in the
* bootloader already.
*/
mov i8259A_ICW1($i8259A_IC4), %al
out %al, i8259A_ICW1_ADDR($i8259A_MASTER)
out %al, i8259A_ICW1_ADDR($i8259A_SLAVE)
mov i8259A_ICW2($USER_INT_START), %al
out %al, i8259A_ICW2_ADDR($i8259A_MASTER)
mov i8259A_ICW2($USER_INT_START + 8), %al
out %al, i8259A_ICW2_ADDR($i8259A_SLAVE)
mov i8259A_ICW3($0x4), %al
out %al, i8259A_ICW3_ADDR($i8259A_MASTER)
mov i8259A_ICW3($0x2), %al
out %al, i8259A_ICW3_ADDR($i8259A_SLAVE)
mov i8259A_ICW4($i8259A_uPM & i8259A_x86), %al
out %al, i8259A_ICW4_ADDR($i8259A_MASTER)
out %al, i8259A_ICW4_ADDR($i8259A_SLAVE)
call mm_detect
/* Load the kernel now. */
xor %bp, %bp
1:
mov $KERNEL_ORG >> 0x4, %ax
mov %ax, %es
mov $KERNEL_ORG & 0xf, %bx
mov $0x200 | KERNEL_SECTORS, %ax
mov $(KERNEL_C << 0x8) | KERNEL_S, %cx
mov $(KERNEL_H << 0x8) | FLOPPY_DRV, %dx
int $0x13 /* <--- This int 0x13 doesn't seem to return */
jnc 1f
cmp $0x2, %bp
je floppy_err
inc %bp
xor %ah, %ah
int $0x13
jmp 1b
所有代码都可以在我的 Github repository 中找到。要构建,只需使用 make all
,然后使用命令 bochs
我做的第一件事是验证所有参数是否正确。 bochs shell 中的 r
产生:
CPU0:
rax: 00000000_534d0201 rcx: 00000000_00000005
rdx: 00000000_534d0000 rbx: 00000000_00000000
rsp: 00000000_00007700 rbp: 00000000_00000000
rsi: 00000000_000e0005 rdi: 00000000_00000316
r8 : 00000000_00000000 r9 : 00000000_00000000
r10: 00000000_00000000 r11: 00000000_00000000
r12: 00000000_00000000 r13: 00000000_00000000
r14: 00000000_00000000 r15: 00000000_00000000
rip: 00000000_00000036
eflags 0x00007046: id vip vif ac vm rf NT IOPL=3 of df if tf sf ZF af PF cf
ah = 0x2
(例程 ID)、al = 0x1
(扇区数)、ch = 0x0
(柱面号的低字节)、cl = 0x5
(扇区号和柱面号高两位)、dh = 0x0
(磁头号)、dl = 0x0
(驱动器号)。
sreg
打印 es
:
es:0x0000
和bx = 0x0
,因此该扇区被加载到0x0:0x0
,正如我的预期。
我尝试了几件事:
加载到物理地址0x600
我认为在执行 BIOS 中断例程期间覆盖 IVT 或 BDA 可能不是一个好主意,因此我尝试将扇区加载到 0x600
(es = 0x60
code>, bx = 0x0
) (我知道 BDA 只有 256 字节大小)。结果相同。
加载磁盘上的第一个扇区
也许读取第五个扇区在某种程度上超出了范围或其他什么?使用 int 0x13
读取第二阶段的代码按预期工作。我的第二阶段中的 int 0x13
是类似的,所以我希望它能够工作。作为测试,我将第二阶段更改为读取扇区 1,但它仍然不起作用。
将eax的上部部分清零
我认为 BIOS 例程中可能确实存在错误,并且以某种方式使用了 eax
而不是 ax
。我尝试将 eax
的高 16 位部分清零...但无济于事。
正如我之前所说,我已经将一些扇区从磁盘加载到内存中。 int 0x13
之前的 GPR 内容如下(在 bochs shell 中使用 r
获取):
CPU0:
rax: 00000000_00000203 rcx: 00000000_00090002
rdx: 00000000_00000000 rbx: 00000000_00000000
rsp: 00000000_00007700 rbp: 00000000_00000000
rsi: 00000000_000e7cdd rdi: 00000000_000000e2
r8 : 00000000_00000000 r9 : 00000000_00000000
r10: 00000000_00000000 r11: 00000000_00000000
r12: 00000000_00000000 r13: 00000000_00000000
r14: 00000000_00000000 r15: 00000000_00000000
rip: 00000000_00007c59
eflags 0x00007046: id vip vif ac vm rf NT IOPL=3 of df if tf sf ZF af PF cf
sreg
产生 es:0x8f60
,这是 EBDA 之前动态计算的地址。
比较两者,我没有发现可能影响中断例程功能的显着差异,因此问题不可能是通过寄存器传递的参数。
有人对该怎么做有其他建议吗?
最佳答案
您的 Int 13h/AH=02h 有几个问题软盘读取代码:
您已在问题中指出了这一点。当您在实模式下运行时,读取 0x0000:0x0000 之上的扇区是一个坏主意。这将破坏中断向量表(IVT)。从0x0000:0x0000到0x0040:0x0000的区域是IVT; 0x0040:0x0000 到 0x0060:0x0000 的区域是 BIOS Data Area (商业发展局)。 BDA 应被视为实模式 BIOS 例程可能使用的暂存区域。
要修复它,请将其加载到安全的地方,例如 0x0060:0x0000(物理地址 0x00600)。
进入保护模式后,0x00000000 和 0x00000600 之间的区域可以回收用于其他用途。 注意:请勿使用Extended BIOS Data Area (EBDA)内存区域作为通用内存,因为 System Management Mode (SMM)和Advanced Configuration and Power Interface (ACPI) 可以写入它。
您的代码重新映射 8259A 以为保护模式做好准备。在此过程中,IRQ 被重新映射到 IVT 的不同部分。 Int 13h 例程可能依赖于触发中断以及 BIOS 中断例程来执行软盘读取所需的工作。 IRQ0(系统定时器)和IRQ6(软盘 Controller )是可能的。如果您在其他地方重新映射 8259As 的基址,BIOS 安装的中断例程将不会执行。这可能会导致意外行为,包括Int 13h永远不会返回。
要解决此问题,我建议您在处于保护模式后重新映射 8259A PIC 的基础。到那时您可能已经完成了 BIOS 中断,因此这应该不是问题。
关于assembly - 软盘读取(AH=0x2,int 0x13)未完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40995474/
我正在尝试使用 y 组合器在 Scala 中定义 gcd: object Main { def y[A,B]( f : (A => B) => A => B ) : A => B = f(y(f)
我正在尝试了解返回指向函数的指针的函数,在我尝试编译代码后,它给了我这种错误: cannot convert int (*(int))(int) to int (*(int))(int) in ass
所以我一直在关注 youtube 上的游戏编程教程,然后弹出了这段代码:bufferedImageObject.getRGB(int, int, int, int, int[], int, int);
我正在将时间现在 与存储在数据库某处的时间进行比较。数据库中存储的时间格式为“yyyyMMddHHmmss”。例如,数据库可能会为存储的时间值返回 201106203354。然后我使用一个函数将时间现
例如 Maze0.bmp (0,0) (319,239) 65 120 Maze0.bmp (0,0) (319,239) 65 120 (254,243,90) Maze0.bmp (0,0) (
评论 Steve Yegge的post关于 server-side Javascript开始讨论语言中类型系统的优点和这个 comment描述: ... examples from H-M style
我正在研究 C 的指针,从 Deitel 的书中我不明白 int(*function)(int,int) 和 int*function(int, int) 表示函数时。 最佳答案 C 中读取类型的经验
您好,我使用 weblogic 11g 创建 war 应用程序,我对 joda time 的方法有疑问 new DateTime(int, int, int, int, int, int); 这抛出了
Create a method called average that calculates the average of the numbers passed as parameters. The
var a11: Int = 0 var a12: Int = 0 var a21: Int = 0 var a22: Int = 0 var valueDeterminant = a11 * a12
我正在为一个项目设置 LED 阵列。我得到了一个 LED 阵列,可以根据引脚变化电压进行更改,但我无法添加更多引脚。 当我尝试时,编译失败并显示错误:函数“int getMode(int, int,
除了创建对列表执行简单操作的函数之外,我对 haskell 还是很陌生。我想创建一个列表,其中包含 Int 类型的内容, 和 Int -> Int -> Int 类型的函数. 这是我尝试过的: dat
这个问题已经有答案了: Java add buttons dynamically as an array [duplicate] (4 个回答) 已关闭 7 年前。 StackOverFlow问题今天
我有几个 EditText View ,我想在其中设置左侧的图像,而 setCompoundDrawablesWithIntrinsicBounds 似乎不起作用。图形似乎没有改变。 有人知道为什么会
#include using namespace std; int main() { static_assert(is_constructible, int(*)(int,int)>::val
fun sum(a: Int, b: Int) = a + b val x = 1.to(2) 我在找: sum.tupled(x),或者 sum(*x) 当然,以上都不能用 Kotlin 1.1.3
有一个函数: func (first: Int) -> Int -> Bool -> String { return ? } 返回值怎么写?我对上面 func 的返回类型感到很困惑。 最
type foo = A of int * int | B of (int * int) int * int 和 (int * int) 有什么区别?我看到的唯一区别在于模式匹配: let test_
我正在尝试制作一个 slider 游戏。在这个类中,我使用 Graphics 对象 g2 的 drawImage 方法来显示“拼图”的 block 。但在绘制类方法中,我收到此错误:找不到符号方法dr
我试着理解这个表达: static Func isOdd = i => (i & 1) == 1; 但是这是什么意思呢? 例如我有 i = 3。然后 (3 & 1) == 1 或 i = 4。然后
我是一名优秀的程序员,十分优秀!