我设置了Kamikaze工具链(来自openwrt),并为AMCC PPC405ex kilauea参考板编译了Linux 2.6.30.x内核.但是,出于某种原因,我在uBoot中做错了,因为我无法从squashfs图像运行内核.图像在tftp上加载正常并解压缩,但控制台输出无法启动.
我没有更改Linux内核命令行,它看起来很好(console=ttyS0,115200 root=/dev/mtdblock).我也有点困惑uboot中的fdt是什么?
我不完全确定它是否真的属于stackoverflow,但是这又不是一个真正的superuser.com问题(因为这与开发环境有关,它肯定是编程相关的,即使不是一个编程问题)
我一直在研究这个网页上的教程,逐步创建一个显示Hello World的引导程序.
第二个教程(我们试图得到一个"A"输出)工作得很好,但是第一个教程对我来说根本不起作用!(BIOS完全忽略了软盘并直接启动进入Windows).这不是一个问题,虽然任何解释都会受到赞赏.
真正的问题是我无法让第3个教程工作.而不是输出"Hello World",我在屏幕的左下角得到一个不寻常的字符(和闪烁的光标).它看起来有点像圆角矩形内的笑脸.有谁知道如何让Hello World显示它应该?
我从osdev下载了几个bootloader并成功加载了一个内核.但现在我想学习bootloader背后的理论.我想知道为什么系统启动以及引导程序代码后面的所有内容.任何人都可以给我一个链接或链接到一本书吗?提前致谢.系统是x86.
**请注意,当我说启动程序时,我并不是指启动操作系统的程序.我的意思是,一个简单的程序,当你启动计算机并执行某些操作时运行.
好吧,所以我不是非常精通Assembly/NASM,但我认为我已经掌握了很好的编写简单启动程序.
好吧,我以为我有足够的把握.显然不是.
我尝试了一个在网上找到的简单启动程序.它运行良好(打印字母'A').然后我修改它以打印存储在内存中的字母.它失败了; 而不是打印'A',它打印出一个笑脸.(我发誓,电脑现在正嘲笑我.)
这是源文件中的代码:
[BITS 16] ; We start up in 16-bit real mode
[ORG 0x7C00] ; We're booted into memory at this address. (Or so I'm told)
mov ah, 0x0E ; Teletype command
mov bh, 0x00 ; Page number
mov bl, 0x07 ; Attributes (7 == white foreground, black background)
mov al, [testChar] ; Character to print; load it from the memory referenced by testChar.
int 0x10 ; Tell the BIOS to execute …Run Code Online (Sandbox Code Playgroud) 我对这两个文件的启动配置非常困惑.他们似乎在做同样的事情,我不明白为什么我需要或者.
如果我使用uEnv.txt,我将其设置为
bootargs=console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10 ${extra}
aload_script=fatload mmc 0 0x43000000 script.bin;
aload_kernle=fatload mmc 0 0x48000000 uImage; bootm 0x43000000 - 0x48000000;
uenvcmd=setenv run aload_script aload_kernel
Run Code Online (Sandbox Code Playgroud)
或者,我可以创建boot.cmd:
setenv bootargs console=console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10 ${extra}
fatload mmc 0 0x43000000 script.bin
fatload mmc 0 0x48000000 uImage
bootm 0x48000000
Run Code Online (Sandbox Code Playgroud)
他们都工作......
作为学习练习,我为x86 bios系统编写了一个16位的引导程序。它在QEMU上似乎运行良好。我将其添加到用于旧式amd-turion计算机(x86_64)的驱动器上,当我尝试引导该计算机时,它将进入BIOS屏幕,然后黑屏上的光标闪烁。
我的问题是,QEMU的x86仿真器和绝对使用BIOS而不是UEFI的真实x86(64位)计算机之间可能有什么区别?我是否需要针对实际计算机而不是QEMU编写代码?是我将信息复制到驱动器的方式吗?计算机是否采用了某些硬件级别的安全性规定?
我知道它在VirtualBox上也不起作用。
看来加载第二阶段是有问题的(通过在真实硬件上成功地打印第一阶段的字符)。
我的第一阶段引导程序使用以下文件中的代码:
stage_one.asm
[bits 16]
[org 0x7c00]
LOAD_ADDR: equ 0x9000 ; This is where I'm loading the 2nd stage in RAM.
start:
xor ax, ax ; nullify ax so we can set
mov ds, ax ; ds to 0
mov sp, bp ; relatively out of the way
mov bp, 0x8000 ; set up the stack
call disk_load ; load the new instructions
; at …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写自己的bootloader.虽然它在QEMU,Bochs和VirtualBox中运行良好,但我似乎无法在笔记本电脑上运行.
在我的笔记本电脑上,引导加载程序与所有模拟器的行为完全不同,挂起看似随机的地方,拒绝打印,甚至跳过一些jmp $指令.
虽然我对"真实硬件"有很多麻烦,但我认为它们都有一个原因.
以下代码是一个短引导加载程序,应该打印"TEST"消息3次,然后跳转到同一位置挂起:
[BITS 16]
[ORG 0x7C00]
jmp 0x0000:start_16 ; In case bootloader is at 0x07C0:0x0000
start_16:
xor ax, ax
mov ds, ax
mov es, ax
cli ; Disable interrupts
mov ss, ax
mov sp, 0x7C00
sti ; Enable interrupts
cld ; Clear Direction Flag
; Store the drive number
mov [drive_number], dl
; Print message(s)
mov si, msg
call print_string
mov si, msg
call print_string
mov si, msg
call print_string
jmp $ ; HALT
; …Run Code Online (Sandbox Code Playgroud) 我看到我的android映像出现问题,该命令adb reboot bootloader只是将命令重新引导回android,而不是进入bootloader模式。
为了解决该问题,我进行了一些研究,发现有两件事,adb并且adbd主机和目标设备通过套接字使用TCP协议进行通信。
因此,有趣的是诸如adb shell和adb devices正在运行的命令,而不是reboot bootloader。我想了解adbd收到什么reboot bootloader。它会更改无秩序,设置一些标志,更改EFI变量...吗?
您能否指出一些好的链接或分享的理解?
PS:我正在开发嵌入式设备环境,类似于树莓派...
我在asm中编写了一个引导加载程序,并希望在我的项目中添加一些已编译的C代码.
我在这里创建了一个测试函数:
test.c的
__asm__(".code16\n");
void print_str() {
__asm__ __volatile__("mov $'A' , %al\n");
__asm__ __volatile__("mov $0x0e, %ah\n");
__asm__ __volatile__("int $0x10\n");
}
Run Code Online (Sandbox Code Playgroud)
这是asm代码(引导加载程序):
hw.asm
[org 0x7C00]
[BITS 16]
[extern print_str] ;nasm tip
start:
mov ax, 0
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7C00
mov si, name
call print_string
mov al, ' '
int 10h
mov si, version
call print_string
mov si, line_return
call print_string
call print_str ;call function
mov si, welcome
call print_string
jmp mainloop
mainloop:
mov …Run Code Online (Sandbox Code Playgroud)