2013-10-21 28 views
24

私はLinuxを持っており、物理アドレスは(つまり0x60000000)です。
私はユーザ空間のLinuxプログラムからこのアドレスを読んでみたいです。Linuxの物理アドレスを仮想アドレスに変換し、その内容を読み取ってください。

このアドレスはカーネルスペースにある可能性があります。

+2

次のように 'mmap(2)'を使うことができます: http://stackoverflow.com/questions/12040303/accessing-physical-address-from-user-space – MTZ4

+0

可能な複製はありますか? Linuxの仮想アドレスから物理アドレスを決定するためのAPI](https://stackoverflow.com/questions/5748492/is-there-any-api-for-determining-the-physical-address-from-virtual-address-in -li) –

+0

システムに '/ dev/mem'がありますか?あなたは 'devmem'プログラムを持っていますか(' type devmem'でチェックしてください)?もしそうなら、 'devmem 0x60000000'は動作しますか? '/ dev/mem'のある部分を' mmaps'する関数を書くのは大きな問題ではありませんが、私はそのための準備ができています。 –

答えて

2
Is there an easy way I can do that? 

は、このドライバを見てください。

Is it possible to convert it by using some function like "phys_to_virt()"? 

ioremap_nocache()を使用して物理アドレスを仮想アドレスにマッピングできます。しかし、ユーザー空間からは直接アクセスすることはできません。あなたのドライバやカーネルモジュールがその物理的なアドレスにアクセスしたいと思う、これが最善の方法です。通常、メモリマップされたデバイスドライバはこの関数を使用してレジスタを仮想メモリにマップします。これは/ procの/経て現在可能であることを

+0

賞金が利用可能になりました...別の質問で物理的なデバイスのレジスタのアドレス。明らかにカーネルメモリに存在します。それを仮想アドレスに変換してから、そのレジスタの値を得るために4バイトの 'copy_to_user()'関数に与えることは可能でしょうか? –

+1

これは 'devmem'の仕事のようです。質問の下に私のコメントを参照してください。 –

5

注[PID] /ページマップ

+1

あなたは答えを広げてください。バイナリデータが含まれています。このファイルを使用するには? –

+1

https://www.kernel.org/doc/Documentation/vm/pagemap.txt – subzero

0

C.で、このような何かハードウェア・レジスタをポーリングしている場合、コンパイラが出て最適化しないように、必ず揮発性の宣言を追加しますあなたの変数。

#include <stdlib.h> 

#include <stdio.h> 
#include <errno.h> 

#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <sys/mman.h> 
#include <memory.h> 

volatile int *hw_mmap = NULL; /*evil global variable method*/ 

int map_it() { 
/* open /dev/mem and error checking */ 
int i; 
int file_handle = open(memDevice, O_RDWR | O_SYNC); 

if (file_handle < 0) { 
    DBG_PRINT("Failed to open /dev/mem: %s !\n",strerror(errno)); 
    return errno; 
} 

/* mmap() the opened /dev/mem */ 
hw_mmap = (int *) (mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, file_handle, 0x60000000)); 
if(hw_mmap ==(void*) -1) { 

    fprintf(stderr,"map_it: Cannot map memory into user space.\n"); 
    return errno; 
} 
return 0; 
} 

これで、hw_mmapに書き込むことができます。

関連する問題