2017-09-14 18 views
2

メモリ管理カーネルモジュールを実装しようとしています。このモジュールはmmap()システムコールを使用します。実装後、私はエラーを与えるmmapを呼び出すことを試みたResource temporarily unavailable 私はthisスレッドを通過しました。私の場合、解決策は機能しません。mmap()リソースは一時的に利用できません

ここにカーネルの実装があります: - 変数の宣言を除外します。 remap

kmalloc_ptr = kmalloc(size, GFP_KERNEL) 
static int simple_mmap(struct file *filp, struct vm_area_struct *vma) 
{ 
remap = remap_pfn_range(vma, vma->vm_start, (virt_to_phys)(kmalloc_ptr) >> 12, 
       vma->vm_end - vma->vm_start, 
       vma->vm_page_prot) 
     return -EAGAIN; 

値は、私は私が疑われていたとしてマッピングに異常はなかった、エラーを検出しました0

+0

として使用する必要がありましたか?あなたは見ています - タイプミス( 'kAmlloc_ptr')があります。 'remap_pfn_range()'の最後にセミコロンがなく、 'if'文もありません。いずれの場合でも' return -EAGAIN'が実行されます。 また、 'pfn'引数が正しい方法で計算されているにもかかわらず、' kmalloc_ptr'に基づいてそれを計算するのはとても奇妙です。なぜカーネルメモリをここに割り当てる必要があるのですか?ここで '(virt_to_phys)(kamlloc_ptr)>> 12'の代わりに' vma-> vm_pgoff'を使うことが期待されます。したがって、コードの残りの部分も表示してください。 –

+0

@DaanGerlach私は問題がif文なしの 'return EAGAIN'にあったと考えました。エラーが解決されました。ご協力ありがとうございました。 – john

+0

ようこそ。 また、マジックナンバー( '12')の代わりに' PAGE_SHIFT'を使うのがよいでしょう。 –

答えて

0

です。

エラー

はリマップあなたが完全なスニペットを提供してもらえ

`if ((remap_pfn_range(vma, vma->vm_start, (unsigned long long)(virt_to_phys((void *)mapped_data)) >> PAGE_SHIFT, size, vma->vm_page_prot)) 
return -EAGAIN`; 
関連する問題