2012-02-14 74 views
2

我有一个基于intel的SBC,我正在使用嵌入式应用程序。它有一个连接到Fintek Super I/O芯片的数字IO(DIO)端口。我希望能够设置此端口的输出线上的位来控制其他一些硬件。如何在linux驱动中切换到实模式

幸运的是,制造商的BIOS自带的功能来完成这一点:

AX=6F09h 
bl=<bits> 
int 15h 

不幸的是,我在保护模式下运行64位Linux。有什么办法可以调用这个bios中断,无论是从用户空间程序还是作为内核驱动程序(如果需要的话)?

我可以选择直接在Fintek芯片上设置寄存器,但这需要知道芯片上什么引脚连接到DIO头上,当然,这会从电路板修订版改为电路板版本。

回答

1

首先,您必须确保Linux不会覆盖中断所在的内存。

您将无法以任何简单且不破坏的OS运行时方式进入实模式。您应该在内存中找到中断函数所在的位置,并使用某种模拟器来解释该16位机器码并执行64位长模式过程。您可以搜索OSDev ForumsOSDev Wiki以查找有关此主题的更多信息。

(提示:在保护模式下查看有关使用VESA的问题)。

1

您的配置文件可能包含libx86。 libx86在x86上使用lrmi(与DPMI相反),在x86-64上使用x86模拟器,因为AFAIK vm86模式不能在64位模式下使用。

+0

确实,vm86模式在长模式代码中不再可用(注意“长模式”而不是“64位” - 即使在长模式下运行的32位代码(它有名字,忘了它)也不能使用vm86 )。 – Griwes 2012-02-15 13:23:27

0

我已经在原型之前将它加载到bootloader中,但它可能无法继续。您可以根据“他们之前去过的地方”来确定芯片的位置。