Assembly 在16位实模式和32位保护模式之间切换

Assembly 在16位实模式和32位保护模式之间切换,assembly,operating-system,nasm,elf,Assembly,Operating System,Nasm,Elf,我对编写自己的支持图形的微内核很感兴趣。但是,据我所知,如果不中断0x10,就无法更改图形模式,这需要实模式。在应用程序运行时,如何在实际模式和保护模式之间切换?我看过一篇关于的文章,但由于我是大会的新手,我无法想出如何实现这一点 技术细节: Ubuntu 16.04.4 LTS GCC 7.3.0交叉编译器(i686 elf) NASM 2.11.08汇编程序,但内联GAS样式语法很好 您所参考的页面上有一个描述将CPU从受保护模式转换回实模式所需执行的操作。它甚至有一个汇编代码片段 要从实

我对编写自己的支持图形的微内核很感兴趣。但是,据我所知,如果不中断
0x10
,就无法更改图形模式,这需要实模式。在应用程序运行时,如何在实际模式和保护模式之间切换?我看过一篇关于的文章,但由于我是大会的新手,我无法想出如何实现这一点

技术细节:

  • Ubuntu 16.04.4 LTS
  • GCC 7.3.0交叉编译器(i686 elf)
  • NASM 2.11.08汇编程序,但内联GAS样式语法很好

您所参考的页面上有一个描述将CPU从受保护模式转换回实模式所需执行的操作。它甚至有一个汇编代码片段

要从实模式进入保护模式,请使用第3A卷第9章中给出的英特尔建议。第9.10.2节给出了一个将CPU转移到保护模式的汇编代码示例

也就是说,您实际上不必在实模式中使用INT 10h。
有关您的问题,请参阅注释。

Ubuntu与此无关,您的代码将独立于硬件或DOSBOX等PC仿真器运行。无论如何,您不必使用
int 0x10
,您可以直接编程VGA硬件,假设您的硬件实现VGA I/O寄存器,而不仅仅是BIOS
int 0x10
接口。如果你说的是BIOS
int0x10
,那么你说的是VGA卡?在那里,您完全可以通过设置VGA卡寄存器来设置任何模式(设置模式约为20-50
out
instructions IIRC,设置所有计时等)。所以你的前提是错误的。使用现代gfx卡,您当然也可以直接从PM控制它,但您需要为特定的卡编写驱动程序,这对于小型项目来说是不可行的(而且毫无意义,对于Intel或ATI卡,使用linux/BSD ABI和驱动程序体系结构以及开源驱动程序要容易得多)要使用与其他操作系统和“借用”驱动程序相同的ABI/体系结构。。。我的意思是比自己编写驱动程序要容易得多,从驱动程序的角度复制linux或BSD操作系统环境仍然是一个相当复杂的挑战性项目,特别是现代驱动程序通常还包含着色器/cuda编译器等,因此它们使用相当大一部分POSIX API(作为对特定操作系统已经很复杂的驱动程序API的补充).等等,你是新来组装的吗?那就直接学习如何设置VGA,或者直接复制它,当你不能走路的时候,学飞行是没有意义的。感谢所有的评论,我非常感谢这么多人想要帮助我!我最终通过用GRUB调整我的多引导头中的值来让它工作,所以我不需要改变无论如何,rt模式是手动的。我应该怎么处理这个问题-让它保持打开状态或自己提供一个(接受的)答案?这不是我最终使用的解决方案(见上面的评论),但因为它是我原始问题的最正确答案,我已经将它标记为接受。感谢所有的帮助!