标签: bios

如何在 x86 实模式下正确设置 SS、BP 和 SP?

我想知道如何正确地做到这一点,因为我这样做的方式行不通。

BP用7C00h设置寄存器,然后用 设置SP寄存器BP,然后推送一些ASCII,然后从内存中获取数据以打印它INT 10h,它工作得很好。

mov ax, 7C00h
mov bp, ax
mov sp, bp

push 'A'

mov ah, 0Eh
mov al, [7BFEh]
int 10h
Run Code Online (Sandbox Code Playgroud)

实际输出是

一种

但是当我这样做时:

mov ax, 7C00h
mov ss, ax
mov bp, ax
mov sp, bp

...
Run Code Online (Sandbox Code Playgroud)

它停止工作。中断被调用,光标移动,但没有打印任何内容。设置SS为 0 也不起作用。请伸出援手。

x86 assembly callstack bios

6
推荐指数
1
解决办法
1530
查看次数

为什么 BIOS 需要在第二条指令中将(看似)随机地址中的值与零进行比较?

我试图通过深入了解操作系统的低级细节来学习它。我现在上的课程是MIT 6.828 操作系统工程。实验室要求学生进入 BIOS 以获取一些说明。BIOS 的前三个汇编指令如下:

0xffff0:    ljmp    $0xf000,$0xe05b
0xfe05b:    cmpl    $0x0,%cs:0x6c48
0xfe062:    jne     0xfd2e1
Run Code Online (Sandbox Code Playgroud)

我想不通的是第二个:cmpl $0x0,%cs:0x6c48. 它有什么作用?为什么需要这个条件才能jmp到特定的地方?我在网上搜索了一段时间,但仍然找不到解释。更棘手的是,我发现不同的人会得到不同的地址来进行比较,比如0x6ac80x65a4或者0x6c48这里。

x86 assembly qemu bios osdev

6
推荐指数
1
解决办法
187
查看次数

我希望能够通过网络从 BIOS 中提取错误日志

我希望能够通过网络从 BIOS 中提取错误日志。在 MSDN 中查看 Win32_BIOS 我没有看到任何定义错误日志的内容。很想用 WMI 在 C# 中做到这一点,但我愿意接受建议。是否可以?

Win32_BIOS 没有包含 BIOS 错误日志的属性(不知道这是否正确)。是否有库、API 等可用于在本地或从网络中提取此信息?

c# wmi logging bios

5
推荐指数
1
解决办法
804
查看次数

在Linux中读取BIOS内容的最佳方法

确实是一个奇怪的问题。是否可以读取BIOS芯片的全部内容。我们有一个问题,需要验证BIOS芯片的内容?

干杯詹姆斯

linux bios

5
推荐指数
1
解决办法
4271
查看次数

如何阅读VESA/VideoBIOS"模式删除表"?

关于让宽屏显示器以原始分辨率在笔记本电脑上工作的许多网站和文章都提到了视频BIOS中的"模式移除表",它专门用于防止某些视频模式:

这样的事真的存在吗?该修复程序对我有用,但我想知道我是否可以阅读,修改或解决此表.但是我在各种VESA标准中都找不到它.也许它实际上是由其他一些更神秘的名字?

resolution monitor bios video-card vesa

5
推荐指数
1
解决办法
1050
查看次数

控制风扇速度(CPU)

我想完全控制CPU风扇。停止它,开始它......做任何事情。我知道有些应用程序可以做到这一点,所以我想知道您是否知道任何可以实现的 API,因为我了解 .NET 并不能直接让您完全控制。

谢谢你。

c# bios

5
推荐指数
1
解决办法
6243
查看次数

为什么我们需要 AML - ACPI 机器语言?

据我了解,ACPI 定义了一个通用硬件编程模型,其中操作系统依赖于 OEM 固件提供的 AML(ACPI 机器语言)代码来操作硬件。

为了执行 AML 代码,操作系统必须包含一个 AML 解释器。

因此,在我看来,固件开发人员使用 AML 来提供平台硬件和操作系统之间的控制接口。

但我们真的需要 AML 吗?

我认为最终只能通过平台的原生指令来配置硬件。因此 AML 解释器必须将 AML 翻译成原生指令,否则无法在平台上执行。

