ユーザー空間からカーネル アドレス空間に書き込むには、どのような方法がありますか?
他の方法があるかどうかはわかりませんが、 /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 を強制的にカーネル コードに切り替えることもできます。例外を最初に処理するのはカーネルです。カーネルは、例外に応じて必要に応じてメモリを変更します。ページ フォールトでどこか (ディスクなど) からデータをロードする場合があります。