好的,我需要对PCI BIOS服务目录(32位模式)执行CALL FAR以验证PCI BIOS是否存在.
注意:我正在开发一个简单的磁盘驱动程序,用于我们正在开发大学的简单操作系统.我知道这是非常具体的,但我将从内核代码中完成所有这些工作.
假设我已找到相关地址.执行远程调用给定地址的正确汇编语言是什么?有人可以发布一些远程调用给定32位地址的汇编代码吗?到目前为止我看到的例子的语法一直令人困惑.
谢谢!
编辑:在我的具体情况下,我已经找到了PCI BIOS服务目录,它给了我物理地址(32位).鉴于这个32位地址,我需要什么类型的远程调用?例如,我在英特尔手册中读到,远程调用可以改变任务,什么不可以.我怎么知道我要做什么来远远调用这个PCI BIOS服务目录的物理地址?
更新:
以下是我发现的一些令我困惑的代码(内联):
asm("lcall (%%edi)"
: "=a" (return_code),
"=b" (address),
"=c" (length),
"=d" (entry)
: "0" (service),
"1" (0),
"D" (&bios32_indirect));
我发现在这个源文件中:http://www.pell.portland.or.us/~orc/Code/Archive/linux-1.2.13/arch/i386/kernel/bios32.c
我想我想要做的就是在实际装配中相当于上面的内联.
如果内存是平坦的,即 CS 的基数为 0,并且覆盖整个 32 位地址空间
call <address>
Run Code Online (Sandbox Code Playgroud)
其中address是32位目标地址。
编辑:啊,我看到你有一个实际地址。我猜想这是针对在 Linux 上运行的设备驱动程序的。我对 Linux 内核没有任何经验,但我认为这个物理地址没有 1:1 映射到虚拟地址。您需要将其映射到虚拟地址(抱歉,不知道在 Linux 中如何操作),然后调用该虚拟地址。
但这提出了一个问题:您需要什么 PCI BIOS 功能,直接进入操作系统之外的 BIOS 通常是错误的方法。