- 论坛徽章:
- 0
|
我在驱动中申请片连续的物理内存,然后通过nopage的方法实现mmap
驱动:
(1).申请内存
char* buf = (char *)__get_free_pages(GFP_KERNEL, 4);
(2)实现驱动mmap
static int mmap_mem(struct file * file, struct vm_area_struct * vma)
{
vma->vm_ops = &mmap_mem_ops;
return 0;
}
(3)实现vma的fault
static int mmap_mem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
{
unsigned long offset;
unsigned long kern_addr;
unsigned long address = ( unsigned long)vmf->virtual_address;
offset = address - vma->vm_start + (vma->vm_pgoff<<PAGE_SHIFT);
kern_addr= (unsigned long)(&buf[offset]);
if (kern_addr == 0UL)
{
vmf->page = (struct page *)NULL;
return -1;
}
atomic_inc(&(virt_to_page((void *)kern_addr)->_count));
vmf->page = virt_to_page((void *)kern_addr);
return 0;
}
用户程序:
int main(int argc ,char* argv[])
{
int fd1,fd2;
int i=0;
if(argc!=2)
{
printf("usage: %s filename\n",argv[0]);
exit(-1);
}
if((fd1=open("/dev/mem",O_RDWR))<0) //open device node
{
printf("open /dev/mem error\n");
exit(-1);
}
void* fp = mmap(0, 1024*64, PROT_READ|PROT_WRITE, MAP_SHARED,fd1, 0);
printf("fp:%x\n",fp);
if((fd2 = open(argv[1],O_RDONLY|O_DIRECT))<0)
{
printf("open :%s error\n",argv[1]);
exit(1);
}
while(1){
i=read(fd2,fp,64*1024);
if(i<0){
printf("direct io read error:%d\n",i);
break;
}
if(i!=64*1024)
break;
}
munmap(fp,64*1024);
close(fd2);
close(fd1);
return 0;
}
用户程序第一次可以正常运行,
第二次运行时候出现:Unhandled kernel unaligned access[#1]:
内核版本:2.6.27,mips
谢谢 |
|