Linux谁访问这个内存,Linux中的直接内存访问
我正在尝试直接访问嵌入式Linux项目的物理内存,但我不确定如何最好地为我的内容指定内存.
如果我定期启动我的设备,并访问/ dev/mem,我可以轻松地读取和写入我想要的任何地方.但是,在这里,我正在访问可以轻松分配给任何进程的内存; 这是我不想做的
我的/ dev/mem代码是(所有错误检查等删除):
mem_fd = open("/dev/mem", O_RDWR));
mem_p = malloc(SIZE + (PAGE_SIZE - 1));
if ((unsigned long) mem_p % PAGE_SIZE) {
mem_p += PAGE_SIZE - ((unsigned long) mem_p % PAGE_SIZE);
}
mem_p = (unsigned char *) mmap(mem_p, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, mem_fd, BASE_ADDRESS);
这很有效.但是,我想使用其他人无法触及的记忆.我已经尝试通过使用mem = XXXm启动来限制内核看到的内存量,然后将BASE_ADDRESS设置为高于该值(但低于物理内存),但它似乎并不是一致地访问相同的内存.
根据我在网上看到的内容,我怀疑我可能需要一个使用ioremap()或remap_pfn_range()(或两者兼而有之)的内核模块(可以),但我完全不知道如何; 有人可以帮忙吗?
编辑:我想要的是一种总是访问相同物理内存(比如,1.5MB)的方法,并将该内存放在一边,以便内核不会将其分配给任何其他进程.
我正在尝试重现我们在其他操作系统中的系统(没有内存管理),我可以通过链接器在内存中分配一个空间,并使用类似的方式访问它
*(unsigned char *)0x12345678
EDIT2:我想我应该提供更多细节.此内存空间将用于RAM缓冲区,以用于嵌入式应用程序的高性能日志记录解决方案.在我们拥有的系统中,在软重启期间没有什么可以清除或扰乱物理内存.因此,如果我向物理地址X写入一个位并重新启动系统,则重新启动后仍将设置相同的位.这已经在运行VxWorks的完全相同的硬件上进行了测试(这种逻辑在不同平台上的Nucleus RTOS和OS20上也很好用,FWIW).我的想法是通过直接解决物理内存在Linux中尝试相同的事情; 因此,每次启动时都必须获得相同的地址.
我应该澄清这是针对内核2.6.12和更新的.
EDIT3:这是我的代码,首先是内核模块,然后是用户空间应用程序.
要使用它,我用mem = 95m启动,然后insmod foo-module.ko,然后mknod mknod/dev/foo c 32 0,然后运行foo-user,它会死掉.在gdb下运行表明它在赋值时死了,虽然在gdb中,我无法取消引用从mmap获得的地址(虽然printf可以)
FOO-的module.c
#include
#include
#include
#include
#include
#include
#define VERSION_STR "1.0.0"
#define FOO_BUFFER_SIZE (1u*1024u*1024u)
#define FOO_BUFFER_OFFSET (95u*1024u*1024u)
#define FOO_MAJOR 32
#define FOO_NAME "foo"
static const char *foo_version = "@(#) foo Support version " VERSION_STR " " __DATE__ " " __TIME__;
static void *pt = NULL;
static int foo_release(struct inode *inode, struct file *file);
static int foo_open(struct inode *inode, struct file *file);
static int foo_mmap(struct file *filp, struct vm_area_struct *vma);
struct file_operations foo_fops = {
.owner = THIS_MODULE,
.llseek = NULL,
.read = NULL,
.write = NULL,
.readdir = NULL,
.poll = NULL,
.ioctl = NULL,
.mmap = foo_mmap,
.open = foo_open,
.flush = NULL,
.release = foo_release,
.fsync = NULL,
.fasync = NULL,
.lock = NULL,
.readv = NULL,
.writev = NULL,
};
static int __init foo_init(void)
{
int i;
printk(KERN_NOTICE "Loading foo support module\n");
printk(KERN_INFO "Version %s\n", foo_version);
printk(KERN_INFO "Preparing device /dev/foo\n");
i = register_chrdev(FOO_MAJOR, FOO_NAME, &foo_fops);
if (i != 0) {
return -EIO;
printk(KERN_ERR "Device couldn't be registered!");
}
printk(KERN_NOTICE "Device ready.\n");
printk(KERN_NOTICE "Make sure to run mknod /dev/foo c %d 0\n", FOO_MAJOR);
printk(KERN_INFO "Allocating memory\n");
pt = ioremap(FOO_BUFFER_OFFSET, FOO_BUFFER_SIZE);
if (pt == NULL) {
printk(KERN_ERR "Unable to remap memory\n");
return 1;
}
printk(KERN_INFO "ioremap returned %p\n", pt);
return 0;
}
static void __exit foo_exit(void)
{
printk(KERN_NOTICE "Unloading foo support module\n");
unregister_chrdev(FOO_MAJOR, FOO_NAME);
if (pt != NULL) {
printk(KERN_INFO "Unmapping memory at %p\n", pt);
iounmap(pt);
} else {
printk(KERN_WARNING "No memory to unmap!\n");
}
return;
}
static int foo_open(struct inode *inode, struct file *file)
{
printk("foo_open\n");
return 0;
}
static int foo_release(struct inode *inode, struct file *file)
{
printk("foo_release\n");
return 0;
}
static int foo_mmap(struct file *filp, struct vm_area_struct *vma)
{
int ret;
if (pt == NULL) {
printk(KERN_ERR "Memory not mapped!\n");
return -EAGAIN;
}
if ((vma->vm_end - vma->vm_start) != FOO_BUFFER_SIZE) {
printk(KERN_ERR "Error: sizes don't match (buffer size = %d, requested size = %lu)\n", FOO_BUFFER_SIZE, vma->vm_end - vma->vm_start);
return -EAGAIN;
}
ret = remap_pfn_range(vma, vma->vm_start, (unsigned long) pt, vma->vm_end - vma->vm_start, PAGE_SHARED);
if (ret != 0) {
printk(KERN_ERR "Error in calling remap_pfn_range: returned %d\n", ret);
return -EAGAIN;
}
return 0;
}
module_init(foo_init);
module_exit(foo_exit);
MODULE_AUTHOR("Mike Miller");
MODULE_LICENSE("NONE");
MODULE_VERSION(VERSION_STR);
MODULE_DESCRIPTION("Provides support for foo to access direct memory");
FOO-user.c的
#include
#include
#include
#include
#include
int main(void)
{
int fd;
char *mptr;
fd = open("/dev/foo", O_RDWR | O_SYNC);
if (fd == -1) {
printf("open error...\n");
return 1;
}
mptr = mmap(0, 1 * 1024 * 1024, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, fd, 4096);
printf("On start, mptr points to 0x%lX.\n",(unsigned long) mptr);
printf("mptr points to 0x%lX. *mptr = 0x%X\n", (unsigned long) mptr, *mptr);
mptr[0] = 'a';
mptr[1] = 'b';
printf("mptr points to 0x%lX. *mptr = 0x%X\n", (unsigned long) mptr, *mptr);
close(fd);
return 0;
}
Linux谁访问这个内存,Linux中的直接内存访问相关推荐
- linux交换内存_Linux中的交换内存如何工作?
linux交换内存 To understand what Swap memory in Linux is, we will have a look at the concept of RAM and ...
- java 数组 内存_Java 中数组的内存分配
Java 中数组的内存分配 1.Java 程序在运行时,需要在内存中分配空间.为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理方式. 2.数组基本概念 数组是 ...
- php禁止直接访问网页,动态网页中不让直接访问PHP程序文件
由于我们有需要用到某些php文件,而又不希望别人直接访问这个文件,我们可以在包含文件比如global.php中定义一个参数,在被访问页面data.php前面判断是否定义了该参数,没有定义则禁止访问 在 ...
- java的四个访问修饰符_Java中的四种访问修饰符
Java中修饰符分为两种:访问修饰符和非访问修饰符.修饰符中,有一些修饰符可以既可以修饰类,也可以修饰方法,但是有一些修饰符只能修饰符方法. 今天这篇文章先介绍一下四种访问修饰符. 1.private ...
- android surfaceflinger内存,surfaceflinger中的显示内存管理类
1. Android中的应用层每申请一个Surface,最终会通过jni和binder调用到surfaceflinger中,最终会创建一个Layerxxx(Layer,LayerBuffer,Lay ...
- python子进程 内存,python中的子进程内存使用情况
How can one measure/benchmark maximum memory usage of a subprocess executed within python? 解决方案 I ma ...
- 磁盘不足 导致内存 linux,为什么 Linux 需要 Swapping,仅仅是内存不够用?
对 Linux 稍有了解的人都知道,Linux 会将物理的随机读取内存(Random Access Memory.RAM)按页分割成 4KB 大小的内存块,而今天要介绍的 Swapping 机制就与内 ...
- linux内存回收(二)--直接内存回收机制
上一章,我们学习了kswapd的内存回收的机制,其本身是一个内核线程,它和调用者的关系是异步的,那么本章就开始学习内核的内存回收的方式.因为在不同的内存分配路径中,会触发不同的内存回收方式,内存回收针 ...
- Linux云计算好学吗?Linux运维学习资料 Centos8文件权限管理
linux运维云计算/Linux全套百集大系列/Centos7-Centos8/全网最新Linux架构师教程_哔哩哔哩_bilibili 第七章 Centos8-文件权限管理 本节所讲内容: 7.1 ...
- qt内存泄漏检测_qt 关于内存泄漏的检测
Qt 关于内存泄露的检测: 工具篇关于Qt 内存泄露的检测工具有很多种,一下挑几种来说: 1.检测已分配资源, 第一个工具是一个内存资源使用的监听器.它只能在模拟器上进行调试.可以使用快捷键来调用 按 ...
最新文章
- 高效代码审查:来自前质疑者的9个建议
- 拓扑排序(字典序最小,字典序最小)
- boost::depth_first_search用法的测试程序
- 计算机机房t4,机房等级-T2-T3-T4-如何划分
- composer-安装插件包
- Windows10 下搭建汇编语言开发环境( 利用 DOSBOX 和 MASM32 )
- dedecms织梦模板|绿色仿下载吧网站织梦dede模板源码
- urllib2的用法
- idea java mapper.xml文件sql黄色背景解决
- 如何在套接字IO操作上设置超时机制
- Program Variant Scheduling job
- python简单计算器异常处理_Python计算器(正确除零)
- JavaWeb公交调度系统的设计与实现
- 基于R语言时间序列的平稳时间序列模型预测
- Android 动画 - TranslateAnimation位移动画
- 合影效果java_6个姿势,教你拍好合影
- 环境光传感器--OPT3001,硬件开发与程序设计
- 数据结构和算法(Java),上
- Python套壳ImageMagick实现图片格式批量转换
- matlab 残差 dw,Eviews中的自相关检验与修正操作(一):残差图与DW检验