我有一个Luminary LM3s8962 ARM Cortex M3开发板,虽然我已经能够使用Keil RTOS为它编程,但我更喜欢在linux和嵌入式libc之上开发.我想知道的是我如何在我的主板上实际获得Linux内核以及我的应用程序和依赖项?它有一个SD插槽,我可以创建某种文件系统映像,只需用引导程序对电路板进行编程吗?我是否必须自己编写引导程序?我完全不知道从哪里开始.我已经查看了yocto项目,但我仍然不知道如何实际处理多兆字节内核和文件系统映像文件并让我的主板运行它们.
最近我开始研究嵌入式系统和嵌入式Linux.我知道在嵌入式系统中,操作系统存储在Flash或ROM中.当它打开时,引导加载程序将操作系统加载到主存储器中,而使用Raspberry Pi,"flash或ROM"是SD卡.
所以,我正在寻找Raspberry Pi因为我想开始练习一个,而且我对"引导"Raspberry Pi的概念感到困惑.我的问题是Raspberry Pi使用的bootloader是什么以及它是如何工作的?(也就是说,内核之前发生怎样的过程?head.o?main.c?(启动内核))
我想在启动阶段使用grub boot-loader加载共享库(闭源二进制用户空间库).有没有机会,或者我必须编写一个自定义精灵装载程序(grub模块)来执行此操作?
我实际上对操作系统的工作原理感兴趣,从POST过程到POST过程,再到内核,GUI等.
好吧,我必须从头开始:bootsector
大多数教程仅指定如何将.bin引导程序安装到Linux用户的USB记忆棒上.
但是当我使用XP时,我想问一下如何将我的512字节.bin放到USB上的正确位置,这绝对不是通过使用资源管理器复制它:D
我编写了简单的第一阶段bootloader,它使用对bios的中断显示"Hello world".现在作为编写第二阶段的下一个明显步骤,但是应该存在的代码以及如何从第一阶段加载它?
这是第一阶段的计划
[BITS 16] ;Tells the assembler that its a 16 bit code
[ORG 0x7C00] ;Origin, tell the assembler that where the code will
;be in memory after it is been loaded
MOV SI, HelloString ;Store string pointer to SI
CALL PrintString ;Call print string procedure
JMP $ ;Infinite loop, hang it here.
PrintCharacter: ;Procedure to print character on screen
;Assume that ASCII value is in register AL
MOV AH, 0x0E ;Tell BIOS that we need to print one …Run Code Online (Sandbox Code Playgroud) 我有兴趣为USB记忆棒编写一个启动加载程序,用于查找ISO目录,并为您提供启动其中一个的选项,就像它是可引导CD一样.这基本上是这样我有一个菜单驱动的程序,允许我从USB记忆棒安装几个不同的发行版之一.
我将在哪里弄清楚如何使这项工作?我是否需要安装某种BIOS黑客以允许将CD块重新映射到文件系统中的块?一旦从CD启动有足够的弹珠开始尝试直接访问设备,它将如何工作?
我在debian squeeze/stable下用gcc4.5 创建了我的bootloader 2年.现在在debian wheezy/sid中无法使用4.6和4.7进行编译,因为从这些中创建更大的部分我希望手工生成最终的二进制文件.这对我来说不是问题,因为在debian wheezy/sid中gcc4.5仍然存在,但我想使用gcc4.6和4.7 编译成为可能.
我像这样生成最终的二进制文件:
源文件编译为:
gcc-4.5 -Wall -O3 -c -m32 -I. -o assemblybin-objects/vga_pm.S.o vga_pm.S
Run Code Online (Sandbox Code Playgroud)
与连接:
ld -nostdlib -T binary.ld assemblybin-objects/vga_pm.S.o ... and other objects here ... -o bootloader.bin
Run Code Online (Sandbox Code Playgroud)
的内容binary.ld是:
OUTPUT_FORMAT("binary","binary","binary")
OUTPUT_ARCH(i386)
SECTIONS
{
. = 0;
.bootloader : {
. = 0x600;
*(.bootstrap);
. = 0x7fa;
BYTE(0x11);
BYTE(0x33);
BYTE(0x55);
BYTE(0x77);
BYTE(0x55);
BYTE(0xaa);
_bootstrap_end = .;
. = 0x800;
*(.sysinit);
_sysinit_end = .;
. = 0x1000;
*(.pages);
_pages_end = …Run Code Online (Sandbox Code Playgroud) 引导加载程序与引导加载程序的不同之处.根据我的说法,引导程序存储在ROM中,引导加载程序在MBR的硬盘中(如果我错了,请纠正我).bootstrap loader是第一个在启动后执行的程序.现在我没有得到这些句子的含义: - 上电 后,引导程序控制板,并且不依赖于linux内核. 和 引导加载程序的行为作为引导程序和Linux内核之间的粘合. 这些意味着什么?为什么我们需要他们两个?
我试图开发利用的bootloader 这个,但是当它时,它会显示:
disk read error!
Run Code Online (Sandbox Code Playgroud)
如果我忽略它,在后面的部分,它会显示我错误的内存映射.我也跟着其他一些消息来源但是徒劳无功.感觉就像我只是在复制他们正在做的事情.如果我做的甚至有点不同,每次都会产生一种新的错误.
我应该使用已经构建的引导加载程序还是该怎么做?
磁盘加载错误代码如下:
[org 0x7c00]
KERNEL_OFFSET equ 0x1000
mov [BOOT_DRIVE], dl
mov bp, 0x9000
mov sp, bp
mov bx, MSG_REAL_MODE
call print_string
call load_kernel
jmp $
print_string:
pusha
mov ah, 0x0e
loop:
mov al,[bx]
cmp al, 0
je return
int 0x10
inc bx
jmp loop
return:
popa
ret
disk_load:
push dx
mov ah, 0x02
mov al, dh
mov ch, 0x00
mov dh, 0x00
mov cl, 0x02
int 0x13
jc disk_error
pop dx
cmp dh, …Run Code Online (Sandbox Code Playgroud) 我正在研究UEFI这个术语时的引导加载程序.我可以理解一些关于UEFI的事情.但是,在什么模式下(Real,Protected,Long),UEFI的系统启动了吗?如果正常的引导加载程序无法使用UEFI,那么在处理UEFI时,引导加载程序的替代方案是什么?我是否需要任何其他编程来创建一个,而不是组装?