易截截图软件、单文件、免安装、纯绿色、仅160KB

linux 驱动mmap操作


三、VMA和PAGE结构 和mmap函数
 
1.page  主要成员
   atomic_t count; 
//这个页的引用数. 当这个 count 掉到 0, 这页被返回给空闲列表.
void *virtual; 
//如果页被映射,则表示这页的内核虚拟地址; 否则, NULL.
unsigned long flags; 
//描述页状态的一套位标志. 这些包括 PG_locked, 它指示该页在内存中已被加锁, 以及 PG_reserved,
//它防止内存管理系统使用该页
 
2.vm_area_struct  主要成员
unsigned long vm_start;//VMA 开始于
unsigned long vm_end; //VMA 结束
struct file *vm_file; 
//指向和这个区(如果有一个)关联的 struct file 结构的指针.
unsigned long vm_pgoff; 
//文件中区的偏移, 以页计. 当一个文件和设备被映射, 这是映射在这个区的第一页的文件位置.?????
unsigned long vm_flags; 
// 设备驱动常用的标志是 VM_IO 和 VM_RESERVUED. 
//VM_IO 标志一个 VMA 作为内存映射的 I/O 区,阻止这个区被包含在进程核转储???中. 
//VM_RESERVED 告知内存管理系统不要试图交换出这个 VMA;
struct vm_operations_struct *vm_ops; 
//操作
//void (*open)(struct vm_area_struct *vma);  VMA刚刚产生时,此函数被调用来初始化VMA
//void (*close)(struct vm_area_struct *vma);  当一个区被销毁, 内核调用它的关闭操作
//struct page *(*nopage)(struct vm_area_struct *vma, unsigned long address, int *type); 
//如果 nopage 方法没有定义,内核分配一个空页.进程存取不在内存中有效 VMA 的页时,nopage 方法被调用(如果它被定义)
//int (*populate)(struct vm_area_struct *vm, unsigned long address, unsigned long len, pgprot_t prot, unsigned long pgoff, int
nonblock); 
//在它们被用户空间存取之前,允许内核"预错"页到内存. 驱动通常没有必要实现这个填充方法
void *vm_private_data; 
//驱动可以用来存储它的自身信息的成员.
 
3.mmap用户空间调用与内核空间调用
void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offset);
//start 指向欲对应的内存起始地址,通常设为NULL,代表让系统自动选定地址,对应成功后该地址会返回
//参数length代表将文件中多大的部分对应到内存。
//参数prot代表映射区域的保护方式
//fd文件描述符
//参数off


相关文档:

Linux下创建与解压zip, tar, tar.gz和tar.bz2文件 转

在Linux下面去压缩文件或者目录。我们将学习zip, tar, tar.gz和tar.bz2等压缩格式的基本用法。
zip格式已成为压缩文件的标准选择,而且它在windows上也能使用。
经常用zip格式压缩那些需要共享给windows用户的文件。
如果只是共享给linux用户或者Mac用户,偏向于选择tar.gz格式。
ZIP
zip可能是目前使用得最多的文档压 ......

Linux多线程编程

一:Linux多线程编程:
        线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。传统的Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程。现在,多线程技术已经被许 ......

Linux应用程序安装与管理

目标:
        了解linux应用程序的组成部分
        掌握使用RPM工具管理软件包的方法
        掌握应用程序源代码包的编译安装方法
        掌握图形界面下应用程序管理工具的使用
1、L ......

Linux内核编码拾锦

1.一种定义函数指针的方法
<linux/proc_fs.h>
typedef int (read_proc_t)(char *page, char **start, off_t offset, int count, int *eof, void *data);
read_proc_t *proc_read;
    这种定义方法有一个优势就是,即使你没有看到read_proc_t的定义,也能够清楚的知道proc_read是一个指针,如下面 ......

linux内核情景分析{中断 系统调用 内存}


Linux的系统调用是通过中断来实现的,从用户态进入系统态。用户态和系统态有很清晰的区分,保证了安全。系统调用表是系统调用的跳转表。使用寄存器传递参数,而不是栈,因为用户态是无法访问系统栈的。地址错误是通过页面异常来处理的。
Linux内核并不支持真正意义上的线程,
LinuxThreads
是用与普通进程具有同样内核 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号