/dev/mem

Linux系统 mmap 存储映射 括号中表示预期行为,括号外部的表示在LINUX系统中的实际行为,比如组合SHARED/EXEC的读行为,对于一个可执行的共享地址来说,没有给与PROT_READ属性,预期当然不可读,但是由于CPU执行上面的代码,必须要进行读操作,而实际的硬件架构和及并没有区分执行读和其它方式的读,所以,实际上对于这样的内存,仍然是可读的。从上图中可以看到,这段匿名区域(可能是MMAP区域,现在的MALLOC都用MMAP实现)地址是向下增长的,像栈一样,就像前面提到的第二种情况,这是在哪里控制的呢? 阅读详情
/dev/mem 是物理内存的全映像,可以用来访问物理内存,一般用法是open("/dev/mem",O_RDWR|O_SYNC),然后mmap,接着就可以用mmap的地址来访问物理内存,这实际上就是实现用户空间驱动的一种方法。

有几个论据倾向于用户空间编程,有时编写一个所谓的用户空间设备驱动对比钻研内核是一个明智的选择,用户空间驱动的好处在于:

  1. 完整的C库可以链接,驱动可以进行许多奇怪的任务,而不用依靠外面的程序(实现使用策略的工具程序,常常随着驱动自身发布)。  
  2. 程序员可以在驱动代码上运行常用的调试器,而不必调试一个运行中的内核的弯路。  
  3. 如果一个用户空间驱动挂起了,你可以简单地杀死它。用户空间驱动出现问题不可能挂起整个系统,除非被控制的硬件真的疯掉了。  
  4. 用户内存是可交换的,不像内核内存。这样一个不常使用却有很大一个驱动的设备不会占据别的程序可以用到的RAM,除了在它实际在用时。  
  5. 一个精心设计的 驱动程序仍然可以如同内核空间驱动一样允许对设备的并行存取。  
  6. 如果你必须编写一个封闭源码的驱动,用户空间的选项使你容易辨明不明朗的许可的情况和改变的内核接口带来的问题。  
完整的C库可以链接,驱动可以进行许多奇怪的任务,而不用依靠外面的程序(实现使用策略的工具程序,常常随着驱动自身发布)。
程序员可以在驱动代码上运行常用的调试器,而不必调试一个运行中的内核的弯路。
如果一个用户空间驱动挂起了,你可以简单地杀死它。用户空间驱动出现问题不可能挂起整个系统,除非被控制的硬件真的疯掉了。
用户内存是可交换的,不像内核内存。这样一个不常使用却有很大一个驱动的设备不会占据别的程序可以用到的RAM,除了在它实际在用时。
一个精心设计的 驱动程序仍然可以如同内核空间驱动一样允许对设备的并行存取。
如果你必须编写一个封闭源码的驱动,用户空间的选项使你容易辨明不明朗的许可的情况和改变的内核接口带来的问题。

但是,用户空间的设备驱动有几个缺点,最重要的是:

  1. 中断在用户空间无法使用,在某些平台上有对这个限制的解决方法,例如在IA32体系结构上的vm86系统调用。  
  2. 只可能通过内存映射/dev/mem来使用DMA,而且只有特权用户可以这样做。  
  3. 存取I/O端口只能在调用ioperm或者iopl只有,此外,不是所有的平台都支持这些系统调用,而存取/dev/port可能太慢而无效率,这些系统调用和设备文件都要求特权用户。  
  4. 响应时间慢,因为需要上下文切换在用户和硬件之间传递消息和动作。  
  5. 更坏的是,如果驱动已经被交换到硬盘,响应时间会长到不可接受,使用mlock系统调用可能会有帮助,但是你需要经常锁住许多内存页,因为一个用户空间程序依赖大量的库代码,mlock也限制在授权用户上。  
  6. 最重要的设备不能在用户空间处理,包括网络接口和块设备。  
