Mmap设备方法---那些年我们一起玩嵌入式驱动

发布者:Joyful888Life最新更新时间:2016-12-28 来源: eefocus关键字:Mmap设备  嵌入式驱动 手机看文章 扫描二维码
随时随地手机看文章

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=%s\n”,buf);

 

/*写入数据*/

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

 

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

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

 

return 0;

}

源文件:

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

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

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

 

虚拟内存区域

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

 

虚拟内存区域:

每一行的域为:

Start _end perm  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设备方法所需要做的就是建立虚拟地址到物理地址的页表。

 


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

就是通过struct vm_area_struct 参数告诉我的。

 

Mmap如何完成页表的建立?

方法有二:

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

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

 

我们使用的是第一种: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.     建立虚拟地址到物理地址的页表;


关键字:Mmap设备  嵌入式驱动 引用地址:Mmap设备方法---那些年我们一起玩嵌入式驱动

上一篇:LCD---那些年我们一起玩mini2440(arm9)裸机
下一篇:ADC触摸屏转换---那些年我们一起玩mini2440(arm9)裸机

推荐阅读最新更新时间:2024-03-16 15:27

基于嵌入式Linux的步进电机驱动程序设计
  1.引言   随着嵌入式技术的飞速发展,基于嵌入式系统的新一代工业控制器也日益增多。同以往的控制器不同,新的仪器大多以32位嵌入式处理器为核心,并且安装有嵌入式操作系统,从而大幅度提高了处理能力,方便了设计开发。在各种嵌入式操作系统中,嵌入式Linux是免费的自由软件,其构建的系统成本较低,而且Linux是单内核的操作系统,并可按要求进行任意剪裁,因此越来越多的研究人员开始在用Linux平台来开发自己的产品 。   嵌入式开发过程中,经常需要为特定设备开发驱动程序。这些驱动程序的编写和编译与PC上的Linux驱动开发相比存在明显的差异,需要考虑的因素更多,实现过程更为复杂。本文以Samsung公司S3C2410X CPU为
[工业控制]
嵌入式Linux下的AU1200MAE驱动程序设计
随着移动多媒体终端的口益普及,功能的日益强大,人们已经不满足于自己的手持终端仅仅能够听MP3音乐,而是希望终端在播放音乐的同时能够播放高质量视频,并支持多种视频格式。AU 1200作为一款基于MIPS架构的处理器,由于其片上集成了视频硬件设备(Media Accel-eration Engine,MAE),使得该处理器无需配合其他视频解码芯片即可完成多种格式的视频解码功能,所以AU 1200非常适合应用于像PMP这样的移动多媒体终端,而MAE也成为AU 1200的特色。    1 MAE 概述   MAE是AU 1200的片上硬件设备,除了可以实现视频解码功能外,还可以完成色彩空间转换、滤波等工作。MAE在硬件结构上可以分
[工业控制]
<font color='red'>嵌入式</font>Linux下的AU1200MAE<font color='red'>驱动</font>程序设计
AD7888与S3C2410的SPI接口及Linux下嵌入式驱动的实现
串行外围设备接口SPI(serial peripheral interface)总线技术是Motorola公司推出的一种同步串行接口,它允许CPU与TTL移位寄存器、A/D或D/A转换器、实时时钟(RTO)、存储器以及LCD和LED显示驱动器等外围接口器件以串行方式进行通讯。 SPI总线只需3~4根数据线和控制线即可扩展具有SPI接口的各种I/O器件,其硬件功能很强,实现软件相当简单。串行A/D转换器具有电路简单、工作可靠的特点,而ARM芯片被设计用于手持设备以及普通的嵌人式应用的集成系统,将上述两种实用的芯片和SPI总线技术相结合以实现数据采集十分有效。 1 AD7888的功能与使用 AD7888是美国模拟器件公司推出的一款
[嵌入式]
嵌入式ARM下的触摸屏驱动系统设计
文章首先介绍了触摸屏的实现原理,然后介绍了触摸屏芯片AD7873的特性,在此基础上设计了ad7873与i.MX27和触摸屏的连接PCB图,最后依照硬件连接图设计了嵌入式Linux下的驱动,并成功通过了tclib触摸屏专业测试软件的测试,在家庭智能网关系统的测试中也成功运行,实现了从硬件到软件的嵌入式下触摸屏的驱动系统设计。 1引言 随着计算机技术的发展和普及,触摸屏技术得到了越来越广泛应用,在各种手持设备中,如手机、MP4、掌上游戏机、掌上PDA等,由于其方便、舒适,使其完全摆脱了键盘和鼠标的束缚,使人机交互更为直截了当。而在微软最新开发的windows7操作系统中,就有其值得骄傲并加以推广的多点触摸技术,并成为一大卖点。
[电源管理]
<font color='red'>嵌入式</font>ARM下的触摸屏<font color='red'>驱动</font>系统设计
嵌入式Linux系统中I2C总线设备驱动设计
引言 I2C总线是PHILIPS公司推出的两线式串行总线,用于连接微控制器及其外围设备,具有简单、高效等特点。由于其接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片引脚的数量,降低了互联成本,特别适用于嵌入式产品。 而Linux系统具有开源、免费、网上资源丰富等优点,目前已成为嵌入式系统的主流选择。因此如何在嵌入式Linux系统中实现I2C功能成为实际开发中的问题。 I2C总线 I2C 总线通过串行数据SDA 和串行时钟SCL线在连接到总线的器件间传递信息,每个器件都有一个唯一的地址识别。根据数据传输时的功能不同,把器件分为主机和从机。主机是初始化总线的数据传输并产生允许传输的时钟信
[单片机]
<font color='red'>嵌入式</font>Linux系统中I2C总线<font color='red'>设备</font>的<font color='red'>驱动</font>设计
AD7888与S3C2410的SPI接口及Linux下嵌入式驱动的实现
串行外围设备接口SPI(serial peripheral interface)总线技术是Motorola公司推出的一种同步串行接口,它允许CPU与TTL移位寄存器、A/D或D/A转换器、实时时钟(RTO)、存储器以及LCD和LED显示驱动器等外围接口器件以串行方式进行通讯。 SPI总线只需3~4根数据线和控制线即可扩展具有SPI接口的各种I/O器件,其硬件功能很强,实现软件相当简单。串行A/D转换器具有电路简单、工作可靠的特点,而ARM芯片被设计用于手持设备以及普通的嵌人式应用的集成系统,将上述两种实用的芯片和SPI总线技术相结合以实现数据采集十分有效。 1 AD7888的功能与使用 AD7888是美国模拟器件公司推出的一款
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved