list_for_each_entry 与 mmap

来源:互联网 发布:linux 文件打包保留 编辑:程序博客网 时间:2024/06/05 00:26
#define list_for_each_entry(pos, head, member)\
for (pos = list_entry((head)->next, typeof(*pos), member);\
    &pos->member != (head); \

    pos = list_entry(pos->member.next, typeof(*pos), member))

循环遍历pos中的member子项

pos{

  member{

*next;

*prev;

}

}

其中head是member成员的指针,而且指针一定不为空,他是member成员组成的链表的头。


#define list_entry(ptr, type, member) \
container_of(ptr, type, member)

list_entry()其实返回的是type字段的指针,是ptr所在的地址的父变量的地址。

函数mmap

void *mmap(void * addr,size_t length,int prot,int flags,int fd,off_t offset);

addr:申请的虚拟地址

length:长度

prot:保护方式 PROT_READ PROT_WRITE 

flags;映射方式 MAP_SHARE 

fd:文件描述符

offset:文件从哪里映射。

驱动程序如下:

static int page_mmap(struct file* filp,struct vm_area_struct * vma)
{
ulong start,size;
start = vma->vm_start;
int len=vma->vm_end-vma->vm_start;
size = PAGE_ALIGN(len);
printk(KERN_INFO "Len = %d ,Size = %ld\n",len,size);
return remap_pfn_range(vma,start,(virt_to_phys(buffer) >> PAGE_SHIFT),size,PAGE_SHARED);
}

在open函数里调用share_alloc函数接口

int share_alloc()
{
struct page * page;
size_t size = PAGE_ALIGN(LEN);
buffer = kzalloc(size,GFP_KERNEL);
if(!buffer){
printk(KERN_ERR "malloc  memory error");
return -ENOMEM;
}
for(page = virt_to_page(buffer);page < virt_to_page(buffer+size);page++){
SetPageReserved(page);
}

return 0;
}

在关闭函数里调用share_free函数接口

void share_free()
{
struct page *page;
size_t size = PAGE_ALIGN(LEN);
for(page = virt_to_page(buffer);page < virt_to_page(buffer + size);page++)
ClearPageReserved(page);
kfree(buffer);
}

测试程序如下:

int main(int argc,char * argv[])
{
char buf[]="good moring ,linux world!";
char * ptr;
int fd;
fd = open("/dev/page",O_RDWR);
if(fd == -1){
printf("open error");
return -1;
}
ptr = mmap(NULL,1024,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
if(ptr== NULL){
printf("mmap error");
return -1;
}
printf("ptr=%s",ptr);
strcpy(ptr,buf);
munmap(ptr,1024);
close(fd);
return 0;
}

#define list_for_each(pos,head)  for( pos = (head)->next;pos != head;pos=pos->next)

head:

struct   demo{

*next;

// 其他成员

};

struct demo head;

调用形式如下:

list_for_each(pos,&head);

0 0
原创粉丝点击