GNU/Linux >> Linux の 問題 >  >> Linux

ユーザー空間からカーネル空間に(可能であれば)アクセスする方法は?

<ブロック引用>

ユーザー空間からカーネル アドレス空間に書き込むには、どのような方法がありますか?

他の方法があるかどうかはわかりませんが、 /dev/mem を使用して物理メモリにアクセスできます &システムコール mmap() .

<ブロック引用>

/dev/mem コンピュータのメインメモリのイメージであるキャラクターデバイスファイルです。たとえば、システムの検査 (およびパッチの適用) に使用できます。mem 内のバイト アドレスは、物理メモリ アドレスとして解釈されます。

/dev/mem の詳細 :http://linux.about.com/library/cmd/blcmdl4_mem.htm

mmap() の詳細 :http://linux.die.net/man/2/mmap

mmap() を使用できます /dev/mem のセクションをマップする ユーザープログラムで使用します。簡単なコード例:

#define MAPPED_SIZE //place the size here
#define DDR_RAM_PHYS  //place the physical address here

int _fdmem;
int *map = NULL;
const char memDevice[] = "/dev/mem";

/* open /dev/mem and error checking */
_fdmem = open( memDevice, O_RDWR | O_SYNC );

if (_fdmem < 0){
printf("Failed to open the /dev/mem !\n");
return 0;
}
else{
printf("open /dev/mem successfully !\n");
}

/* mmap() the opened /dev/mem */
map= (int *)(mmap(0,MAPPED_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,_fdmem,DDR_RAM_PHYS));

/* use 'map' pointer to access the mapped area! */
for (i=0,i<100;i++)
printf("content: 0x%x\n",*(map+i));

/* unmap the area & error checking */
if (munmap(map,MAPPED_SIZE)==-1){
perror("Error un-mmapping the file");
}

/* close the character device */
close(_fdmem);

ただし、マッピングしている領域がカーネルなどによって使用されていないことを確認してください。そうしないと、システムがクラッシュ/ハングアップし、ハードウェアの電源ボタンを使用して再起動する必要があります。

お役に立てば幸いです。


<ブロック引用>

ユーザー メモリとカーネル メモリは、Linux カーネル内でどの程度正確に区別されていますか?

あなたの質問を理解できたかどうかわかりません.

カーネルにとって、技術的に大きな違いはありません。メモリだけです。なんで?最も特権のある CPU モードで実行されているカーネルは、すべてのメモリにアクセスできるためです。

<ブロック引用>

ユーザー空間からカーネル アドレス空間に書き込むには、どのような方法がありますか?

カーネルまたはカーネル モードのデバイス ドライバーにセキュリティ ホールがない限り、少なくとも直接的にはできません。ただし、カーネル (またはそのドライバーの 1 つ) は、ユーザー モード アプリケーションのメモリからカーネル メモリにデータをコピーする場合があります。

<ブロック引用>

...カーネル空間に存在する物理アドレスにアクセスして操作を実行する方法はありますか?

同じことですが、仮想アドレスから物理アドレスへの変換が存在する場合、物理アドレスを使用してメモリにアクセスすることはできません。いったん有効にすると、カーネル自体でさえこの変換を避けることはできません。任意の物理アドレスでメモリにアクセスするには、ページ テーブルに適切な仮想アドレスから物理アドレスへのマッピングを作成する必要があります。

<ブロック引用>

システム コール以外に、ユーザー アプリケーションからカーネル空間に書き込む方法はありますか?

また、例外 (0 による除算、ページ フォールト、一般保護フォールトなど) をトリガーして、CPU を強制的にカーネル コードに切り替えることもできます。例外を最初に処理するのはカーネルです。カーネルは、例外に応じて必要に応じてメモリを変更します。ページ フォールトでどこか (ディスクなど) からデータをロードする場合があります。


Linux
  1. Linux –ユーザースペースとカーネルスペースの違いは?

  2. cPanelからphpMyAdminにアクセスする方法

  3. ユーザーが別のハード ドライブにファイルをコピーできないようにするにはどうすればよいですか?

  1. Linuxでグループにユーザーを追加またはグループから削除する方法

  2. Linux カーネルからメモリのブロックを予約するにはどうすればよいですか?

  3. 共有メモリ:shmget が失敗します:デバイスにスペースが残っていません -- 制限を増やす方法は?

  1. Sshアクセスで新しいユーザーを作成する方法は?

  2. カーネル空間からユーザー空間関数を実行する

  3. Linuxカーネルバッファをユーザー空間にmmapする方法は?