[Armadillo:04057] armadillo-500で/dev/mem、mmap()でのアクセスについて

藤岡 email@hidden
2009年 2月 19日 (木) 23:19:23 JST


お世話になっております。
藤岡と申します。

 以下のロジックで得たmmap()のメモリアドレスを使って、
0xB8001000から0xB8004000の手前までを読み出し(最終的には読み書き)
しようとしているのですが、うまく行っておりません。

==============================

int lnxOpenMem(ulong st_adrs, uint length,
        ulong *pMemStAdrs, uint *pMemLength, ulong *pMemRwAdrs)
{
    int iFD;    /* /dev/memのファイルディスクリプタ */
    ulong   pageSize;   /* mmap()時のページサイズ */
    ulong   mapAdrs;
    uint    mapLength;
    void    *pMMap;


/* /dev/memをオープンする */
/*  iFD = open("/dev/mem", O_RDWR); */
    iFD = open("/dev/mem", O_RDONLY | O_SYNC);
    if (iFD < 0)
    {
printf("open(/dev/mem) error\n");
        return(iFD);    /* /dev/memのオープン失敗 */
    }

/* ページサイズ単位でマップするメモリの先頭アドレスを求める */
    pageSize = sysconf(_SC_PAGESIZE);
    mapAdrs = (st_adrs / pageSize) * pageSize;
/* マップするメモリのサイズを求める */
    mapLength = (st_adrs + length) - mapAdrs;

/* メモリにマップする */
/*  pMMap = mmap(0, mapLength, PROT_WRITE | PROT_READ, MAP_SHARED, */
    pMMap = mmap(0, mapLength, PROT_READ, MAP_SHARED,
                        iFD, mapAdrs); /* 物理メモリを論理メモリにマッピング 
*/
printf("mapAdrs = 0x%08lx mapLength = 0x%08lx pageSize = 0x%08lx\n",
            mapAdrs, mapLength, pageSize);
    if (MAP_FAILED == pMMap)
    {
printf("mmap() error\n");
        return(-1); /* メモリのマップ失敗 */
    }

/* /dev/memのファイルディスクリプタとマップしたメモリの先頭アドレス、サイズとR/Wアドレスを返す */
    *pMemStAdrs = (ulong)pMMap;
    *pMemLength = mapLength;
    *pMemRwAdrs = (*pMemStAdrs) + (st_adrs - mapAdrs);
    return(iFD);
}


==============================

(1)0xB8000000から1[unsigned long]読み出した場合は読めております。

mapAdrs = 0xb8000000 mapLength = 0x00000004 pageSize = 0x00001000

が表示されて、0xffffffffが読めました。

(2)0xB8001000から1[unsigned long]読み出した場合はBus Errorとなりました。

mapAdrs = 0xb8001000 mapLength = 0x00000004 pageSize = 0x00001000

が表示されるのですが、

Unhandled fault: external abort on non-linefetch (0x008) at 0x40018000
Bus error

となって読めませんでした。

0xB8002000と0xB8003000から1[unsigned long]読み出した場合も同様です。

(3)0xB8004000から1[unsigned long]読み出した場合は読めております。

mapAdrs = 0xb8004000 mapLength = 0x00000004 pageSize = 0x00001000

が表示されて、0x000001e2が読めました。


 過去のメーリングリストの、

[Armadillo:03387] [Armadillo-500] 外部拡張バスについて
http://lists.atmark-techno.com/pipermail/armadillo/2008-September/003387.html

と、同様な状況ではないか。と考えております。

 以上です。
 何か、示唆等頂けるとありがたいです。
 宜しくお願い致します。




armadillo メーリングリストの案内