mmap使用

article/2025/10/23 20:29:01

linux进程虚拟地址空间中存在一段称为mmap的内存区,当申请用户内存较大时,如大于128kb,系统一般会通过mmap系统调用直接映射一片内存区,使用结束后再通过ummap系统调用归还。关于mmap的原理网上有很多文档,这里不再赘述,主要给出驱动程序如何编写mmap函数,并通过缺页异常形式进行具体页的映射,具体参考这位博主:
https://blog.csdn.net/xxxxxlllllxl/article/details/17303231,
博文中使用kmalloc分配内存,在物理地址上连续,这里使用vmalloc开辟一段连续线性地址空间进行mmap
在这里插入图片描述

驱动程序:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/vmalloc.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/errno.h>
#define CHR_DEV_NAME "my_chr_dev"static struct cdev chr_dev; 
static dev_t ndev;
char * addr;
#define VMALLOC_SIZE PAGE_SIZE	//映射一页至用户空间
typedef struct {char buf[100];int  num;
}map_t;map_t *pmap;char map_char[10]={};static int chr_open(struct inode *nd, struct file *filp)
{//int a = PAGE_SIZE;int major = MAJOR(nd->i_rdev);int minor = MINOR(nd->i_rdev);printk("chr_open,major=%d,minor=%d\n",major,minor);return 0;
}static ssize_t chr_read(struct file *f, char __user *u, size_t sz, loff_t *off)
{printk("In the chr_read() function!\n");return 0;
}
static int eccdev_vma_fault(//struct vm_area_struct *vma, //此参数在高版本内核不存在struct vm_fault *vmf /**< Fault data. */)
{printk("go to mmap\n");unsigned long offset = (vmf->pgoff )<<  PAGE_SHIFT;//虚拟地址偏移struct page *page;printk("offset = %lu\n",offset);page = vmalloc_to_page(addr+offset);//将虚拟地址转为实际物理页面if(!page){printk("page error\n");return VM_FAULT_SIGBUS;}get_page(page);		//获取实际物理页面vmf->page = page;return 0;
}struct vm_operations_struct chr_vm_ops = {.fault = eccdev_vma_fault,};static int chr_mmap(struct file *filp, struct vm_area_struct *vma)
{printk("mmap \n");vma->vm_ops = &chr_vm_ops;vma->vm_flags |= VM_DONTDUMP; /* Pages will not be swapped out *///  vma->vm_private_data = priv;return 0;
}
struct file_operations chr_ops = 
{.owner = THIS_MODULE,.open = chr_open,.read = chr_read,.mmap = chr_mmap
};static int demo_init(void)
{int ret;addr = (char *)vmalloc(VMALLOC_SIZE);    //调用vmalloc( )分配一段内存区间if( addr == NULL )printk("vmalloc failed! \n");else{printk("vmalloc successfully! addr = 0x%lx\n", (unsigned long)addr);}sprintf(addr,"nihaolinux , this is a mmap test");printk("addr=%s\n",addr);/*pmap = kmalloc(sizeof(map_t),GFP_KERNEL);if(!pmap){	printk("kmalloc failed\n");return -ENOMEM;}sprintf(pmap->buf,"hello");pmap->num = 111;sprintf(map_char,"nihao");*/cdev_init(&chr_dev,&chr_ops);ret = alloc_chrdev_region(&ndev, 0, 1, CHR_DEV_NAME);if(ret < 0)return ret;printk("demo_init():major=%d,minor=%d\n", MAJOR(ndev),MINOR(ndev));ret = cdev_add(&chr_dev, ndev, 1);if(ret < 0)return ret;return 0;
}static void demo_exit(void)
{vfree(addr);printk("Removing chr_dev module...\n");cdev_del(&chr_dev);unregister_chrdev_region(ndev, 1);
}module_init(demo_init);
module_exit(demo_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("Xuhongzhi");
MODULE_DESCRIPTION("A char device driver as an example");

用户程序:

#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>#include <string.h>#include <stdio.h>
#define DEVICE_FILENAME "/dev/my_chr_dev"int main()
{int fd;char *ptrdata = NULL;fd = open(DEVICE_FILENAME, O_RDWR|O_NDELAY);if(fd >= 0){ptrdata=(char*)mmap(0,4096,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);// memcpy(ptrdata,"hihi",3);printf("%s \n", ptrdata);munmap(ptrdata, 4096);/*ptrdata=(char*)mmap(0,4096,PROT_READ | PROT_WRITE,MAP_SHARED,fd,4096);printf("%s", ptrdata);munmap(ptrdata, 4096);*/close(fd);}return 0;
}

运行结果


http://chatgpt.dhexx.cn/article/0Mkf1jhx.shtml

相关文章

MMAP技术

1. mmap 基础概念 mmap 即 memory map&#xff0c;也就是内存映射。 mmap 是一种内存映射文件的方法&#xff0c;即将一个文件或者其它对象映射到进程的地址空间&#xff0c;实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后&#xff…

mmap在嵌入式中的应用

大概雍正皇帝怎么也不会想到&#xff0c;自己在西历2022年的男生和女生眼里&#xff0c;会是截然不同的两种形象。 1 以我对身边同学朋友的观察&#xff0c;男生们大多爱看《雍正王朝》&#xff0c;他们眼中的雍正&#xff0c;大约是个推行了“火耗归公”、“摊丁入亩”等遏制…

Linux mmap原理

Linux mmap原理 前言Linux段页式内存管理mmapmmap内存映射原理文字概述mmap函数参数介绍源码解析1. 文件映射2. 缺页异常 mmap 和常规文件操作的区别mmap 使用的细节 小结 前言 mmap是linux操作系统提供给用户空间调用的内存映射函数&#xff0c;很多人仅仅只是知道可以通过mm…

Linux内存管理之mmap

目录 一. mmap系统调用 1. mmap系统调用 2. 系统调用munmap() 3. 系统调用msync() 二. 系统调用mmap()用于共享内存的两种方式&#xff1a; 三. mmap进行内存映射的原理 一. mmap系统调用 1. mmap系统调用 mmap将一个文件或者其它对象映射进内存。文件被映射到多…

Linux内核黑科技——mmap实现详解

前言&#xff1a;故事的开始是这样的&#xff0c;某天在脉脉上看到有人发了下面的帖子&#xff1a; 想不到 mmap 都成了黑科技了&#xff0c;为了让大家都能了解这个黑科技&#xff0c;所以还是写篇文章来详细介绍一下 mmap 的实现吧。 其实&#xff0c;源码分析是比较难写的&…

【Linux】Linux编程之 mmap解析

前言 虚拟内存系统通过将虚拟内存分割为称作虚拟页(Virtual Page&#xff0c;VP)大小固定的块&#xff0c;一般情况下&#xff0c;每个虚拟页的大小默认是4096字节。同样的&#xff0c;物理内存也被分割为物理页(Physical Page&#xff0c;PP)&#xff0c;也为4096字节。 一、…

讲一讲什么是 MMAP

1. mmap 基础概念 mmap 即 memory map&#xff0c;也就是内存映射。 mmap 是一种内存映射文件的方法&#xff0c;即将一个文件或者其它对象映射到进程的地址空间&#xff0c;实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后&#xff…

人工神经网络的应用有哪些方面,人工神经网络在生活中的应用

人工神经网络的应用 人工神经网络&#xff08;Artificial Neural Network&#xff0c;简称ANN &#xff09;&#xff0c;以数学模型模拟神经元活动&#xff0c;是基于模仿大脑神经网络结构和功能而建立的一种信息处理系统。人工神经网络具有自学习、自组织、自适应以及很强的非…

人工神经网络有哪些算法,神经网络都有哪些算法

人工神经网络分类方法 从20世纪80年代末期&#xff0c;人工神经网络方法开始应用于遥感图像的自动分类。 目前&#xff0c;在遥感图像的自动分类方面&#xff0c;应用和研究比较多的人工神经网络方法主要有以下几种&#xff1a;&#xff08;1&#xff09;BP&#xff08;BackP…

深度学习-人工神经网络概述

人工神经网络 简述 很多术语听起来很唬人&#xff0c;“人工神经网络”就属于其中之一。在很多人看来&#xff0c;我们对人类的神经系统还没有研究透彻&#xff0c;这就来了一个“人工的”神经网络&#xff0c;人脑这样复杂&#xff0c;那么人工神经网络一定相当高深莫测。如果…

人工神经网络的应用实例,人工神经网络实际应用

神经网络算法实例说明有哪些&#xff1f; 在网络模型与算法研究的基础上&#xff0c;利用人工神经网络组成实际的应用系统&#xff0c;例如&#xff0c;完成某种信号处理或模式识别的功能、构作专家系统、制成机器人、复杂系统控制等等。 纵观当代新兴科学技术的发展历史&…

人工神经网络算法实战教程

神经网络&#xff08;Artificial Neural Network&#xff0c;也称为人工神经网络&#xff0c;简称ANN&#xff09;具有通过示例学习能力。ANN是受生物神经元系统启发的的信息处理模型&#xff0c;它由大量高度互联的处理元素组成&#xff0c;这些处理元素被称神经元&#xff0c…

人工神经网络的三个要素,神经网络三要素是指

一个完整的人工神经网络包括 人工神经网络主要架构是由神经元、层和网络三个部分组成。整个人工神经网络包含一系列基本的神经元、通过权重相互连接。神经元是人工神经网络最基本的单元。 单元以层的方式组&#xff0c;每一层的每个神经元和前一层、后-层的神经元连接&#x…

人工神经网络连接方式,全连接神经网络作用

人工神经元网络的拓扑结构主要有哪几种&#xff1f;谢谢大侠~~~ 神经网络的拓扑结构包括网络层数、各层神经元数量以及各神经元之间相互连接的方式。人工神经网络的模型从其拓扑结构角度去看&#xff0c;可分为层次型和互连型。 层次型模型是将神经网络分为输入层&#xff08…

神经网络算法的具体流程,人工神经网络算法步骤

神经网络 算法 思路&#xff1f;能否提供一个最简单的代码&#xff1f; 30 。 最基本的BP算法&#xff1a;1&#xff09;正向传播&#xff1a;输入样本&#xff0d;>输入层&#xff0d;>各隐层&#xff08;处理&#xff09;&#xff0d;>输出层注1&#xff1a;若输出…

人工神经网络的基本原理

1.1 人工神经网络原理 MeCulloch 和 Pitts 基于对大脑神经元的研究提 出了人工神经元模型&#xff08;M-P 模型&#xff09;。人工神经元模型如下图所示。 M-P模型把神经元看作n个的输入对应产生1个输出&#xff0c;该模型的函数的表达式如下&#xff1a; 该表达式中W[W1,W2,W3…

人工智能神经网络的应用,人工神经网络最新应用

人工智能在如今人们的现实生活中&#xff0c;都有哪些趣味十足的应用&#xff1f; 人工智能&#xff0c;也被称为AI。研究和开发模拟、扩展和扩展人类智能的理论、方法、技术和应用系统是一门新兴的技术科学。 人工智能是计算机科学的一个分支&#xff0c;它试图理解智能的本…

人工智能实验bp神经网络,BP人工神经网络模型

1、BP人工神经网络方法 &#xff08;一&#xff09;方法原理 人工神经网络是由大量的类似人脑神经元的简单处理单元广泛地相互连接而成的复杂的网络系统。理论和实践表明&#xff0c;在信息处理方面&#xff0c;神经网络方法比传统模式识别方法更具有优势。人工神经元是神经网…

介绍人工神经网络的两种常用结构

神经网络有哪些主要分类规则并如何分类&#xff1f; 神经网络模型的分类。 人工神经网络的模型很多&#xff0c;可以按照不同的方法进行分类。其中&#xff0c;常见的两种分类方法是&#xff0c;按照网络连接的拓朴结构分类和按照网络内部的信息流向分类。 1。 按照网络拓朴…

人工神经网络基本构成有哪些,常见的人工神经网络有哪几种

人工神经网络分类方法 从20世纪80年代末期&#xff0c;人工神经网络方法开始应用于遥感图像的自动分类。目前&#xff0c;在遥感图像的自动分类方面&#xff0c;应用和研究比较多的人工神经网络方法主要有以下几种&#xff1a; &#xff08;1&#xff09;BP&#xff08;Back …