我是这个引导加载程序的新手。我使用 SWD 对 stm3205 进行编程。所以当我对 stm32f05 微控制器进行编程时,我的程序在哪个位置。我可以制作自己的引导加载程序并将其替换为 st 的默认引导加载程序吗?
我用汇编写了一个引导加载程序。下面是它的工作原理:
首先,BIOS 正常加载引导加载程序。指示进入200h。
在 200h 处,有一些代码位于 200h 和 21Eh 之间。它只是切换到 VGA 模式,使用 VGA 功能在坐标 1,1 上绘制一个洋红色像素。它永远循环该代码。
然而,当我加载它时,它只是在闪烁的光标上移动,这是普通的 VGA .bin 文件不会做的,并且会显示一个像素。我检查了一个像素,但什么也没看到。我看到的意思是 VGA 代码没有运行,引导加载程序只是加载了,没有别的。
引导加载程序代码:
cli
startload:
push 0x00000200
ret
times 510-($-$$) db 0
db 0x55
db 0xAA
Run Code Online (Sandbox Code Playgroud)
您可以看到它只是转到下一个扇区(从 200h 开始)和 200h-21Eh 处的代码:
BITS 16
org 200h
data:
xcoord DB '1'
ycoord DB '1'
color DB 'D'
.code:
vga:
mov ax, 13h
int 10h
mov ax, ycoord
mov bx, xcoord
mov cx, 320
mul cx
add ax, bx
mov di, ax
mov …Run Code Online (Sandbox Code Playgroud) 在 IAR 中为 stm32l0 添加自定义引导加载程序的适当步骤是什么?以下问题不清楚:
我很难开始这个。
所以icf将用于主要项目:
__region_ROM_start__ = 0x08000000;
__region_ROM_end__ = 0x08008FFF;
Run Code Online (Sandbox Code Playgroud)
所以 icf 将用于引导加载程序项目:
__region_Bootloader_ROM_start__ = 0x08009000;
__region_Bootloader_ROM_end__ = 0x08009FFF;
Run Code Online (Sandbox Code Playgroud)
和关于0xFFRAM的同样的事情?
我是嵌入式系统上 Linux 编程的新手。我想了解更多关于嵌入式引导加载程序和 U-boot。我的主要问题无疑是通用的,但我试图了解 U-boot 如何准确地找到 Linux 内核。
更具体地说,我使用的是 BeagleBone Black。我有一个 SD 卡分区如下(取自在线示例),一个包含 MLO + U-Boot 的 FAT32 分区,一个包含内核 + 设备树的 EXT4 分区和另一个包含 rootfs 的 EXT4 分区。
我知道 ROM 主引导加载程序首先加载,在 FAT 分区中定位 MLO 文件,然后将控制权传递给 U-Boot。
U-Boot 如何最终准确定位内核?这和uEnv.txt启动配置文件有关吗?我知道 U-Boot 有一个学习曲线,需要一些阅读,但只是为了提前获得一些知识。
如果我更改 SD 卡映像并放置更多分区并尝试从它启动,而内核在不同的分区上,现在会发生什么?我是否需要特别告诉 U-Boot 在哪里可以找到内核,或者它会一直搜索直到找到它?
我正在开发自己的引导加载程序 + 内核。我创建了一个项目放在github上:https : //github.com/rprata/ubootlua(分支tmp-libc-implementation)
我尝试使用 QEMU 运行我的 boot.bin:
qemu-system-i386 -fda boot.bin -nographic -serial stdio -monitor none
但是会发生崩溃:
> qemu-system-i386 -fda ./deploy/boot.bin -nographic -serial stdio -monitor none
> WARNING: Image format was not specified for './deploy/boot.bin' and probing guessed raw.
> Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
> Specify the 'raw' format explicitly to remove the restrictions.
> qemu: fatal: Trying to execute code outside RAM or …Run Code Online (Sandbox Code Playgroud) 我写了一个基本的程序集引导程序来清除屏幕并打印X:
[BITS 16]
[ORG 0x7c00]
main:
mov ax, 0x03
int 10h
mov ah, 0x0E
mov al, 'X'
int 10h
jmp $
times 510 - ($-$$) db 0
DW 0xAA55
Run Code Online (Sandbox Code Playgroud)
现在我需要做的是在硬盘上创建一个文件。我知道我可以使用以下代码通过 DOS 中断轻松完成:
outputfile db "myfile.txt"
outhandle db ?
mov dx, offset outputfile
mov cx, 0
mov ah, 3Ch
int 21h
mov outhandle, ax
Run Code Online (Sandbox Code Playgroud)
但是我没有找到有关使用 BIOS 中断进行文件操作的任何信息。
这可能吗?
自己写MBR的时候,需要告诉nasm用16bit汇编,不知道为什么2020年一定要用16bit汇编来写bootloader。
为什么我们不能用现代 x64 程序集开发引导加载程序?
我正在编写一个 bootsector 游戏,它试图复制没有互联网时可以玩的 chrome 恐龙游戏。
为此,我必须从左向右跑,直到玩家击中仙人掌。
我如何实现这一目标?(如何使终端从右向左滚动,使其看起来像是在移动?)因此,我需要从右向左和从左向右滚动,而不是向上和向下滚动。我在 16 位实模式 (BIOS),我使用 nasm/intel 语法。
我正在尝试将引导加载程序写入插入 VirtualBox VM 的虚拟软盘驱动器。这是我拥有的以下代码:
org 0x7c00 ; We are loaded by BIOS at 0x7C00
bits 16 ; We are still in 16 bit Real Mode
Start: jmp loader
loader:
.Reset:
mov ah, 0x0 ; reset floppy disk function
mov dl, 0x0 ; drive 0 is floppy drive
int 0x13 ; call BIOS
jc .Reset ; If Carry Flag (CF) is set, there was an error. Try resetting again
.Load:
mov ax, 0x07e0 ; we are going to read sector to …Run Code Online (Sandbox Code Playgroud) 我已经进入了汇编操作系统开发,目前我正在设置一个两阶段引导加载程序。我已经设置了第一阶段,但是当我重置磁盘并读取第二个扇区时,我在屏幕上看到了一堆乱码。当我尝试调用应该在 加载的代码时0x1000,没有任何反应(据我所知)。我试图找到解决方案,但我发现的解决方案似乎都不起作用,而且我的运气越来越差。这是我的完整代码:
BITS 16
start:
mov ax, 07C0h
add ax, 288
mov ss, ax
mov sp, 4096
mov ax, 07C0h
mov ds, ax
call reset
call read_sector
jmp sector
text_string db "hello, world!", 0
sector equ 1000h
reset:
mov ah, 00h
mov dl, 00h
int 13h
read_sector:
; 1000h (used to be 07E0h, but changed as I realized that I probably needed to accomodate more space for the bootloader)
mov ax, sector
mov es, ax
mov ah, 02h …Run Code Online (Sandbox Code Playgroud)