中断在用户空间无法使用,在某些平台上有对这个限制的解决方法,例如在IA32体系结构上的vm86系统调用。
只可能通过内存映射/dev/mem来使用DMA,而且只有特权用户可以这样做。
存取I/O端口只能在调用ioperm或者iopl只有,此外,不是所有的平台都支持这些系统调用,而存取/dev/port可能太慢而无效率,这些系统调用和设备文件都要求特权用户。
响应时间慢,因为需要上下文切换在用户和硬件之间传递消息和动作。
更坏的是,如果驱动已经被交换到硬盘,响应时间会长到不可接受,使用mlock系统调用可能会有帮助,但是你需要经常锁住许多内存页,因为一个用户空间程序依赖大量的库代码,mlock也限制在授权用户上。
最重要的设备不能在用户空间处理,包括网络接口和块设备。

综上,用户空间驱动不能做的事情毕竟太多,感兴趣的应用程序还是存在:对SCSI扫描器设备的支持(由SANE包实现)和CD刻录机(由cdrecord和别的工具实现)。在两种情况下,用户级别的设备情况依赖"SCSI generic"内核驱动,它输出了底层的SCSI功能给用户程序,因此它们可以驱动它们自己的硬件。

当你开始处理新的没有用过的硬件时,通过开发用户空间驱动,你可以学习去管理你的硬件,不必担心挂起整个系统,一旦你完成了,在一个内核模块中封装软件就会是一个简单的操作了。

Notes: 新内核已经限制/dev/mem中1M以上的内存访问,这是一个可配置的选项CONFIG_STRICT_DEVMEM,在我的机器上已经选择n了,可是好像还是只能映射1M一下物理内存。

在ULCC中通过mmap映射物理内存地址到虚拟地址,实现物理页的noncacheable,这主要是通过映射/dev/mem修改PAT中的页面属性达到的。X86的页面属性表(PAT)能够在页面粒度上设置内存属性,PAT是对MTRR的补充,通过MTRR可以为物理地址区域设置内存类型,但是PAT比MTRR更灵活,因为它可以在页面级别设置属性,而且硬件上也不限制属性设置的数量。PAT相当灵活,即使多个虚拟地址映射到同一个物理内存地址,也不会引起内存类型的冲突,通过PAT能够设置多种类型的内存属性,其中最常用的有4种:Write-Back、Ucached、Write-Combined、Uncached-Minux。

  1. fm = open("/dev/mem", O_RDWR|O_SYNC);  
  2. mmap((void *)addr, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, fm, pfn<<PAGE_SHIFT);  
fm = open("/dev/mem", O_RDWR|O_SYNC);
mmap((void *)addr, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, fm, pfn<<PAGE_SHIFT);

/dev/kmem:内核看到的虚拟内存的全映像,可以用来访问kernel的内容。

 

What Is /proc/kcore?
None of the files in /proc are really there--they're all, "pretend," files made up by the kernel, to give you information about the system and don't take up any hard disk space.

/proc/kcore is like an "alias" for the memory in your computer. Its size is the same as the amount of RAM you have, and if you read it as a file, the kernel does memory reads.

利用mmap /dev/mem 读写Linux内存 使用 hexedit /dev/mem 可以显示所有物理内存中的信息。 运用mmap将/dev/mem map出来,然后直接对其读写可以实现用户空间的内核操作。 以下是我写的一个sample #include #include #include #include #inclu 阅读详情

相关推荐

Linux中dev/mem和dev/kmem的区别及编程实例

dev/kmem是另一个字符设备文件,它提供了对内核空间的直接访问。与dev/mem类似,访问dev/kmem也需要root权限或相应的特权。但需要注意的是,对于现代Linux系统,访问dev/mem需要root权限或者相应的特权。请注意,在使用dev/mem和dev/kmem时要格外小心,因为直接访问物理内存和内核空间可能导致系统的不稳定性和安全性问题。在Linux系统中,dev/mem和dev/kmem是两个特殊的设备文件,它们提供了对系统物理内存和内核空间的直接访问。

CodeSpark的博客 637

