欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOC文档下载  

    U-boot优化是嵌入式Linux启动优化中最重要的一环.doc

    • 资源ID:3274381       资源大小:22.50KB        全文页数:4页
    • 资源格式: DOC        下载积分:2
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要2
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    U-boot优化是嵌入式Linux启动优化中最重要的一环.doc

    U-boot优化是嵌入式Linux启动优化中最重要的一环既然不能使用新的U-boot,那就优化一点是一点,慢慢干吧。1.去掉启动时的按键等待U-boot 启动的时候出现一个 Hit any key to stop autoboot 不爽,干吗要停上1秒?虽然可以通过设置参数bootdelay=0来关掉这个延时,但这样做了以后就再也进不去U-boot了,更烦。检查代码,发现是在main.c函数int abortboot(int bootdelay)来干这个活的,好吧,改掉它static _inline_ int abortboot(int bootdelay)            int abort = 0;        char inputkey;    if (tstc()                     inputkey = getc();             abort = (inputkey = u);    #ifdef CONFIG_SILENT_CONSOLE       if (abort)          gd->flags #endif        return abort;   这样,就不需要等待了,如果想进入U-boot,就在上电的时候按住u吧,把它改成一个固定的键而不是任意键,因为串口线很容易受到干扰,如果是任意键的话,运行时即使不想进去有时也会进入U-boot的命令行。 2.去掉网卡的初始化每次上电,U-boot 都会初始化网卡,其实这根本不需要,把配置文件中#define CONFIG_MII   1去掉,启动时就不会初始化了,需要使用TFTP时,它会自动初始化,又节省了3.4秒的启动时间。3.智能读取OS ImageU-boot 通过nand read 来读取OS Image,通常为了避免麻烦,我们设置的读取长度要比实际OS长度长一些,多读的那部分纯粹是浪费CPU时间,能不能精确判断读取长度呢,当然可以,为了不影响系统的正常功能,扩展一个nand read.os 指令来读取,修改方法如下:在 nand_read_opTIons_t 里面添加一个成员 int is_os_img在函数 int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv)修改读操作的判断语句,添加 !strcmp(s, ".os"),然后设置opts.is_os_img = !strcmp(s, ".os");大概修改后结果参考第7步代码。    最后,在函数int nand_read_opts(nand_info_t *meminfo, const nand_read_opTIons_t *opts)中修改代码,检测如果opts->is_os_img = 1 并且是第一次读取(2024B)之后,检查度取得结果是否是OS Image,如果是更新需要读取的长度,否则,也不需要再往下读了,直接返回错误就可以了嵌入式Linux启动优化手记2 U-boot优化                image_header_t  *hdr = (image_header_t *)buffer;                     if (image_check_magic(hdr) /+ image_get_header_size();                    imglen = ossz + + image_get_header_size();                    printf("# Find valid OS image, at 0x%x, Size: %d Bytes = %d KBn",                           (unsigned int)mtdoffset, ossz, ossz/1024);                                else                                    printf("Invalid OS image at 0x%xn", (unsigned int)mtdoffset);                    return -1;                4.去掉OS Image 内存复制过程使用 nand read 读取OS Image 后,U-boot 使用 bootm 指令来启动Linux,检查其实现代码int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv)发现他会把已经读取到内存中的OS Image 在复制到一个指定的位置,OS Image 中的头部参数,这个值一般是固定的,本系统使用的是 0x70008000, 如果在 nand read 时读到的内存位置恰好合适,就可以省掉这些毫秒数了,做法如下:nand read.os 0x70007FC0 0x100000 0x500000(其中 0x70007FC0 = 0x70008000 - sizeof(sizeof(image_header_t)然后在内存复制的地方(函数do_bootm中),加入修改,跳过内存复制    switch (comp)     case IH_COMP_NONE:        if (load_start = (ulong)os_hdr)             printf ("   XIP %s . ", type_name);        else             if (load_start != os_data)/位置不匹配,依然移动,否则就跳过此部                            printf ("   Loading %s . ", type_name);                memmove_wd (void *)load_start, (void *)os_data, os_len, CHUNKSZ);                puts("OKn");                            load_end = load_start + os_len;对于我们的Kernel,修改后大小是1.4M,省去这个搬移过程,节省了大约800ms的时间5.减少内存初始化的时间在U-boot 初始化时,在 start_armboot 函数中,多次使用到了 memset函数,其中最耗时的是在mem_malloc_init函数中调用memset 初始化 512K内存的调用,检查U-boot 1.3.4对memset的实现,发现是最简单的字节复制,把它改为按32bits复制的方式,这些memset 调用所花费的时间立即从202ms减少到了45ms修改方法,再 string.c 中,找到memset函数,修改其实现(代码是从U-boot 2011.12 中复制过来的嵌入式Linux启动优化手记2 U-boot优化)void * memset(void * s,int c,size_t count)            unsigned long *sl = (unsigned long *) s;        unsigned long cl = 0;        char *s8;        int i;          if ( (ulong)s i = sizeof(*sl)                 *sl+ = cl;                count -= sizeof(*sl);                               s8 = (char *)sl;        while (count-)            *s8+ = c;        return s;    6.减少NAND初始化时间    每次 U-boot 启动,发现NAND初始化需要大约3秒的时间,仔细追踪发现,在nand_base.c文件中nand_scan函数的最后一步return this->scan_bbt (mtd);最花费时间,这个scan_bbt扫描整个NAND并检查坏块,重建坏块表,在启动过程中,这个耗时的操作毫无意义,去掉这一步,让nand_scan 函数直接返回0就可以了。7.添加Yaffs2支持从网上各位前辈的论述中,都发现YAFFS比JFFS2要快,也决定测试一下,从YAFFS网站下载最新的代码,按照说明加入到Linux 中,重新编译内核,让内核支持YAFFS2(按照默认的选项就可以了),弄一个空的分区,格式化成YAFFS2格式,感觉的确比较快,把ROOTFS复制到这个分区,然后修改Linux启动参数让它把YAFFS2分区当作根分区启动,发现果然快了不少,初始化和挂载根分区仅需要370ms,比JFFS2的速度快多了,决定就采用YAFFS2作为根文件系统了。自己在u-boot中添加对yaffs2 image的支持说起来容易,真正做起来还是很麻烦的,总是不能把yaffs2的image 烧写成功,不知道是Image不正确还是Uboot没改对,折腾了几天也没搞定,最后终于发现了一个第三方的工具http:/code.google/p/yaffs2uTIls/下载,编译,制作Image,验证,OK,把新工具生成的IMAGE与YAFFS2自带的工具对照,发现YAFFS2自带的工具生成的IMAGE不正确,晕死。重新修改UBoot,改了很少一部份代码,就可以了。依然是在函数do_nand中修改,添加一个扩展 nand write.y 指令来写入Image:按照惯例,YAFFS2的第一个块不使用,留给文件系统自己使用,在 nand_write_opTIons_t 里面添加一个成员 int skip_first_block;在函数 int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv)修改读写操作的判断语句,添加 !strcmp(s, ".y"),然后设置opts.is_os_img = !strcmp(s, ".os");大概修改后结果如下(红色部分)    s = strchr(cmd, .);        if (s != NULL                 memset(                opts.buffer    = (u_char*) addr;                opts.length    = size;                opts.offset    = off;                opts.readoob = 0;/remove this function.                opts.is_os_img = !strcmp(s, ".os");                opts.quiet      = quiet;                ret = nand_read_opts(nand,                 /printf("call nand_read_opts buffer %lu len %lu offset %d off, ret %dn", addr, size, off, ret);            else                                nand_write_options_t opts;                memset(                opts.buffer    = (u_char*) addr;                opts.length    = size;                opts.offset    = off;                               if (!strcmp(s, ".y")                                    opts.pad    = 0;                    opts.writeoob = 1;                                     /opts.noecc = 1;                    opts.skip_first_block = 1;                    opts.autoplace = 1;                                else                                      opts.pad    = 1;                                opts.blockalign = 1;                                 opts.quiet      = quiet;                ret = nand_write_opts(nand,                     else if (s != NULL       .      while (imglen > 0)                     if (yaffs_skip_first)                                 yaffs_skip_first = 0;                   mtdoffset += erasesize_blockalign;                   continue;                          readlen = meminfo->oobblock;               if (opts->pad ">请看下篇嵌入式Linux启动优化手记2 U-boot优化 

    注意事项

    本文(U-boot优化是嵌入式Linux启动优化中最重要的一环.doc)为本站会员(白大夫)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开