我最近一直在研究一些用于软驱的bootstrap代码.我的目标是修改程序,以便它使用我的USB闪存驱动器.现在我看到INT 13H功能如何与软盘设备一起使用,但我想我的问题是,与USB驱动器的通信将如何不同?
例如,这是一个软盘代码片段(GNU汇编程序):
movb $0x00,%dl /* select 1st floppy */
/* later */
movw sec,%cx /* get sector number */
movw head,%dx /* get head number */
movw $0x0201,%ax /* read 1 sector */
int $0x13
Run Code Online (Sandbox Code Playgroud)
现在我已经读过将0x80移动到%dl将选择BIOS中的第一个HDD.在我的特定BIOS中,我可以更改驱动器顺序,其中包括USB驱动器.我很确定这会依赖于BIOS,但我认为BIOS中列出的顺序可能与我进入%dl的值相对应.我需要追踪一些文档......
我真的不熟悉使用块设备,有人能指出我开始学习更多的好地方吗?
谢谢!
我有一个简单的程序.它必须从硬盘驱动器(而不是mbr)读取第一个扇区,并将其写入0扇区(mbr).但它不起作用.我认为它与错误的DAP有关.谢谢.
[bits 16]
[org 0x7c00]
;clear screen
start:
mov ax, 0x3
int 0x10
;reset the hard drive
xor ah, ah
mov dl, 0x80
int 0x13
jnz error
;read the second sector
mov si, DAP
mov ah, 0x42
int 0x13
mov si, data
call print_string
jmp $
DAP:
db 0x10 ;size of DAP
db 0x0 ;zero
db 0x1 ;number of sectors to read
db 0x0 ;zero
;point to memory
dw 0x0 ;offset
dw 0x0 ;segment
dq 0x1 ;disk address
DAP2:
db …Run Code Online (Sandbox Code Playgroud) 我在我的域名中做了一个清单.我想知道是否有办法获取计算机的BIOS状态,特别是BIOS密码状态,我想知道计算机是否有BIOS密码,如果没有关闭.
当我在Genymotion中启动一个多核虚拟设备时,我得到了这个:

什么是此虚拟化技术以及如何启用它?
我的CPU:Intel Core i5-4440
我正在阅读这篇关于操作系统编程的精彩剧本
http://www.cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-dev.pdf
在第 12 页上有一个简单的引导加载程序。
如果我理解正确,显示的代码是您必须在 NASM 中编写的代码才能让 BIOS 打印出字符。
我不明白的是:
它说
we need interrupt 0x10 and to set ah to 0x0e (to indicate tele-type mode)
and al to the ASCII code of the character we wish to print.
Run Code Online (Sandbox Code Playgroud)
但第一条指令是:
mov ah , 0x0e ;int 10/ ah = 0eh -> scrolling teletype BIOS routine
Run Code Online (Sandbox Code Playgroud)
我不明白该行的评论。为什么第一行代码没有说:
mov ah, 0xeh
int 0x10
Run Code Online (Sandbox Code Playgroud)
如果那是你需要做的?
感谢帮助!
来自维基百科
在 IBM PC 兼容机器上,BIOS 选择一个引导设备,然后将设备的第一个扇区(可能是 MBR、VBR 或任何可执行代码)复制到内存地址 0x7C00 处的物理内存中
我正在阅读操作系统中的引导过程,尤其是英特尔 x86:所以我发现将引导加载程序BIOS的第一个512 bytes加载到内存位置
(segment, offset) = (0x0000,0x7C00) = 0x07C00
Run Code Online (Sandbox Code Playgroud)
并跳转到那里执行引导加载程序
我的问题是为什么BIOS总是加载
引导程序到0x07C00?
我想知道如何正确地做到这一点,因为我这样做的方式行不通。
当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 也不起作用。请伸出援手。
我试图通过深入了解操作系统的低级细节来学习它。我现在上的课程是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到特定的地方?我在网上搜索了一段时间,但仍然找不到解释。更棘手的是,我发现不同的人会得到不同的地址来进行比较,比如0x6ac8,0x65a4或者0x6c48这里。
典型的 x86 系统将固件(也称为 BIOS 或 UEFI)存储在基于 SPI 的闪存芯片中。当上电发生时,处理器开始执行复位向量,该向量指向存储 BIOS 的内存映射 SPI 芯片。从这里开始,引导发生在 BIOS 完成平台初始化、加载引导加载程序,然后加载内核时。
但是,处理器如何知道如何从 SPI 芯片中读取数据呢?我的意思是,那时处理器将不知道 SPI 协议,芯片的哪些寄存器写入命令以及哪个寄存器查找读取的数据。读取是如何发生在如此低的水平上的?
我正在阅读一段内核引导加载程序代码(来自斯坦福大学的 CS140 Pintos OS):
# Configure serial port so we can report progress without connected VGA.
# See [IntrList] for details.
sub %dx, %dx # Serial port 0.
mov $0xe3, %al # 9600 bps, N-8-1.
# AH is already 0 (Initialize Port).
int $0x14 # Destroys AX.
Run Code Online (Sandbox Code Playgroud)
处理器以实地址模式执行这些指令。据推测,中断是通过找到中断向量表的第 21 个(索引 = 0x14)条目并在那里执行处理程序来处理的。根据这个来源,中断表是由 BIOS 在实模式下初始化的。 此维基百科页面列出了可用的 BIOS 中断,包括上面使用的中断。
我的困惑来自这样一个事实,即列出的中断异常编号与Intel 参考(第 20-6 页)中对实模式保留中断的描述实质上冲突(并且也在此维基百科页面中重复)
这些中断号是如何消除冲突的?