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
として使用する必要がありましたか?あなたは見ています - タイプミス( 'kAmlloc_ptr')があります。 'remap_pfn_range()'の最後にセミコロンがなく、 'if'文もありません。いずれの場合でも' return -EAGAIN'が実行されます。 また、 'pfn'引数が正しい方法で計算されているにもかかわらず、' kmalloc_ptr'に基づいてそれを計算するのはとても奇妙です。なぜカーネルメモリをここに割り当てる必要があるのですか?ここで '(virt_to_phys)(kamlloc_ptr)>> 12'の代わりに' vma-> vm_pgoff'を使うことが期待されます。したがって、コードの残りの部分も表示してください。 –
@DaanGerlach私は問題がif文なしの 'return EAGAIN'にあったと考えました。エラーが解決されました。ご協力ありがとうございました。 – john
ようこそ。 また、マジックナンバー( '12')の代わりに' PAGE_SHIFT'を使うのがよいでしょう。 –