标签: bootloader

如何将Intel HEX文件转换为内存数据等原始数据?

我想为AVR制作启动加载程序代码,它可以通过无线方式更新固件.

现在我可以使用一些固定数据写入应用程序区域.我有一个要更新的新固件的hex文件.如何将该hex文件转换为原始数据,以便我可以使用该原始数据更新应用程序?

avr bootloader hex-file

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

如何从它的源代码构建grub2 bootloader并使用qemu模拟器进行测试

我想知道如何从ubuntu中的源代码构建grub 2 bootloader并使用qemu模拟器进行测试.

我还想在新版本中更改grub2 bootloader的默认背景图片?

这可能吗?如果有,怎么样?

grub qemu bootloader

4
推荐指数
1
解决办法
8589
查看次数

我怎样才能在我的MBR中重新定位代码?

我正在尝试编写一个非常简单的MBR来开始学习如何编写MBR /内核.这是我到目前为止(从其他MBR的部分创建).我从使用nasm然后使用ld到链接的二进制文件与仅使用nasm两者有点不同,但这似乎不是问题.

我刚开始,jmp 0:continue但似乎跳转到0000:7c22(或001d单独使用nasm ...我相信我没有指定它开始于7c00)但我希望跳转到:7a22或:7a1d重新定位代码的地址.我尝试使用just jmp continue,然后在下面看到未注释,将堆栈指针添加到continue指针,推送它并返回.当我读到第一个扇区时,我得到的只是一个闪烁的光标.任何帮助表示赞赏.

                            ; nasm+ld       nasm            comment
global _start
_start:
    xor    cx, cx           ; 6631c9        31c9            Set segment registers to zero
    mov    es, cx           ; 8ec1          8ec1
    mov    ds, cx           ; 8ed9          8ed9
    mov    ss, cx           ; 8ed1          8ed1
    mov    sp, 0x7A00       ; 66bc007a      bc007a          Stack
    mov    di, sp           ; 6689e7        89e7            Bottom of relocation point
    mov    esi, _start      ; be007c0000    66be00000000
    cld …
Run Code Online (Sandbox Code Playgroud)

x86 assembly nasm osdev bootloader

4
推荐指数
1
解决办法
671
查看次数

BIOS磁盘 - 将扇区读入内存(int 0x13,ah = 0x02)阻塞

我正在编写MBR并使用QEMU进行测试.

当将读取扇区用于内存(int 0x13, ah=0x02)时,该int指令似乎阻止了我的程序的执行,并且它继续挂起.我已经用各种打印语句对此进行了测试,以确认这是特定的指令阻塞.

什么可以使中断阻止?我认为这只能通过cli指令完成,即使这样也不会阻止int指令.


对于上下文,这是导致阻塞中断的代码read_sectors_16:

        [bits 16]        
        [ORG 0x7C00]
        jmp 0x000:start_16      ; ensure cs == 0x0000

        reset_failure_str db 'error: boot disk reset', 13, 10, 0
        read_failure_str db 'error: boot disk read', 13, 10, 0
        boot_segaddr dw 0x7E00

        read_attempt_str db 'read attempt', 13, 10, 0
        end_read_attempt_str db 'end read attempt', 13, 10, 0

start_16:
        ;; Initialize segment registers
        mov ax, cs
        mov ds, ax
        mov es, …
Run Code Online (Sandbox Code Playgroud)

x86 mbr qemu osdev bootloader

4
推荐指数
1
解决办法
882
查看次数

SREC 或 Intel HEX 等十六进制格式的优势

我想问一下是否有人可以向我解释使用十六进制格式(例如由摩托罗拉 S-Record 或英特尔十六进制)比使用直接二进制映像(如固件或内存转储)的好处?

我知道有一些关于二进制文件的元信息很有用,比如使用的内存区域,数据完整性的校验和等等……但是,实际数据大小加倍的事实,因为一切都将以十六进制 ASCII 格式保存代表让我感到困惑。

使用十六进制 ASCII 表示的原因仅仅是可移植性,以防止具有不同字节字节序的系统出现问题还是有其他好处?

我为这个主题找到了许多关于如何将二进制转换为十六进制和向后转换或某些格式的规范的教程,但没有关于优缺点的信息。

memory-dump hexdump binary-data firmware bootloader

4
推荐指数
1
解决办法
1294
查看次数

如果我尝试将其指向标签,为什么x86-assembly(r)中的寄存器会自动移入?

