搜索
bottom↓
回复: 10

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

[复制链接]

出0入0汤圆

发表于 2008-6-17 10:17:29 | 显示全部楼层 |阅读模式
硬件标准: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处即可。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2008-6-17 10:19:32 | 显示全部楼层
能不能直接把linux烧到flash启动地址呢,直接不要uboot

不过我还觉得uboot蛮好用的

出0入0汤圆

 楼主| 发表于 2008-6-17 10:22:36 | 显示全部楼层
回1楼,因为LINUX不是从0地址开始执行,而且为了更好的执行速度,LINUX一般会放到SDRAM中执行,所以肯定需要复制代码和地址跳转。

出0入0汤圆

发表于 2008-6-17 10:25:51 | 显示全部楼层
嘿嘿我们正在搞9261的,就是这个思想

出0入0汤圆

发表于 2008-6-17 10:47:19 | 显示全部楼层
那就是uboot的复制代码到sdram的功能还是必须的,对吧

出0入0汤圆

 楼主| 发表于 2008-6-17 11:06:54 | 显示全部楼层
此中boot与UBoot是两个不同的东西,UBoot还需要boot来进行引导,我是通过修改boot,不需要UBoot,在boot中完成代码复制,指令跳转。

出0入0汤圆

发表于 2008-6-17 14:11:52 | 显示全部楼层
那就是不用uboot用bootload吧?

出0入54汤圆

发表于 2008-6-17 14:16:12 | 显示全部楼层
没有u-boot,程序内核怎么弄进FLASH去啊?

出0入0汤圆

发表于 2008-6-17 14:20:04 | 显示全部楼层
可以用JTAG直接烧写FLASH吧?

出0入0汤圆

发表于 2008-6-17 16:22:56 | 显示全部楼层
很好,很强大

出0入0汤圆

发表于 2009-10-16 10:54:54 | 显示全部楼层
看图片,LZ也快40了,还这么钻研技术?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 18:44

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表