[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 メーリングリストの案内