我想写一个bootloader,它只是打印"Hello World!" 在屏幕上,我不知道为什么我的字节混淆了.我正在尝试用AT&T语法编写它(请不要推荐英特尔语法)并尝试将本教程中的代码转换为AT&T语法.

现在这里是我的bootloader的相当短的代码:

start:
.code16         #real mode
.text
.org 0x0
.globl _main
_main:
    movw hello, %si
    movb $0x0e, %ah

loophere:
    lodsb
    or %al, %al     #is al==0 ?
    jz halt         #if previous instruction sets zero flag jump to halt
    int $0x10       #run bios interrupt 0x10 (ah is set to 0x0e so a character is displayed)
    jmp loophere


halt:
    cli
    hlt


hello:  .ascii "Hello world!\0"


filloop:    
    .fill (510-(.-_main)),1,0   #I hope this works. Fill bootloader with 0's until byte 510 …
Run Code Online (Sandbox Code Playgroud)

x86 assembly real-mode gnu-assembler bootloader

4
推荐指数
1
解决办法
201
查看次数

装配文本颜色

我正在汇编中创建一个 iso 文件,并且想为文本添加颜色(在本例中为:红色)。
有谁知道该怎么做?

[BITS 16]
[ORG 0x7C00]

jmp main

main:
    mov si, string ; si=string
    call printstr
    jmp $

printstr:
    lodsb ; al=&si[0]
    cmp al,0 ;FLAGS = 0
    jnz print
    ret

print:
    mov  ah,0Eh
    int  10h
    jmp printstr

string db "HELLO WORLD!",13,10,0

times 510 - ($-$$) db 0
dw 0xAA55
Run Code Online (Sandbox Code Playgroud)

assembly colors bootloader x86-16

4
推荐指数
1
解决办法
4691
查看次数

编写 x86 程序集时链接描述文件的作用

我出于自己的好奇心正在学习 x86 汇编,以了解底层的东西,并在这里发现了这个很棒的存储库,其中包含许多可以从 EFI shell 运行的示例。

当我检查这个 hello world 示例时,有一个包含以下内容的链接器脚本:

ENTRY(mystart)
SECTIONS
{
  . = 0x7c00;
  .text : {
    entry.o(.text)
    *(.text)
    *(.data)
    *(.rodata)
    __bss_start = .;
    /* COMMON vs BSS: /sf/ask/1178500151/ */
    *(.bss)
    *(COMMON)
    __bss_end = .;
  }
  /* /sf/ask/3750926651/ */
  .sig : AT(ADDR(.text) + 512 - 2)
  {
      SHORT(0xaa55);
  }
  /DISCARD/ : {
    *(.eh_frame)
  }
  __stack_bottom = .;
  . = . + 0x1000;
  __stack_top = .;
}
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么需要它?只是为了指定加载地址?我对链接器脚本的一般理解是,当存在多个目标文件时,它们更有用,并且链接器脚本可用于定义如何将多个目标文件中的部分组合到单个可执行文件中。

如果我在此示例中不指定链接描述文件会怎样?(肯定至少有 2 个目标文件 - 一个来自.s,一个来自 …

x86 assembly linker linker-scripts bootloader

4
推荐指数
1
解决办法
1313
查看次数

安全启动和内核锁定之间有什么关系吗?

据我到目前为止的谷歌搜索,这两个功能似乎是独立的。

安全启动依赖于内核签名,因此引导加载程序将检查(内核/单映像应用程序)签名,如果有效将调用内核启动函数。

锁定是另一个功能,“锁定代码的目的是允许内核在启动时尽早锁定 - 足够早,以至于我们还没有能力kmalloc()。甚至不允许特权用户访问内核内存中存在的机密数据。”

在内核被验证为有效后,锁定通过引导参数/sysfs 控制来实现。

我的理解正确吗?

因此,在禁用安全启动的情况下,锁定功能应该仍然有效。

security linux-kernel bootloader lockdown linux-security-module

4
推荐指数
1
解决办法
2668
查看次数

为什么引导加载程序的开头需要 ORG 0x7c00?

在我见过的每个引导加载程序代码中,文件开头都有这一行“ORG 0x7c00”。据我所知,BIOS会将这段代码放在地址0x7c00处。

那么执行“org 0x7c00”的原因是什么?是不是如果第一条指令加载到0x7c00,计数器就会自动从那里开始?每条指令的地址不都是0x7c00 + 偏移量吗?

assembly operating-system bios nasm bootloader

4
推荐指数
1
解决办法
1689
查看次数