问题标签 [real-mode]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - 在 ISR 中调用 Int 13h
我已经在实模式下通过汇编为 int 9h 编写了 ISR。在这个 ISR 中,我调用 INT 13h, AH=0x02 来在硬盘上写入一些数据。但是数据不会写入硬盘。同样 int 13h, ah=0x02 也不起作用(从硬盘读取数据)。调用 int 13h 后,进位标志为 On,但 AH 和 AL 为零。当我在 ISR 之外使用此代码时,它就起作用了!为什么 ISR 中的 INT13h 不起作用,但其他中断(例如 INT10h)正常工作?
c++ - 关于编写操作系统的问题
我有一些关于编写操作系统的非常具体的问题,我希望能得到解答:
如果我使用 GRUB 作为引导加载程序,我需要编写多少汇编代码来加载最小的 C 内核?
我的内核将用 C 编写,它将加载我用 C++ 编写的命令行 shell,它不进行任何 API 调用,只调用标准库,我需要重写整个 C++ 标准库吗?
我可以用 C++ 编写视频、键盘和软盘驱动程序吗?
GCC 和 G++ 输出 16 位实模式代码吗?
我可以在 Windows 上使用 Mingw 编写这一切,还是必须在 Linux 上编写?
我是否需要处于实模式才能直接写入视频内存?
如果有人能回答我的问题,我将非常感谢
x86 - 段:偏移量寻址方案如何工作?
我读到在 Intel 8086 CPU 时代,最大的寄存器是 16 位,每个人都在寻找一种访问超过 65536 字节的线性内存的方法,但他们没有扩展 CPU 寄存器,而是发明了段:偏移寻址方案和我理解的方式,您可以将两个 16 位寄存器“组合”在一起,形成一个 32 位内存地址。但在同一个地方我也读到 CPU 只能访问 1MB 的内存。这是如何运作的?2^32 等于 4,294,967,296 所以我不明白,请赐教:)
assembly - 实模式 x86 ASM:基础是如何完成的?
我目前正在阅读boot.s
第一个 Linux 内核的源文件(假设 0.01 确实是第一个公开版本)。
我知道 C 和 ASM,后者比前者少得多。即便如此,我似乎能够理解并基本上掌握源文件中的代码。
这个文件让我很困惑。我现在意识到这是因为它处于实模式,而不是保护模式。不用说,我以前从未见过以实模式编写的 ASM 代码。保护模式是 x86 操作系统在我出生之前运行的事实上的模式,所以这是意料之中的。
这是我想更好地理解的例程:
查找outb
,我发现它用于将字节传递到计算机上的端口。我将根据 C 文档大胆猜测,这种情况将“停止电机”字节作为第一个参数传递,并将软盘驱动器端口号作为第二个参数传递。
这个接口是BIOS提供的吗?还是直接通过软驱?我假设 BIOS 具有节俭的“驱动程序”,用于所有基本设备的非常基本的操作。
这就是我被难住的地方:似乎像这样的数字#0x3f2
是凭空捏造的。它们显然是硬件端口号或其他东西。这个文件到处都是这样的数字,没有解释他们指的是什么。我在哪里可以找到一个全面的参考资料,其中显示了他们可以从实模式接收的所有硬件端口和控制号?此外,该文件似乎在整个引导过程中使用硬编码的内存地址在内存中移动内核。我在哪里可以找到关于在实模式下可以写入哪些内存地址范围的指南?
我还阅读了 Linus 关于重新编程中断以避免 BIOS 和内部硬件中断之间的冲突的评论。我不会撒谎,那是在我头上。
帮助会很大;如果您想知道的话,谷歌似乎对这个话题很少。
c - 适用于 Mac OS X 的 16 位实模式 C 编译器
我正在寻找一个在 mac 上运行的 C 编译器,它需要编译为 8086 16 位实模式机器代码。
assembly - 如何在 linux 驱动程序中切换到实模式
我有一个在嵌入式应用程序中使用的基于英特尔的 SBC。它有一个连接到 Fintek 超级 I/O 芯片的数字 IO (DIO) 端口。我希望能够设置此端口输出线上的位来控制其他一些硬件。
幸运的是,制造商的 BIOS 提供了一个功能来做到这一点:
不幸的是,我在保护模式下运行 64 位 linux。有什么方法可以调用该 bios 中断,无论是从用户空间程序还是作为内核驱动程序(如果需要)?
我也可以直接在 Fintek 芯片上设置寄存器,但这需要确切地知道芯片上的哪些引脚连接到 DIO 接头,当然,这会随着电路板版本的变化而变化。
x86 - x86 实模式下的 USB 控制
我正在开发一个原始的 x86 实模式 USB 访问项目。这涉及自定义引导扇区、第二阶段引导加载程序和一些琐碎的硬件驱动程序。
最终目标是提供一种可以启动、通过 USB 接口发送数据、通过 USB 接口接收数据并将结果值打印到屏幕的产品。除了 USB 访问之外,我已经完成了一切。
我已经发现 BIOS 不提供对板载 USB 的访问。从 osdevver 到breakthorn,我已经浏览了几十个站点。我什至看过 USB 2.0 规范。
没有人提供任何有关在 x86 实模式下使用 x86 程序集直接访问 USB 根集线器的相关或有用信息,而无需通过某些预先存在的操作系统。
没有为 USB 根集线器设置标准输入/输出端口吗?如果有,文档究竟在哪里指定允许软件告诉集线器要发送什么数据以及将该数据发送到哪个连接设备的标准通信?
c - 编译实模式 asm (rootkit.arsenal)
我坚持编译本书 rootkit 武器库中提供的 tsr.asm 代码。我在 XP 机器上安装了 open watcom,第一个 asm 列表编译得很好。
编译时,它会抛出错误:“找到多个起始地址”(在 google 上没有找到)。谁能确认这段代码是可编译的,如何编译?
我感谢任何建议。
assembly - 这个 hvmloader.c 引导加载程序代码有什么作用?
我阅读了xen的代码并找到了下面的代码。但我不知道它的含义。是初始化idt
和的代码gdt
吗?是从实模式跳转到保护模式的代码吗?如果是,gdt
和的物理地址在idt
哪里?Hvmloader.c:
谢谢。