list_for_each_entry 与 mmap
来源:互联网 发布:linux 文件打包保留 编辑:程序博客网 时间:2024/06/05 00:26
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);
- list_for_each_entry 与 mmap
- list_for_each与list_for_each_entry详解
- list_for_each与list_for_each_entry详解
- list_for_each与list_for_each_entry
- list_for_each_entry
- list_for_each_entry
- list_for_each_entry
- list_for_each_entry
- list_for_each_entry
- list_for_each_entry
- list_for_each_entry
- list_for_each_entry
- list_for_each_entry
- list_for_each_entry
- list_for_each_entry
- list_for_each_entry
- mmap与内存管理
- mmap与swap
- jQuery点击li标签打开新链接
- hdu 2188 选拔志愿者(巴士博弈)
- 从头到尾彻底理解KMP
- [索引] 高精度
- va_start, va_arg, va_end 宏的学习
- list_for_each_entry 与 mmap
- 博弈入门
- WeakReference与SoftReference
- jQuery点击获取li的值
- 批量改文件名
- 晨若网络为您量身定做高品质网站
- javascript异步开发四种方法
- mysql的相关参考手册
- RAISE_APPLICATION_ERROR用法