517456 发表于 2008-6-17 10:17:29

Linux 爱好者之U-Boot之可有可无!

硬件标准:RM9200,16M SDRAM,4M NORFLASH
目标:为了更快启动LINUX、同时使NORFLASH空余更多空间作为以后可能的FLASH盘。
手段:更改boot,绕过UBOOT,直接启动LINUX。
UBOOT的作用是可以方便的对存储空间进行更改然后引导LINUX,但是作为一个成熟的系统,其存储空间更改的可能性很低,即便需要更改,也可以通过LINUX驱动,像对文件操作一样更改其存储空间。所以本文不适用于绕过LINUX经常更改存储空间有朋友。
修改boot下源码main.c,其内容更改如下:

extern void AT91F_DBGU_Printk(char *);
extern char _stext,_etext,_sdata,_edata;

#define BOOT_VERSION        "Boot 1.0"
unsigned int start_Kernel=0x10080000,\
size_Kernel=0xfffff,\
start_Ram=0x10180000,\
size_Ram=0x17ffff;

void boot() {
int i;
char* ptr=(char*)DST;
for(i=0;i<LEN;i++) ptr=0;
AT91F_DBGU_Printk ("Work-man\'s boot.\n\r");
/**************************************************************************/
//decompress_image(SRC,DST,LEN);
#if 0
void* memcpy(void* __dest, const void* __src, size_t __n)
{
        int i;
        char *d = (char *)__dest, *s = (char *)__src;

        for (i=0;i<__n;i++) d = s;
}
#endif
   
/*memcpy(DST,SRC,LEN);*/
AT91F_DBGU_Printk("load the Kernel.\n\r");
   memcpy(0x20008000,start_Kernel,size_Kernel);
AT91F_DBGU_Printk("load the Ramdisk.\n\r");
   memcpy(0x20a00000,start_Ram,size_Ram);

/**************************************************************************/
AT91F_DBGU_Printk("Run the LINUX.\n\r");
   asm("mov pc,%0" : : "r" (0x20008000));
};

void recover(char* s) {
for(;;);
};


其中增加定义:
unsigned int start_Kernel=0x10080000,\
size_Kernel=0xfffff,\
start_Ram=0x10180000,\
size_Ram=0x17ffff;
注释掉 /*memcpy(DST,SRC,LEN);*/
在后面追加:
AT91F_DBGU_Printk("load the Kernel.\n\r");
   memcpy(0x20008000,start_Kernel,size_Kernel);//此条语句为把start_Kernel开始的地址加载size_Kernel的长度到0x20008000处,而此处就是Linux2.6内核的引导处;

AT91F_DBGU_Printk("load the Ramdisk.\n\r");
   memcpy(0x20a00000,start_Ram,size_Ram);//此条语句为把start_Ram开始的地址加载size_Ram的长度到0x20a00000处,而此处就是RAMDISK的存储地址;
更改   asm("mov pc,%0" : : "r" (0x20008000));//原来DST改为0x20008000,此语句是跳到LINUX入口开始执行。
编译,生成boot.bin

注:作为start_Kernel、size_Kernel、start_Ram、size_Ram的内容要视具体情况而定,或是编译后使用UE找到对应数值进行更改。
start_Kernel为boot.bin长度
size_Kernel为zimage长度
start_Ram为boot.bin+zimage的长度
size_Ram为RAMDISK的长度

在XP命令行下使用copy/b boot.bin+zimage(内核)+ramdisk.gz(文件系统) FLT
注:括号内内容在使用时不能输入。
最后采用烧录工具如UBOOT或JTAG把生成文件FLT烧到FLASH的址0x10000000处即可。

laoki8888 发表于 2008-6-17 10:19:32

能不能直接把linux烧到flash启动地址呢,直接不要uboot

不过我还觉得uboot蛮好用的

517456 发表于 2008-6-17 10:22:36

回1楼,因为LINUX不是从0地址开始执行,而且为了更好的执行速度,LINUX一般会放到SDRAM中执行,所以肯定需要复制代码和地址跳转。

Embedtech 发表于 2008-6-17 10:25:51

嘿嘿我们正在搞9261的,就是这个思想

laoki8888 发表于 2008-6-17 10:47:19

那就是uboot的复制代码到sdram的功能还是必须的,对吧

517456 发表于 2008-6-17 11:06:54

此中boot与UBoot是两个不同的东西,UBoot还需要boot来进行引导,我是通过修改boot,不需要UBoot,在boot中完成代码复制,指令跳转。

laoki8888 发表于 2008-6-17 14:11:52

那就是不用uboot用bootload吧?

lusson 发表于 2008-6-17 14:16:12

没有u-boot,程序内核怎么弄进FLASH去啊?

laoki8888 发表于 2008-6-17 14:20:04

可以用JTAG直接烧写FLASH吧?

fugeone 发表于 2008-6-17 16:22:56

很好,很强大

astudent 发表于 2009-10-16 10:54:54

看图片,LZ也快40了,还这么钻研技术?
页: [1]
查看完整版本: Linux 爱好者之U-Boot之可有可无!