2017-07-14 7 views
0

Linuxカーネルのメモリは通常unswappable(Do Kernel pages get swapped out?)です。ただし、メモリをスワップアウトできるようにすると便利なことがあります。スワップ可能なメモリをLinuxカーネル内に明示的に割り当てることは可能ですか?私が考えた1つの方法は、ユーザー空間のプロセスを作成し、そのメモリを使用することでした。もっと良いものはありますか?Linuxカーネルにスワップ可能なメモリを割り当てよう

+0

あなたのユースケースを説明する必要があります –

答えて

2

shm共有メモリファイルシステムでファイルを作成できます。

const char *name = "example"; 
loff_t size = PAGE_SIZE; 
unsigned long flags = 0; 
struct file *filp = shmem_file_setup(name, size, flags); 
/* assert(!IS_ERR(filp)); */ 

ファイルは実際にリンクされていないため、名前は表示されません。フラグには、ページが割り当てられたときのアカウンティングの代わりに、アカウンティングをスキップするためのVM_NORESERVEが含まれている場合があります。今度はshmemファイルがあります。あなたはそうのようなページをマップすることができます。ページが割り当てられる方法を指定することもshmem_read_mapping_page_gfp(..., gfp_t)あり

struct address_space *mapping = filp->f_mapping; 
pgoff_t index = 0; 
struct page *p = shmem_read_mapping_page(mapping, index); 
/* assert(!IS_ERR(filp)); */ 
void *data = page_to_virt(p); 
memset(data, 0, PAGE_SIZE); 

。あなたがそれを完了したときにページを戻すことを忘れないでください。

put_page(p); 

ファイルと一緒に。

fput(filp); 
+0

これはまさに私が望むようです。ありがとうございました! – qbt937

+0

page_to_virtを使用すると、ここではダイレクトマップでアーチに作用することがありますが、完全に正当化されていません。するべきことはkmap_atomicです。本当に問題はOPがこれを望んでいることですが、もっと重要なことです。 –

関連する問題