当前位置:首页 > 单片机 > 单片机
[导读]mmap设备方法)Mmap系统调用(功能)Void* mmap(void * add, size_t len , int prot, int flags, int fd, off_t offset)Mmap系统调用(参数)*Addr指定映射的起始地址,通常设为NULL,由系统指定。*Length:映射到内存

mmap设备方法)

Mmap系统调用(功能)

Void* mmap(void * add, size_t len , int prot, int flags, int fd, off_t offset)

Mmap系统调用(参数)

*Addr

指定映射的起始地址,通常设为NULL,由系统指定。

*Length:

映射到内存的文件长度

*port:

映射区的保护方式,可以是:

PROT_EXEC:映射区可被执行;

PROT_READ:映射去可被读取;

PROT_WRITE:映射区可被写入;

PROT_NONE:映射区不能存取;

*flags:

映射区的特性,可以是:

# MAP_SHARED:

写入映射区的数据会复制回文件,且允许其他映射该文件的进程共享。

#MAP_PRIVATE:

对映射区的写入操作产生一个映射区的复制(copy-on-write),对此区域所做的修改不会协会原文件。

Fd:

由open返回的文件描述符,代表要映射的文件。

Offset:

以文件开始处偏移量,必须是分页大小的整数倍,通常为0,表示从文件头开始映射。

内存映射函数mmap,负责把文件内容映射到进程的虚拟空间,通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要在调用read,write等操作。

左边是进程的虚拟地址空间;右边是文件;

解除映射

Int munmap(void *start,size_t length)

功能:

取消参数start所指向的映射内存,参数length表示与取消的内存的大小。

(start所指向的映射内存,即mmap()的返回值)

返回值:

解除成功返回0,否则返回-1,错误原因存在errno中。

源程序:

示例:

#include

#include

#include

#include
#include

#include

Int main()

{

int fd;

char *start;

char buf[100];

/*打开文件*/

fd=open(“testfile”,O_RDWR);

start=mmap(NULL,100,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); //把文件testfile进程映射到虚拟空间中去

//映射文件的地址直接通过start返回,以后操作文件就直接使用这个地址

/*读出数据*/

Strcpy(buf,start);/*把buf中的内容直接拷贝到start中去*/

printf(“buf=%sn”,buf);

/*写入数据*/

Strcpy(start,”buf is not null!”);/*把字符串直接写到start中*/

Munmap(start,100);/*解除映射*/

close(fd); /*关闭文件*/

return 0;

}

源文件:

1.通过mmap函数返回映射地址(初始位置)start;

2.利用返回的start地址通过strcpy()写入、读出函数;

3.读写完后,接触映射;

虚拟内存区域

虚拟内存区域是进程的虚拟地址空间中的一个同质区间,即具有同样特性的连续地址范围。一个进程的内存映像由下面几部分组成:程序代码、数据、BSS和栈区域,以及内存映射的区域。

虚拟内存区域:

每一行的域为:

Start _endperm offset major: minor inode

*start:该区域起始虚拟地址

*end:该区域结束虚拟地址

*perm :读、写和执行权限;表示对这个区域,允许进程做什么。这个区域的最后一个字符要么是P表示私有的,要么是s表示共享的。

*offset :被映射部分在文件中的起始地址

*major、minor:主设备号;

*inode :索引节点

Vm_area_struct

Linux内核使用结构vm_area_struct

()来描述虚拟内存区域,其中几个主要的成员如下:

*unsigned long vm_start

虚拟内存区域起始地址

*unsigned long vm_end

虚拟内存区域结束地址

*unsigned long vm_flags

该区域的标记。如:VM_IO和VM_RESERVED

VM_IO将该VMA标记为内存映射的IO区域,

VM_IO会阻止系统将该区域包含在进程的存放转存(core dump)中,VM_RESERVED标志内存区域不能被换出。

Mmap设备操作

映射一个设备是指把用户空间的一段地址关联到设备内存上。当程序读写这段用户空间的地址时,它实际上是在访问设备。

Mmap设备操作

Mmap设备方法需要完成什么功能?

Mmap方法是file_oprations结构的成员,在mmap系统调用发出时被调用。在此之前,内核已经完成了很多工作。mmap设备方法所需要做的就是建立虚拟地址到物理地址的页表。


内核可以帮我找到一块可以用的虚拟地址,怎么告诉我?

就是通过structvm_area_struct参数告诉我的。

Mmap如何完成页表的建立?

方法有二:

1.使用remap_pfn_range一次建立所有页表;

2.使用nopageVMA方法每次建立一个页表。

我们使用的是第一种:remap_pfn_range一次建立所有页表;

Vma :(内核帮我们找到的虚拟内核区间)

虚拟内存区域指针

Virt_addr:(关联的虚拟地址)

虚拟地址的起始值;

Pfn:(关联的物理地址)

要映射的物理地址所在的物理页帧号,可将物理地址>>PAGE_SHIRT得到。

>>PAGE_SHIRT(PAGE_SHIRT是12,即右移12位,相当于除以4k)

Size:(关联的长度多大)

要映射的区域的大小

Prot:(关联的属性)

VMA的保护属性

分析思路顺序按照如下颜色;

思路一:在file_operations结构体中添加mmap函数;

思路二:实现mmap函数、如上;

驱动中的mmap函数:

1.设置属性;

2.建立虚拟地址到物理地址的页表;


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