问题标签 [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.
x86 - 如何从 16 位实模式重新启动 x86 程序集?
X86指令中已涵盖APM关闭以实模式关闭计算机?
如何重新启动而不是关闭计算机?请在您的回答中引用并解释相关文档/标准。
我了解 APM 和 ACPI 是两种主要方法,我对这两种方法都感兴趣。让我知道是否还有其他人。
我发现 ACPI 规范位于http://uefi.org/specifications但它需要太多的脑力来解析它,我发现它值得一个问题。
我找不到 APM 规范的 URL,这里只有 Microsoft RTF 的 Google 缓存。
如果您需要一种方法来测试您的答案,这个最小的 APM 关闭引导扇区示例可能是一个很好的起点。目标是将其转换为重新启动示例。
我已经在arch/x86/realmode/rm/reboot.S阅读了 Linux 内核 4.2 代码,但我不明白它是如何工作的,因为我找不到这些命令和我的工作关闭示例之间的区别。
与超级用户相关的更通用:https ://superuser.com/questions/294681/how-does-a-computer-restart-itself
保护模式的相关问题:在保护模式下重新启动
assembly - 在实模式下访问 4GB RAM
是否可以通过启用 A20 在实模式下使用 4GB 内存,而无需切换到保护模式,并且不会丢失 BIOS 中断?
assembly - 引导扇区比较总是错误的
在您帮助我hlt
指导之后(我忘记了清除中断cli
),我发现了另一个问题。比较总是清除carry flag
缓冲区是否等于密码,实际上密码总是错误的。问题在于(比较来自osdev.org的函数):
assembly - 在实模式汇编中指向 .text 的指针
我对实模式寻址一定有一些基本的误解。我正在尝试设置一个功能以在实模式下通过 BIOS 中断打印文本。我正在使用在 DOSBox 下执行的 .com 文件测试代码。.text 部分结束于 0x1000(.com 文件中的 0x0F00)。所以假设我想打印该文本的第一个字母。
那行得通,并打印出“ H”,因为我没有想象力。但是我不希望它只打印出同一个字母。我想传入一个指针,并且我想在打印更多文本时增加该指针。在这个阶段,我很高兴能从寄存器中读取偏移量。所以我做了以下改变。
并且没有字符被打印。我尝试过使用 esi 和 edi 寄存器,结果相同。使用 lea edx,byte ptr [0x1000] 产生相同的结果。更糟糕的是,尝试使用 16 位等效项(dx、si、di)会导致程序挂起。我尝试过查看 .com 文件中的机器代码,但找不到任何明显错误的地方。
我正在使用自定义链接器脚本和 objcopy 调用使用 gcc 编译代码以生成 .com 文件。没有链接库,目标架构是 386。
任何帮助将非常感激。
编辑:完整列表。
方向.s
目录测试.c
com_mingw.ld
所有这些都使用以下命令行编译。
其次是
assembly - TASM 程序输出垃圾并可能在退出时挂起
我有以下代码,它采用十六进制格式的数字并打印出其十进制格式。
这个程序在 Turbo Debugger 中运行得还不错,但是当我在 DOS 中运行它时,在我的数字输出之后,我在输出中看到了一些额外的符号:
输出:
C:\TASM>lab31
65535 ò Φ■╤ 9°☻░╧♠UWSîÄPA÷0ó♥┴∞└εê$♦ó♥α♦▲ê$ó♦Σê←ë♦ó♥☻╨sÄ÷♣t╣ ╞ ÷┤ⁿ8sê¬ê²≤&mî│░ⁿ┘╗♥÷ t<sÿ☻╪╟♣I☼>♥b!├─4&Gê&_ëΩî∞[┴éΦ
z│Φ ☺\│Φ ♀fδ[♥3¡ïA1èG┴├═≥uè ç♦└┌é─Ω╕↕ëX╪♥♦♫↕Y^▼Z╖
←tÇ5▲♦▼δá♦├☻├ █
☻┬! C└(A∞1▬:↕ÿ├ƒ♥╞[%█☼C└≥░Φ
1357 46$♦♦
如您所见,65535 打印正常,但随后出现垃圾。当我在 Turbo Debugger 中运行程序时,它在写出 65535 后挂起。
assembly - 引导加载程序读取驱动器参数
我想获得硬盘驱动器的尺寸。我发现我需要使用 int 13h 和 ah = 08h。我在维基百科上发现它返回以下内容:
DH 逻辑最后一个头的索引 = number_of - 1(因为索引从 0 开始)
CX [7:6] [15:8] 柱面的逻辑最后索引 = number_of - 1(因为索引从 0 开始)
[5:0] 每个磁道的逻辑最后一个扇区索引 = number_of(因为索引从 1 开始)
问题是我不知道如何仅读取位 [5:0] 以获取每个磁道的最后一个扇区索引,并且与 [7:6][15:8] 相同以获取柱面的最后索引. 如果有人能指出我正确的方式或解释如何做到这一点,我将非常感激。
x86 - x86 从实模式 CPL(当前权限级别)切换到保护模式
在 x86 中,在我们设置 PE 位 CR0 后,我们做一个 far JMP 以确保 CS/EIP 被改变。当我查看 x86 程序员手册中的逻辑流程时,对应于这条 far JMP 指令(保护模式),我看到如下内容:
我想确保特权级别为0。假设描述符中的DPL也为0,远JMP中的选择器中的RPL也为0。描述符中的C位为0,因此它是不合格代码段的情况。手册说 CPL 是 CS 中的最后两位。这意味着,在远 JMP 之前,CS 应该包含一个最后两位为 00 的值。所以,当我最初处于实模式时,我是否应该确保 CS 在我之前具有符合此条件的某个值执行远 JMP?如果我换个说法,当我们从实模式切换到保护模式时,CPL 是什么?
bios - 写保护扩展 ROM 区域
根据 PCIe FW 规范 3.0,一旦初始化向量完成,BIOS 将写保护扩展 ROM 区域,但是对于不支持 UEFI 并且在 16 位实模式下运行的 BIOS,它如何确保写保护?
assembly - 如何从实模式写入显存地址为 0xb8000 的屏幕?
我创建了简单的代码来从硬盘加载第二个扇区,然后写入整个屏幕,带有红色背景的空格。问题是我总是得到@符号而不是空格。这是代码:
根据此代码屏幕应填充空格,但事实并非如此。
nasm - bootloader - 加载第二阶段 - qemu 工作,真机没有
作为学习练习,我为 x86 BIOS 系统编写了一个小的 16 位引导加载程序。它似乎在QEMU上运行良好。我将它添加到旧的 amd-turion 计算机 (x86_64) 的驱动器中,当我尝试启动该计算机时,它会进入 BIOS 屏幕,然后我只是在黑屏上看到一个闪烁的光标。
我的问题是, QEMU的 x86 模拟器和真正使用 BIOS 而不是 UEFI 的真正 x86(64 位)计算机之间有什么不同?我是否必须为真实计算机编写与QEMU不同的代码?这是我将信息复制到驱动器的方式吗?计算机是否采用了一些硬件级别的安全措施?
我了解到它也不适用于 VirtualBox。
加载第二阶段似乎是有问题的(通过在真实硬件上成功打印第一阶段的字符)。
我的第一阶段引导加载程序使用这些文件中的代码:
stage_one.asm
磁盘加载.asm
打印.asm
我像这样生成我的内核: