首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是什么阻止了mtd被读取?

是什么阻止了mtd被读取?
EN

Stack Overflow用户
提问于 2013-02-04 23:25:03
回答 1查看 2.2K关注 0票数 1

我有一个小程序,用来在我的嵌入式Linux平台上读取MTDs的详细信息。我遇到了大多数块无法读取的问题,我不是100%确定为什么会发生这种情况。

/dev目录的检查显示8个mtd都具有相同的权限:

代码语言:javascript
复制
# ls -al | grep "mtd*"
crwxrwxrwx    1 root     root      90,   0 Jan  1  1970 mtd0
crwxrwxrwx    1 root     root      90,   2 Jan  1  1970 mtd1
crwxrwxrwx    1 root     root      90,   4 Jan  1  1970 mtd2
...
crwxrwxrwx    1 root     root      90,  14 Jan  1  1970 mtd7

我的应用程序也是以root身份运行的:

代码语言:javascript
复制
# ls -al mtd_test
-rwxrwxrwx    1 root     root        19688 Nov 30 01:18 mtd_test

检查/proc,我可以看到8个mtd中有7个已经挂载(所以我预计mtd7无法读取)

代码语言:javascript
复制
# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00020000 00020000 "u-boot (128 kB)"
mtd1: 00020000 00020000 "u-boot Environment (128 kB)"
mtd2: 00040000 00020000 "Reserved (256 kB)"
mtd3: 00200000 00020000 "Kernel (2048 kB)"
mtd4: 00000064 00020000 "rootFS header"
mtd5: 003fff9c 00020000 "rootFS (4096 kB)"
mtd6: 00180000 00020000 "Permanent Storage (1536 KB)"

奇怪的是,只有mtd1mtd6是可以读取的,所有其他的都失败了,并显示错误"Permission denied",有人知道为什么会这样吗?

我怀疑这是我的代码,但它是这样的:

代码语言:javascript
复制
int main()
{
    mtd_info_t mtd_info;
    int count, fd;
    char devs[][15] = { {"/dev/mtd0"},{"/dev/mtdblock0"},
                        {"/dev/mtd1"},{"/dev/mtdblock1"}, 
                        {"/dev/mtd2"},{"/dev/mtdblock2"}, 
                        {"/dev/mtd3"},{"/dev/mtdblock3"}, 
                        {"/dev/mtd4"},{"/dev/mtdblock4"}, 
                        {"/dev/mtd5"},{"/dev/mtdblock5"},
                        {"/dev/mtd6"},{"/dev/mtdblock6"}, 
                        {"/dev/mtd7"},{"/dev/mtdblock7"}, };  
    for(count = 0; count < 16; count++) {
        fd = open(devs[count], O_RDWR);
        if(fd > 0) {
            ioctl(fd, MEMGETINFO, &mtd_info);
            printf("For dev: %s\nMTD Type: %u\nMTD total size: %u bytes\nMTD erase size: %u bytes\n",
            devs[count], mtd_info.type, mtd_info.size, mtd_info.erasesize);
            close(fd);
        }
        else
          printf("Failed for %s: error - %s\n", devs[count], strerror(errno));
    }
    return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-04 23:52:31

如果您使用的是ext系列FS,则命令lsattr在更深层次的访问权限上工作,但通常不适用于/dev/* -您可以尝试使用。实现lsattr的jffs2 FS planned -不确定他们是否这样做了。

O_RDONLY访问而不是O_RDWR访问可以帮助读取内存-某些设备需要写入特定的协议,而读取可能是自由允许的。

也许可以使用O_SYNC之类的man 2 open标志……-可能会有帮助。

虽然有this page,但作者也使用了O_RDWR

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14689857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档