我想为AVR制作启动加载程序代码,它可以通过无线方式更新固件.
现在我可以使用一些固定数据写入应用程序区域.我有一个要更新的新固件的hex文件.如何将该hex文件转换为原始数据,以便我可以使用该原始数据更新应用程序?
我想知道如何从ubuntu中的源代码构建grub 2 bootloader并使用qemu模拟器进行测试.
我还想在新版本中更改grub2 bootloader的默认背景图片?
这可能吗?如果有,怎么样?
我正在尝试编写一个非常简单的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) 我正在编写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) 我想问一下是否有人可以向我解释使用十六进制格式(例如由摩托罗拉 S-Record 或英特尔十六进制)比使用直接二进制映像(如固件或内存转储)的好处?
我知道有一些关于二进制文件的元信息很有用,比如使用的内存区域,数据完整性的校验和等等……但是,实际数据大小加倍的事实,因为一切都将以十六进制 ASCII 格式保存代表让我感到困惑。
使用十六进制 ASCII 表示的原因仅仅是可移植性,以防止具有不同字节字节序的系统出现问题还是有其他好处?
我为这个主题找到了许多关于如何将二进制转换为十六进制和向后转换或某些格式的规范的教程,但没有关于优缺点的信息。
我想写一个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) 我正在汇编中创建一个 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) 我出于自己的好奇心正在学习 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,一个来自 …
据我到目前为止的谷歌搜索,这两个功能似乎是独立的。
安全启动依赖于内核签名,因此引导加载程序将检查(内核/单映像应用程序)签名,如果有效将调用内核启动函数。
锁定是另一个功能,“锁定代码的目的是允许内核在启动时尽早锁定 - 足够早,以至于我们还没有能力kmalloc()。甚至不允许特权用户访问内核内存中存在的机密数据。”
在内核被验证为有效后,锁定通过引导参数/sysfs 控制来实现。
我的理解正确吗?
因此,在禁用安全启动的情况下,锁定功能应该仍然有效。
security linux-kernel bootloader lockdown linux-security-module
在我见过的每个引导加载程序代码中,文件开头都有这一行“ORG 0x7c00”。据我所知,BIOS会将这段代码放在地址0x7c00处。
那么执行“org 0x7c00”的原因是什么?是不是如果第一条指令加载到0x7c00,计数器就会自动从那里开始?每条指令的地址不都是0x7c00 + 偏移量吗?