[Armadillo:01601] Re: armadillo-300 の物理アドレスにアクセスする方法
Yasushi SHOJI
email@hidden
2007年 5月 14日 (月) 19:31:40 JST
At Mon, 14 May 2007 16:58:56 +0900,
和田 直也 wrote:
>
> armadillo-300_hardware_manual_ja-1.0.0.pdfのP.6に
> 記載されている物理メモリマップにアクセスをしたいのですが、
> どのような手順を踏んだらよろしいでしょうか。
ioremap()を使って、物理メモリ空間を仮想メモリ空間に割り付ける必要があ
ります。
> 試してみたのは、ドライバにて指定したアドレスから
> 直接、値を取得する方法(↓)と、
>
> data = (*(volatile unsigned char *)0x70000000);
MMUがあるので、物理メモリに直接触ることはできません。上記のアクセスは
仮想メモリ 0x70000000にアクセスします。カーネル空間内でのメモリ
アクセスは必ず仮想アドレスになります。
> または、物理アドレスを仮想アドレスに変換する方法、(↓)
>
> char *ptr;
> ptr = phys_to_virt(0x70000000);
> data = (*(volatile unsigned char *)ptr);
上記は、物理メモリの値を仮想メモリに値に変換するだけです。実際に物理メ
モリが変換後のアドレスにはマップされていません。
> 以上です。
>
> その際、以下のようなエラーが表示されます。
[...]
> 30000000 <1>Unable to handle kernel paging request at virtual address 30000000
カーネルは、仮想アドレす 0x30000000にアクセスに行きますが、paging処理
を行なうことができず、メモリ保護違反となります。
実際に物理メモリを仮想メモリに割り当てるには、最初に紹介した ioremap()
を使用します。ioremap()の戻り値は仮想アドレスが保証されているわけでは
ありません。readb()や writel()で使用するもの(クッキーと呼ばれる)を戻し
ます。
#define REMAP_SIZE 0x1000 /* 必要なサイズを defineしてください */
void *cookie;
char data;
cookie = ioremap(0x70000000, REMAP_SIZE);
data = read8(cookie);
詳しくは、Linuxデバイスドライバ第3版 「8.4 vmallocとその仲間たち」と
「9章 ハードウェアとの通信」を参照してください。
--
yashi
armadillo メーリングリストの案内