标签: bios

如何使用BIOS下的USB闪存驱动器执行低级IO(与软盘相比)?

我最近一直在研究一些用于软驱的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的值相对应.我需要追踪一些文档......

我真的不熟悉使用块设备,有人能指出我开始学习更多的好地方吗?

谢谢!

x86 assembly bootstrapping usb-drive bios

6
推荐指数
2
解决办法
7881
查看次数

用int 13h读取硬盘驱动器写入扇区

我有一个简单的程序.它必须从硬盘驱动器(而不是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)

x86 assembly bios bootloader bochs

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

检查我的电脑是否有BIOS密码(通过VB/C#)

我在我的域名中做了一个清单.我想知道是否有办法获取计算机的BIOS状态,特别是BIOS密码状态,我想知道计算机是否有BIOS密码,如果没有关闭.

c# vb.net passwords dns bios

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

BIOS中未启用虚拟化?

当我在Genymotion中启动一个多核虚拟设备时,我得到了这个:

在此输入图像描述

什么是此虚拟化技术以及如何启用它?

我的CPU:Intel Core i5-4440

virtualization bios genymotion

6
推荐指数
2
解决办法
3万
查看次数

了解用于在电传模式下输出字符的 nasm 程序集

我正在阅读这篇关于操作系统编程的精彩剧本

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)

如果那是你需要做的?

感谢帮助!

bios nasm osdev bootloader x86-16

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

BIOS 和地址 0x07C00

来自维基百科

在 IBM PC 兼容机器上,BIOS 选择一个引导设备,然后将设备的第一个扇区(可能是 MBR、VBR 或任何可执行代码)复制到内存地址 0x7C00 处的物理内存中

我正在阅读操作系统中的引导过程,尤其是英特尔 x86:所以我发现将引导加载程序BIOS的第一个512 bytes加载到内存位置

(segment, offset) = (0x0000,0x7C00) = 0x07C00
Run Code Online (Sandbox Code Playgroud)

并跳转到那里执行引导加载程序

我的问题是为什么BIOS总是加载

引导程序到0x07C00

x86 operating-system intel bios osdev

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

如何在 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
查看次数

处理器如何从 SPI 闪存读取 BIOS?

典型的 x86 系统将固件(也称为 BIOS 或 UEFI)存储在基于 SPI 的闪存芯片中。当上电发生时,处理器开始执行复位向量,该向量指向存储 BIOS 的内存映射 SPI 芯片。从这里开始,引导发生在 BIOS 完成平台初始化、加载引导加载程序,然后加载内核时。

但是,处理器如何知道如何从 SPI 芯片中读取数据呢?我的意思是,那时处理器将不知道 SPI 协议,芯片的哪些寄存器写入命令以及哪个寄存器查找读取的数据。读取是如何发生在如此低的水平上的?

x86 bios spi firmware uefi

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

BIOS 中断如何与保留的硬件中断冲突?

我正在阅读一段内核引导加载程序代码(来自斯坦福大学的 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 页)中对实模式保留中断的描述实质上冲突(并且也在此维基百科页面中重复)

这些中断号是如何消除冲突的?

x86 assembly serial-port interrupt bios

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