2017-09-14 9 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`;