1

組み込み Linux プラットフォームで MTD の詳細を読み取ろうとする小さなプログラムがあります。ほとんどのブロックを読み取れないという問題が発生しており、その理由が 100% わかりません。

/devディレクトリをチェックすると、mtdすべて同じ権限を持つ 8 つの s が表示されます。

# 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

私のアプリケーションもルートとして実行されています。

# ls -al mtd_test
-rwxrwxrwx    1 root     root        19688 Nov 30 01:18 mtd_test

を確認する/procと、8 つの mtd のうち 7 つがマウントされていることがわかります (そのためmtd7、読み取りに失敗すると予想していました)。

# 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)"

奇妙なことに、読み取ることができただけmtd1で、他のすべては「許可が拒否されました」というエラーで失敗しました。mtd6

それが私のコードだとは思えませんが、ここにあります:

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;
}
4

1 に答える 1

3

ext ファミリ FS を使用している場合、コマンド lsattr はアクセス権のより深いレベルで機能しますが、通常は適用されません/dev/*。とにかく試すことができます。jffs2 FSは実装を計画していましたが、実装lsattrしたかどうかは不明です。

O_RDONLYアクセスはメモリの読み取りに役立つ可能性があります。O_RDWR一部のデバイスでは、特定のプロトコルへの書き込みが必要ですが、読み取りは自由に許可されている場合があります。

man 2 openたぶん、フラグで遊んでください-O_SYNCなど...-役立つかもしれません。

このページもありますが、筆者も使用O_RDWRしています。

于 2013-02-04T15:52:30.537 に答える