1 / 15
文档名称:

Linux启动过程.doc

格式:doc   大小:58KB   页数:15页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

Linux启动过程.doc

上传人:iris028 2022/7/10 文件大小:58 KB

下载得到文件列表

Linux启动过程.doc

相关文档

文档介绍

文档介绍:LINUX启动过程(代码分析)
首先,porting linux的时候要规划内存影像,如小弟的系统有64m SDRAM,
地址从0x 0800 0000 -0x0bff ffff,32m flash,地址从0x0c00 0000-0xC000100中的真正的bootloader:
bootloader 有几个文件组成,,也是唯一的一个汇编程式,其余的都是C写成的,:
_start:
ldr r1,=StackInit
ldr sp,[r1]
b main
//此处我们跳到了C代码的main函数,当C代码执行完后,还要调用
//下面的JumpToKernel0x跳到LINXU kernel运行
.equ StackInitvalue, __end_data+0x1000 // 4K __end_data在连结脚本中指定
StackInit:
.long StackInitvalue
.global JumpToKernel
JumpToKernel:
// jump to the copy code (get th
e arguments right)
mov pc, r0
.global JumpToKernel0x
// r0 = jump address
// r1-r4 = arguments to use (these get shifted)
JumpToKernel0x:
// jump to the copy code (get the arguments right)
mov r8, r0
mov r0, r1
mov r1, r2
mov r2, r3
mov r3, r4
mov pc, r8
.section "."
.section "."
下面让我们看看bootloader的c代码干了些什么。main函数比较长,让我们分段慢慢看。
int main()
{
U32 *pSource, *pDestin, count;
U8 countDown, bootOption;
U32 delayCount;
U32 fileSize, i;
char c;
char *pCmdLine;
char *pMem;
init(); //初始化FLASH控制器和CPU时钟
EUARTinit(); //串口初始化
EUARTputString("\n\nDBMX1 Linux Bootloader ver \n");
EUARTputString("Copyright (C) 2002 Motorola Ltd.\n\n");
EUARTputString((U8 *)cmdLine);
EUARTputString("\n\n");
EUARTputString("Press any key for alternate boot-up options ... ");
小弟的bootloader主要干这么几件事:init(); 初始化硬件,打印一些信息和提供一些操作选项:
0. Program bootloader image
1. Program kernel image
2. Program root-disk image
3. Download kernel and boot from RAM
4. Download kernel and boot with ver bootloader format
5. Boot a kernel
6. Boot with a different command line
也就是说,能在bootloader里选择重新下载kernel,rootdisk并写入flash,
下载的方法是用usb连接,
10m的rootdisk也就刷的一下。关于usb下载的讨论请参看先前的贴子“为arm研发平台增加usb下载接口“。
如果不选,直接回车,就开始把整个linux的内核拷贝到SDRAM中运行。
列位看官,可能有人要问,在flashloader中不是已初始化过sdram控制器了吗?怎么init(); 中还要初始化呢,各位有所不知,小弟用的是syncflash,
能直接使用sdram控制器的接口,切记:在flash中运行的代码是不能初始化连接flash的sdram控制器的,不然绝对死掉了。所以,当程式在flash中运行的时候,去初始化s