- 论坛徽章:
- 0
|
回复 9# linuxxtz
我试了一下,应用层出现段错误。
我的底层实现是:
int my_mmap(struct file *file, struct vm_area_struct *vma)
{
struct scullc_dev *dev;
struct page *page;
int tmp_order = 10;
int tmp_page_num, i;
unsigned long start;
int err = -EINVAL;
tmp_page_num = 1 << tmp_order;
if (((vma->vm_end - vma->vm_start) != tmp_page_num * PAGE_SIZE) || vma->vm_pgoff)
return -EINVAL;
dev = file->private_data;
vma->vm_flags |= VM_IO;
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
start = vma->vm_start;
page = virt_to_page(dev->mem);
for (i = 0; i < tmp_page_num; i++) {
err = vm_insert_page(vma, start, page);
if (unlikely(err))
return -EINVAL;
start += PAGE_SIZE;
page++;
}
return 0;
}
内存申请如下:
scullc_devices->mem = (unsigned char *)__get_free_pages(GFP_KERNEL, tmp_order);
if(scullc_devices->mem == NULL)
{
kfree(scullc_devices);
printk(KERN_ERR "#######vamalloc failed!######\n");
return -ENOMEM;
}
else
{
printk(KERN_ERR "#######vmalloc mem success!######\n");
tmp_page_num = 1 << tmp_order;
for(i = 0; i < tmp_page_num; i++)
{
SetPageReserved(virt_to_page(scullc_devices->mem + i * PAGE_SIZE));
}
}
应用层:
buf = (unsigned char *)mmap(NULL, 4096*4096, PROT_READ | PROT_WRITE,\
MAP_SHARED, mmap_fd, 0);
if(NULL == buf)
{
printf("ERROR:memory map failed. error: %d\n", errno);
return R_FAIL;
}
printf("%s\n", buf);
printf("%s\n", buf+1024);
执行程序后:
报:Segmentation fault
打印日志:
localhost kernel: netdrv_test[3262]: segfault at ffffffffffffffff rip 000000343e8797c0 rsp 00007fffd21e20c8 error 4
错误4:Interrupted system call
帮我看看是哪里出错了,谢谢 |
|