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'을 사용하는 것이 좋습니다. –