但是使用像 AML 这样的中间语言有什么意义呢?我的意思是虽然 AML 被称为平台无关,这意味着我可以使用 AML 以非本地方式描述我的平台。

但实际上 AML 是平台固件的一部分。并且整个固件已经内置到目标平台的本机指令中。那么,让固件的这么一小部分独立于平台有什么好处呢?为什么不直接使用本机指令?有一定有办法让操作系统中使用它。这样操作系统根本不需要 AML 解释器。可以避免很多复杂性。

bios firmware acpi uefi

5
推荐指数
2
解决办法
1823
查看次数

有没有办法使用Windows读取RTC中存储的当前时间?

我正在寻找一种在 Windows 下运行时从主板查询当前 RTC 的方法。我正在寻找一个简单的未更改时间,因为它存储在硬件时钟中(没有漂移补偿,没有 NTP 时间同步,不是使用性能计数器继续使用的旧时间戳,...)。

我查看了Windows调用GetSystemTime、GetSystemTimeAdjustment、QueryInterruptTime、QueryPerformanceCounter、GetTickCount/GetTickCount64、GetLocalTime。我读到了有关 Windows 时间服务(并且我可以将其关闭)的信息,查看是否有一种方法可以使用旧的 DOS 方式(端口 70/71、INT 21h、INT 1Ah)访问 BIOS,查看了 WMI课程,...但我已经没有主意了。

据我了解,Windows会不时查询硬件时钟,并在偏差超过60秒时相应调整系统时间。这是没有 NTP 的情况。我发现的文档没有说明读取硬件时钟后会发生什么。必须使用另一个计时器来执行硬件读取之间的微计时。

由于我想得出有关时钟源漂移的结论,因此在向窗口询问“本地时间”并将其进度与任何高分辨率计时器(多媒体计时器、时间戳计数器...)进行比较时,这将击败所有推理。

有谁知道如何在 Windows 下运行时尽可能原始地获取当前存储在硬件时钟(RTC)中的时间?

windows time winapi bios real-time-clock

5
推荐指数
0
解决办法
1809
查看次数

PCIe 设备如何在 BIOS/UEFI 中显得可启动?

我有一个基于 Intel 的主机系统,带有我公司设计的 PCIe 子卡。我们可以枚举它以允许与英特尔处理器共享内存。我希望使可通过 PCIe 访问的子卡内存空间能够被 BIOS/UEFI 识别为可引导。

我可以选择实现众多 HCI 标准之一,但这似乎会很慢,因为该子卡由处理器驱动,并且 HCI 必须在软件中实现。一个更具体的问题是,是否存在 BIOS/UEFI 在枚举子卡后可以识别的已知可启动内存格式?谷歌搜索对我来说并没有取得太大的成功,这些标准,以及 BIOS 或 UEFI 在启动过程中如何符合所述标准似乎是部落知识并且很难发现。

其他详情:

  • 我想在主机 CPU 上启动 Linux 或 Vxworks。
  • 两个图像都驻留在子卡上的非易失性存储器中。
  • 子卡处理器负责通过 PCIe 将共享内存中的图像呈现给主机 CPU。
  • 就主机 CPU 而言,您几乎可以将子卡视为 NVMe 或 SATA SSD 扩展卡,但子卡负责更多功能,而不仅仅是启动主机 CPU,这就是为什么这些类型的设备不适用于我的应用程序。

embedded x86 bios pci-e uefi

5
推荐指数
1
解决办法
2893
查看次数

如何在 x86 实模式引导加载程序中初始化堆栈以防止与 BIOS 冲突?

假设我想将堆栈初始化为S字节大小。

我想选择堆栈的基本位置,B以便随着堆栈从 向下增长B,我最终不会覆盖引导加载程序或 BIOS 使用的任何代码或其他内存。

由于我自己编写引导加载程序(并且初始 MBR 扇区被加载到线性地址0x7c00),防止与引导加载程序发生冲突似乎是一个仔细规划的问题。

我如何知道 BIOS 代码所在的位置,以及我的堆栈是否可能覆盖 BIOS 正在使用的任何内存?

另外,是否可以保证初始ss:sp值指向哪里,以及在不设置新值的情况下可以安全使用多少堆栈空间?

assembly callstack bios bootloader x86-16

5
推荐指数
1
解决办法
133
查看次数