嵌入式Linux论坛问题精选以及解决方法
天韦东山老师花了半天时间在交流社区答疑,这不小编马上送来热腾腾的9个问题以及解决方法,答案全部出自韦老师一人之手,全是精华。可能只有区区20字,但里面包含了珍贵的经验和情怀。对了,之前发的问题对你有启发吗,或者正好解决了你问题?麻烦给我们反馈一下,还有,只有论坛版主以上级别才能更改问题状态,我们回答问题,问你是否解决,等回复,假设解决了,我们更改问题状态,这样一来一去,沟通成本太大,希望你的问题被回复后能及时通过帖子反馈结果给我们。方便我们及时更改问题状态,给遇到类似相关问题者更好的参考。
1、u-boot烧写根文件系统超出了分区大小咋办?
##### 100ask Bootloader for OpenJTAG #####
[n] Download u-boot to Nand Flash
[o] Download u-boot to Nor Flash
[k] Download Linux kernel uImage
[j] Download root_jffs2 image
[y] Download root_yaffs image
[d] Download to SDRAM & Run
[z] Download zImage into RAM
[g] Boot linux from RAM
[f] Format the Nand Flash
[s] Set the boot parameters
[b] Boot the system
[r] Reboot u-boot
[q] Quit from menu
Enter your selection: y
USB host is connected. Waiting a download.
Length of file is too big : 88564608 > 66183036
NAND erase: device 0 offset 0x260000, size 0xfda0000
答: Length of file is too big : 88564608 > 66183036
这个文件系统并没有超过分区,只是超过了内存大小。
因为我们的UBOOT是先把文件系统下载到内存,再烧写的。
对于这种情况,只有这样:
1.使用NFS启动
2.擦除root分区(当然可以在UBOOT里先擦除ROOT分区)
3.mount -t yaffs /dev/mtdblock3 /mnt
4. 把文件复制到 /mnt上:
a. 事先把根文件系统放在NFS里某个目录,比如mydir里,
b. 执行:cd mydir; cp * -rfd /mnt
注意,必须加-rfd,其中的d表示原来的链接文件继续作为链接文件,不加d的话链接文件就会作为实体文件复制了,占空间太大
2、fops_get与fops_put怎么理解?
答: 内核源码有段:
#define fops_get(fops) \
(((fops) && try_module_get((fops)->owner) ? (fops) : NULL))
#define fops_put(fops) \
do { if (fops) module_put((fops)->owner); } while(0)
一看即知,
fops_get: 如果fops存在,先增加它的使用计数,再返回。
fops_put: 如果fops存在,减小它的使用计数。
3、两次设置堆栈,C语言初始化SDRAM拷贝程序失败了
启动文件:
initSDRAM和copyToSDRAM函数:
main.c:
答:
思路没问题,
第1次设置sp弄错了,NOR启动时,片内内存从0x40000000开始,所以应该这样:
ldr sp, =1024*4
改为:
ldr sp, =1024*4 + 0x40000000
4、不知道为什么开发板启动突然出现这个问题:
答:
贴出烧写内核时的串口信息,这样才能确定问题。
肯定是烧写出了问题:要么没烧成功,要么是uImage超过2M了
5、busybox1.7.0制作yaffs2重启时,出现:
答:
修改busybox下的 .config,添加这2行:
CONFIG_ASH=y
CONFIG_ASH_BASH_COMPAT=y
6、指针和数组的问题
volatile unsigned long*p=(volatile unsigned long *)0x48000000;
不是应该是p=mem_cfg_val[i];
p++;吗
怎么MMU那课讲的是p[i]=mem_cfg_val[i];
答:p=mem_cfg_val[i]; 是错的;
volatile unsigned long*p
p = val ? 必错
应该是 *p = val; 或 p[0] = val
7、想玩一下JZ2440 pwm控制舵机但是找不到引脚
答: JZ2440没引出PWM引脚
8、jz2440怎样挂载SD卡?
512MB的SD卡,插入开发板后用fdisk -l 命令没有东西显示出来,提示如下:
# s3c2440-sdi s3c2440-sdi: running at 0kHz (requested: 0kHz).
s3c2440-sdi s3c2440-sdi: running at 196kHz (requested: 195kHz).
s3c2440-sdi s3c2440-sdi: running at 196kHz (requested: 195kHz).
s3c2440-sdi s3c2440-sdi: running at 196kHz (requested: 195kHz).
s3c2440-sdi s3c2440-sdi: running at 196kHz (requested: 195kHz).
s3c2440-sdi s3c2440-sdi: running at 196kHz (requested: 195kHz).
s3c2440-sdi s3c2440-sdi: running at 196kHz (requested: 195kHz).
s3c2440-sdi s3c2440-sdi: running at 196kHz (requested: 195kHz).
s3c2440-sdi s3c2440-sdi: running at 25000kHz (requested: 25000kHz).
s3c2440-sdi s3c2440-sdi: running at 25000kHz (requested: 25000kHz).
mmcblk0: mmc0:59b4 NCard 7851008KiB
mmcblk0:<7>mmc0: starting CMD18 arg 00000000 flags 00000035
p1
# mount mmc0 mnt/usb/
mount: mounting mmc0 on mnt/usb/ failed: No such file or directory
答:
mount -tvfat /dev/mmcblk0p1 /mnt
UBIFS 根文件系统制作
1. UBIFS 文件系统简介
传统的flash文件系统如jffs2, yaffs2等是工作在MTD 设备上,而UBIFS则建立在UBI卷层之上,UBI卷层工作在MTD设备层之上,也可以说,UBIFS涉及三个子系统:
MTD 子系统,提供对flash芯片Raw的访问接口。MTD子系统提供了MTD device的概念,比如/dev/mtdX(字符设备)和/dev/mtdblockX(块设备);l UBI Subsystem, 它工作在MTD设备之上,提供了UBI逻辑卷,对上层屏蔽了一些直接使用MTD设备需要处理的问题,如wear-leveling(磨损平衡)和volume management(坏块管理)功能等;l UBIFS 文件系统,工作于UBI之上。它提供文件的open, read, write等操作;系统之间的层级关系
2.根文件系统镜像文件制作
l mkfs.ubifs 参数说明-x lzo 指定使用lzo压缩方法,默认是lzo, 还支持zlib, zlib的压缩率高,但是lzo压缩解压速度快。
-m 2048 Nand Flash的最小读写单元,一般为page size.
-r ./rootfs 指定根文件系统目录树的路径
-o rootfs.ubifs 指定制作出的根文件系统镜像文件名
-e 126976 指定LEB(Logical Erase Block, 逻辑擦除块)大小。Nandflash 读写单位为页,擦除单位为块,以ESMT F59L1G81MB 为例:一个PEB(Physical EraseBlockSize, 物理擦除块)大小就是2048*64=131072,-e 的算法是物理擦除块大小-2*页大小,这里就是131072-2*2048=126976(注:这里的擦除块大小都不包含oob, 有包含子页和不包含子页之分。 )
-c xxx 指定该分区最大逻辑擦除块数量,该值随着根文件系统分区的大小和该分区的坏块数调整。
l ubinize 参数说明-o rootfs-ubifs.bin 指定ubinize处理后输出的image文件名,该文件可以由u-boot的nand write命令直接烧录;
-m 2048 指定minimum input/output unit 大小,为Nandflash的页大小;
-p 131072 指定物理擦除块大小:64 Pages * 2048 Byte/Page = 131072(不包含oob的大小)
-s 512/2048 指定sub-page-szie大小,如果有sub-page, 则配置为512;如果没有sub-page,则配置为2048
n 关于配置文件说明:image=rootfs-ubifs.img 指定mkfs.ubifs 制作成的根文件系统镜像文件路径;
vol_id=0 指定根文件系统树的卷标为0,u-boot的bootargs参数需要根据它来设置;
vol_size=xxx 指定该UBI逻辑卷的大小,该值计算公式一般为 逻辑擦除块大小*逻辑擦除块个数。该值一般不用写,默认值是image大小。写了这个作用是帮助检查image是否超过了分区限制,制作时候就会提示,否则mount会出错。逻辑擦除块个数的值是经过计算的最大值(前面mkfs.ubifs -c 指定的值),不过volume flag autoresize 参数会自适应大小,不会浪费空间,后面Linux 系统内核启动过程中可以看到这个现象。
vol_type=dynamic
vol_name=xxx 指定UBI Volume的名称,u-boot的bootargs参数需要根据它来设置;
vol_flags=autoresize UBI Subsystem 在系统启动时自动调整逻辑擦除块的个数;
经过ubinize 命令处理过后的根文件系统镜像rootfs-ubifs.bin就可以直接在u-boot使用
nand write 命令烧录到相应的根文件系统分区上去了。
关于Minim Flash input/output, sub-pages, UBI Header的说明:http://www.linux-mtd.infradead.org/doc/ubi.html#L_min_io_unit
相关问答
u-boot 是什么?DasU-Boot是一个主要用于嵌入式系统的引导加载程序,可以支持多种不同的计算机系统结构,包括PPC、ARM、AVR32、MIPS、x86、68k、Nios与MicroBlaze。这也是一...
惠普笔记本出现BOOTMGR IS MISSIM-ZOL问答这个问题是因为在windows7下将C盘设置为活动分区导致,C盘设置为活动分区后原win7下100MB的空间变为非活动分区,导致系统启动时候,无法在C盘下找到相应的引导文件...
uboot 由哪四个部分组成?1.U-Boot由四个部分组成。2.首先是启动阶段的SPL(SecondaryProgramLoader),它是一个小型的引导程序,负责初始化硬件和加载U-Boot。其次是U-Boot的主体...
【 BOOT 怎么读?最好用拼音帮我拼下.写汉字也可以】作业帮[最佳回答]BOOTboot[简明英汉词典][bu:t]n.1长统靴,高统鞋2后备箱,行李箱3踢vt.踢boot[英汉体育词典]1双层高山靴2潜水靴3球鞋4保护罩5护腿6...
BIOS中的UEFI Boot 什么意思-ZOL问答9人讨论5408次围观关注问题写回答讨论回答(9)Z_XShan你好,现在很多主板已经不是以前的BIOS启动,已经换成UEFI启动,这个是适应新主板的启动方式。UEFI版PE...
boot 这样双o的单词发音有什么规则?两个oo一般发长音的u:,就行book,look是一样的。两个oo一般发长音的u:,就行book,look是一样的。
uboot 启动时在nor 还是在内存?U-Boot启动时通常从Nor闪存中加载到内存中运行,因为Nor闪存具有快速读取和执行代码的能力,能够快速启动系统。在Nor闪存中存储的U-Boot二进制代码可以被CPU通...
在元音中 |U|和|u|都对应的有oo和ou 在什么情况下发音|U|或...哦~字母组合oo多数读长音,少数读短音可以参考下这个口诀oo发[u:]最常见,非重音中要短念。字母k前不能长,好脚站木羊毛短。血与水灾真特殊,oo读...
我的电脑出现BOOTMGR is missing并且不可以进Bios和不能U盘...设置光驱启动,把VISTA安装盘放入光驱,按提示修复电脑即可具体步骤参见:www.mydigitallife.info/2007/08/23/bootmgr-is-missing-during-v...
几个英语单词的区别other,others,theothers,another之间的区...[回答]1辨与析]theother,another,others,theotherstheother意为thesecondofthetwo,指两者中的另一个,系特指,常与one连用.例如:...