jffs2文件系统上mmap函数

来源:互联网 发布:php获取页面代码方法 编辑:程序博客网 时间:2024/06/06 17:37
问题描述:
    在数码相框项目中,板子用NFS网络文件系统启动时,可以正常运行应用程序。
    将文件系统做成JFFS2文件映像后,再运行应用程序,则出现问题,问题函数为mmap,返回错误代码EINVAL(通过打印errno ,它是记录系统的最后一次错误代码),即非法参数),感觉既然在网络文件系统中参数没问题,在jffs2中也会没问题吧。
尝试解决问题发现:
    1.mmap函数中如果文件描述符参数为nandflash上的文件时候,是会失败的(但是可以fopen成功)。
    2.mmap函数中如果文件描述符参数为网络文件系统上的文件的时候,则没有任何问题。(挂载SD卡后,mmap里面的文件也没有问题)
可能的出错点:
    1.制作jffs2的工具有问题,但是这个工具是用的老师的ubuntu系统里面的现成的,并且制作jffs2的指令也不会出错的(sudo mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_new -o digitpic.jffs2),我用过yffas2文件系统也是会出现问题,但是问题又不一样了,直接出现段错误。


原因找出来了: linux系统调用mmap在映射一个文件时只有使用MAP_SHEARED参数才会将映射内存的修改写回文件,但是jffs2文件系统却不支持有写回的映射,即MAP_SHARED参数不能使用,只能使用MAP_PRIVATE进行映射。
在数码相框代码中有3处用到mmap,分别是fb.c file.c和gbk.c 第一个fb.c中,将/dev/fb0文件映射到内存,这里必须使用MAP_SHEARED参数,不然显示屏无反应,第二个和第三个因为jffs2文件系统的特性,需要使用MAP_PRIVATE参数,不然无法完成映射,两者的区别在与后一个是实际存在于nand的文件,前一个则是系统启动后生成的一个文件。
不知道上诉的分析有没有错误,反正最后结果是成功了,如果有说错的,希望大牛留言。

所以说,还是得相信linux系统返回的错误代码 0.0.

0 0
原创粉丝点击