没有合适的资源?快使用搜索试试~ 我知道了~
1.1 Linux内核常用的内存空间申请方式内核空间申请内存主要函数有:kmalloc(),__get_free_pages()他们申请的内存位于物理内存映射区
资源详情
资源评论
资源推荐
Linux 驱动_mmap
1. 相关知识
当内核空间和用户空间存在大量数据交互时,共享内存映射就成了这种情况下的不二
选择,它能够最大限度的降低内核空间和用户空间之间的数据拷贝,从而大大提高系
统的性能。
1.1 Linux 内核常用的内存空间申请方式
内核空间申请内存主要函数有:kmalloc(),__get_free_pages()他们申请的内存位于
物理内存映射区,且在物理上是连续的,与真实的物理地址只有一个固定的偏移。
vmalloc()申请的连续虚拟内存空间在物理上则不一定连续,它们之间也没有简单的换
算关系。
1.2 mmap 基本概念
mmap()实现了将用户空间的一段内存与设备内存关联,当用户访问用户空间的这段地
址范围时,会转化为对设备的访问。mmap()必须以 PAGE_SIZE 为单位进行映射。
调用 mmap()的时候,内核会进行如下处理:
(1)在进程的虚拟空间查找一块 VMA
(2)将这块 VMA 进行映射
(3)如果设备驱动程序或文件系统的 file_operations 定义了 mmap()操作,则调用它
(4)将这个 VMA 插入到进程的 VMA 链表中
驱动程序中的 mmap()实现机制是建立页表,并填充 VMA 结构体中
vm_operations_struct 指针。针对 VMA 的操作都被包含在 vm_operations_struct 结构
体中。
1.3 写缓存和 Cache
通常,I/O 内存被映射时需要是 nocache 的,这时我们需要对 vma->vm_page_prot 设
置 nocache 标志之后再映射。
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);//赋 nocache 标
志。
pgprot_noncached()禁止了相关页的 Cache 和写缓冲(write buffer),
pgprot_writecombine()则没有禁止写缓冲。ARM 下的写缓冲器是一个非常小的 FIFO
存储器,位于处理器核与主存之间,其目的将处理器核和 Cache 从较慢的主存写操作
中解脱出来。
苗苗小姐
- 粉丝: 38
- 资源: 328
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0