Linux系统“/dev/mem”设备使用详解(Hi3520D)

“/dev/mem”是linux系统中内核所有物理地址空间全映像的一个虚拟字符设备,与mmap结合使用,用户态可以直接访问内核态物理地址空间。

只要思想不滑坡,想法总比问题多。 2万+

Windows环境下如何通过MCP Server实现MySQL安全连接与AI集成?

本文详细介绍了在Windows环境下如何通过MCP Server实现MySQL安全连接与AI集成。MCP Server作为大模型与MySQL之间的安全通道,提供权限控制、SSL加密和协议转换功能,显著提升查询性能。文章包含环境配置、安装指南、安全策略及实战案例,帮助开发者高效实现AI与数据库的安全交互。

hill8的博客 719

/dev/mem可没那么简单

这几天研究了下/dev/mem,发现功能很神奇,通过mmap可以将物理地址映射到用户空间的虚拟地址上,在用户空间完成对设备寄存器的操作,于是上网搜了一些/dev/mem的资料。网上的说法也很统一,/dev/mem是物理内存的全映像,可以用来访问物理内存,一般用法是open("/dev/mem",O_RDWR|O_SYNC),接着就可以用mmap来访问物理内存以及外设的IO资源,这就是实现用户空间驱动的一种方法。 用户空间驱动听起来很酷,但是对于/dev/mem,我觉得没那么简单,有2个地方引起我的怀疑: (

做一个有技术追求的人 4万+

深入理解「二进制掩码」:从原理到实践

二进制掩码本质上是一个二进制数,用于通过位操作(如与、或、非、异或等)选择性地操作目标数据的某些位。掩码的每一位(bit)可以看作一个“开关”,决定是否对目标数据的对应位进行操作。二进制掩码是位操作的灵魂,掌握它不仅能提升代码效率,还能解锁许多高级编程技巧。从基础的位提取到复杂的子集枚举,掩码的应用无处不在。希望本文的讲解和代码示例能帮助你快速上手,并在实际项目中灵活运用。如果你有更多关于掩码的疑问或应用场景,欢迎在评论区留言交流!

m0_73494933的博客 2432

在Ubuntu22.04.2远程服务器上搭建OHIF+Orthanc

在Ubuntu远程服务器上不翻墙,但是本地windows需要科学上网开始之前,首先在终端输入export -p查看是否有代理端口如下如果有就关了,输入如下命令。

weixin_51116549的博客 1333

Linux /dev/mem的新玩法

/dev/mem里有什么 简单来讲,/dev/mem是系统物理内存的映像文件,然而这里的 “物理内存” 需要进一步解释。 物理内存是指我们插在内存槽上的内存条吗?当然是,但物理内存不单单指内存条。 物理内存严格来讲应该是指 物理地址空间 ,内存条只是映射到这个地址空间的一部分,其余的还有各种PCI设备,IO端口等。我们可以从/proc/iomem中看到这个映射: [root@localhost m...

TCP/IP 8890

基于dify平台批量分析excel格式信息

如何以表格形式批量输入一些信息,然后让大模型以对话应用形式逐条进行推理分析?请逐行分析以下数据,给出推理结果:{{input}}这里提供一个分步解决方案,结合。

knightissocool的博客 8008

/dev/mem 实现原理

这几天研究了下/dev/mem。发现功能非常奇妙,通过mmap能够将物理地址映射到用户空间的虚拟地址上。在用户空间完毕对设备寄存器的操作,于是上网搜了一些/dev/mem的资料。 网上的说法也非常统一,/dev/mem是物理内存的全映像,能够用来訪问物理内存,一般使用方法是open("/dev/mem",O_RDWR|O_SYNC),接着就能够用mmap来訪问物理内存以及外设的IO资源,这就是实现用户空间驱动的一种方法。用户空间驱动听起来非常酷。可是对于/dev/mem,我认为没那么简单,有2个地方.

liyucheng987的博客 3057

Topas——基于Geant4的放射治疗蒙特卡罗算法模拟工具

本文内容参考Joseph Perl 的线上会议,视频详情可见于,该视频会议内容主要介绍Topas功能、软件架构、工作流程、参数设定、物理模型、具体案例等,对TOPAS的基本入门使用方法以及使用规定作出阐述。

fy方的博客 7601

基于Keil软件实现OLED显示(江协科技HAL库)

没有HAL库的OLED驱动文件,可以看过来

2401_82728381的博客 1452

Linux下/dev/mem和/dev/kmem及操作gpio实例

Linux下/dev/mem和/dev/kmem的区别: /dev/mem: 物理内存的全镜像。可以用来访问物理内存。 /dev/kmem: kernel看到的虚拟内存的全镜像。可以用来访问kernel的内容。 作用: 前者用来访问物理IO设备,比如X用来访问显卡的物理内存,或嵌入式中访问GPIO。用法一般就是open,然后mmap,接着可以使用map之后的地址来访问物理内存。这其实就是实

williamwanglei的专栏 9533

K8s(二十一):在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从)

🔴 K8s(二十一):在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从)

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 3万+

