我对计算机的引导过程以及引导加载程序调用操作系统的部分有一些基本的问题.
所以我知道BIOS将可引导驱动器的前512个字节复制到内存中并执行代码 - 这就是引导块.
最好的问候,喇嘛
以下站点"编写引导扇区代码"提供了一个代码示例,可在系统引导时将"A"打印到屏幕上.从我一直在阅读的不是你必须使用INT操作码让BIOS做某些事情?以下代码如何从上面引用的站点工作而不使用中断?代码的哪一部分实际告诉硬件将"A"打印到屏幕上?
有问题的代码:
.code16
.section .text
.globl _start
_start:
mov $0xb800, %ax
mov %ax, %ds
movb $'A', 0
movb $0x1e, 1
idle:
jmp idle
Run Code Online (Sandbox Code Playgroud)
附加原始问题
如果我使用以下代码,BIOS调用是否会为我写入文本缓冲区?缓冲区从地址0xb800开始?
# Author: Matthew Hoggan
# Date Created: Tuesday, Mar 6, 2012
.code16 # Tell assembler to work in 16 bit mode (directive)
.section .text
.globl _start # Help linker find start of program
_start:
movb $0x0e, %ah # Function to print a character to the screen
movb $0x00, %bh # Indicate the page …Run Code Online (Sandbox Code Playgroud) 我已经做了很多关于如何从头开始编程BIOS的研究,但我什么也没得到.有没有人有任何类型的BIOS教程或指南,非常感谢.我绝对没有在哪里.这可能是不可能的,但我想要至少一个半通用BIOS,理想情况下使用虚拟机.
我的朋友当时正在使用消费级台式设备安装一台无头服务器,他遇到了这个错误,毫无疑问,以前很多人都已经看过或读过这个错误,但是有人真的知道它为什么存在吗?
如果未检测到键盘或键盘控制器出现错误,您如何才能按一下按钮来恢复?
是几种BIOS制造商采用的某种复活节彩蛋还是真正的原因,为什么一个常见的默认BIOS设置是如果没有检测到键盘就不允许计算机启动,然后期望启动过程能够恢复通过某种方式按下一个键?
[来自互联网的示例] http://p.twimg.com/AsWYydvCEAAiAHL.jpg:large
我是认真的
我处于不幸的情况,我需要使用CPU功能,在ia32功能控制MSR寄存器中没有启用BIOS.BIOS确实设置了锁定位,因此我无法自行设置该位.BIOS(华硕UEFI BIOS)无法更改行为.问题是,有什么方法可以设置这个位吗?我在想是否可以编写UEFI扩展或我可以从UEFI shell执行的某个程序.但是我不确定寄存器在执行之前是否被锁定(我对UEFI及其编程环境知之甚少).或者,是否可以修补BIOS更新映像或使用标准工具对其进行修改?谁听说过这个地区的成功商店?
有问题的功能是SGX(Software Guard Extensions).董事会是华硕Z170-K.除了BIOS无法设置此位外,一切都已到位以支持SGX.
5月22日更新:我刚刚将华硕Z170-K更新到新发布的BIOS 1803(5月20日发布).这是一个很大的版本号跳跃,所以我很有希望.可悲的是,新交所的支持仍然不存在.我现在已经向华硕提出了一项新的请求,这次我打算不要被刷掉.我认为它是彻头彻尾的业余,从一开始就不支持它 - 它是支持Skylake CPU的一部分,所以我认为所有需要这个的客户都应该尝试退款(我知道我会这样做).
我正在尝试编写自己的bootloader.虽然它在QEMU,Bochs和VirtualBox中运行良好,但我似乎无法在笔记本电脑上运行.
在我的笔记本电脑上,引导加载程序与所有模拟器的行为完全不同,挂起看似随机的地方,拒绝打印,甚至跳过一些jmp $指令.
虽然我对"真实硬件"有很多麻烦,但我认为它们都有一个原因.
以下代码是一个短引导加载程序,应该打印"TEST"消息3次,然后跳转到同一位置挂起:
[BITS 16]
[ORG 0x7C00]
jmp 0x0000:start_16 ; In case bootloader is at 0x07C0:0x0000
start_16:
xor ax, ax
mov ds, ax
mov es, ax
cli ; Disable interrupts
mov ss, ax
mov sp, 0x7C00
sti ; Enable interrupts
cld ; Clear Direction Flag
; Store the drive number
mov [drive_number], dl
; Print message(s)
mov si, msg
call print_string
mov si, msg
call print_string
mov si, msg
call print_string
jmp $ ; HALT
; …Run Code Online (Sandbox Code Playgroud) 我一直在用NASM编写一个测试程序,该函数用于int 13h从引导磁盘读取扇区,但每次使用sudo qemu-system-i386 load_disk.bin运行汇编程序时,它都会为我提供以下输出:
磁盘读取错误!磁盘读取错误!磁盘读取错误!*磁盘读取错误!*磁盘读取错误!*
如果设置了进位标志(CF),则可以预期。我一直在寻找答案的几天,并尝试了许多不同的解决方案(跳转到ES:BX之后jc test,将启动驱动器保存在DL...中),但似乎没有任何效果。
这是我的程序:
[bits 16] ;real mode
[org 0x7c00]
mov [DISK], dl ;save boot drive value
xor ax, ax ;setting up stack
cli
mov ss, ax
mov sp, 0x7c00
sti
mov di, 5 ` ;counter for number of tries
read_disk:
mov ah, 0x00 ;resetting disk
int 0x13
mov bx, 0x9000 ;data buffer
mov es, bx
mov bx ,0x0000
mov ah, 0x02 ; function number …Run Code Online (Sandbox Code Playgroud) 据我了解,ACPI 定义了一个通用硬件编程模型,其中操作系统依赖于 OEM 固件提供的 AML(ACPI 机器语言)代码来操作硬件。
为了执行 AML 代码,操作系统必须包含一个 AML 解释器。
因此,在我看来,固件开发人员使用 AML 来提供平台硬件和操作系统之间的控制接口。
但我们真的需要 AML 吗?
我认为最终只能通过平台的原生指令来配置硬件。因此 AML 解释器必须将 AML 翻译成原生指令,否则无法在平台上执行。
但是使用像 AML 这样的中间语言有什么意义呢?我的意思是虽然 AML 被称为平台无关,这意味着我可以使用 AML 以非本地方式描述我的平台。
但实际上 AML 是平台固件的一部分。并且整个固件已经内置到目标平台的本机指令中。那么,让固件的这么一小部分独立于平台有什么好处呢?为什么不直接使用本机指令?有一定有办法让操作系统中使用它。这样操作系统根本不需要 AML 解释器。可以避免很多复杂性。
通过Ralph Brown的中断列表,我发现有许多不同的方法可以将文本字符输出到屏幕上.
ROM BIOS API提供以下功能:
DOS API提供以下功能:
这些功能有什么作用?我怎么称呼他们?我如何在它们之间做出选择?
假设我想将堆栈初始化为S字节大小。
我想选择堆栈的基本位置,B以便随着堆栈从 向下增长B,我最终不会覆盖引导加载程序或 BIOS 使用的任何代码或其他内存。
由于我自己编写引导加载程序(并且初始 MBR 扇区被加载到线性地址0x7c00),防止与引导加载程序发生冲突似乎是一个仔细规划的问题。
我如何知道 BIOS 代码所在的位置,以及我的堆栈是否可能覆盖 BIOS 正在使用的任何内存?
另外,是否可以保证初始ss:sp值指向哪里,以及在不设置新值的情况下可以安全使用多少堆栈空间?