Assembly 如何在linux驱动程序中切换到实模式

Assembly 如何在linux驱动程序中切换到实模式,assembly,embedded,64-bit,driver,real-mode,Assembly,Embedded,64 Bit,Driver,Real Mode,我有一个基于intel的SBC,我正在嵌入式应用程序中使用它。它有一个数字IO(DIO)端口连接到Fintek超级I/O芯片。我希望能够设置这个端口输出线上的位来控制其他硬件 幸运的是,制造商的BIOS提供了一个功能来实现这一点: AX=6F09h bl=<bits> int 15h AX=6F09h 基本法= int 15h 不幸的是,我在保护模式下运行64位linux。有什么方法可以调用bios中断,或者从用户空间程序调用,或者在需要时作为内核驱动程序调用 我也可以直接在Fi

我有一个基于intel的SBC,我正在嵌入式应用程序中使用它。它有一个数字IO(DIO)端口连接到Fintek超级I/O芯片。我希望能够设置这个端口输出线上的位来控制其他硬件

幸运的是,制造商的BIOS提供了一个功能来实现这一点:

AX=6F09h
bl=<bits>
int 15h
AX=6F09h
基本法=
int 15h
不幸的是,我在保护模式下运行64位linux。有什么方法可以调用bios中断,或者从用户空间程序调用,或者在需要时作为内核驱动程序调用


我也可以直接在Fintek芯片上设置寄存器,但这需要确切地知道芯片上的哪些管脚连接到DIO头,当然,这会随着电路板版本的变化而变化。

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

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


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

您的发行版可能有用于的软件包。libx86在x86上使用lrmi(与DPMI相反),在x86-64上使用x86仿真器,因为AFAIK vm86模式不能从64位模式使用。

我之前已经将其填充到引导加载程序中用于原型,但它可能不会继续使用。您可以根据“以前的位置”修复hw或futz的芯片位置。

True,vm86模式不再可用于长模式代码(注意“长模式”不是“64位”-即使是在长模式下运行的32位代码(它有名称,忘记了)也无法使用vm86)。