linux /dev/mem /dev/kmem驱动分析

/dev/mem说明驱动注册用户空间调用mmap方法/dev/mem/dev/kmem 说明 /dev/mem”是linux系统的一个虚拟字符设备,无论是标准linux系统还是嵌入式linux系统,都支持该设备。 物理内存的全镜像。可以用来访问物理内存 /dev/kmem: kernel看到的虚拟内存的全镜像。可以用来访问kernel的内容。kernel部分内存用户空间本不可访问。但是因为所有进程共享内核空间的页表。所以内核虚拟地址对应物理地址是确定的。kmem的作用即是根据kernel的虚拟地址,找到对应

深海 3489

【报错解决】OpenClaw 报错 FetchError: request to [https://registry.npmjs.org/](https://registry.npmjs.or

在国产基础软件与云原生生态逐步成熟的背景下,越来越多的开发者开始尝试将 Web 前端、AI 推理、系统服务等组件部署到国产操作系统与国产云环境中。我所在的项目正是这样一个场景: 我们基于 OpenClaw 构建一套云端 AI 管理平台,用于统一管理模型服务、前端控制台与后台 API。

博客 1752

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

dev/mem

原文地址blog.youkuaiyun.com/skyflying2012/article/details/47611399 /dev/mem是物理内存的全映像,可以用来访问物理内存,一般用法是open("/dev/mem",O_RDWR|O_SYNC),然后mmap,接着就可以用mmap的地址来访问物理内存,这实际上就是实现用户空间驱动的一种方法。。 用户空间驱动听起来很酷,但是对于/dev

tangtang_yue的博客 1972

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

/dev/mem学习

这几天研究了下/dev/mem。发现功能非常奇妙,通过mmap能够将物理地址映射到用户空间的虚拟地址上。在用户空间完毕对设备寄存器的操作,于是上网搜了一些/dev/mem的资料。 网上的说法也非常统一,/dev/mem是物理内存的全映像,能够用来訪问物理内存,一般使用方法是open("/dev/mem",O_RDWR|O_SYNC),接着就能够用mmap来訪问物理内存以及外设的IO资源,这...

zjy900507的博客 836

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

关于/dev/mem学习

/dev/mem,通过mmap可以将物理地址映射到用户空间的虚拟地址上,在用户空间完成对设备寄存器的操作,/dev/mem是物理内存的全映像,可以用来访问物理内存,一般用法是open("/dev/mem",O_RDWR|O_SYNC),接着就可以用mmap来访问物理内存以及外设的IO资源,这就是实现用户空间驱动的一种方法。 关于mmap原理 映射就是建立一种一一对应关系,在这里主要是指硬盘上文件的...

qq_33789039的博客 813
上一篇: 函数fopen
下一篇: 简单的I2C协议理解
独角鲸
博客等级 码龄16年 24粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值