内核与用户态程序共享内存的方法

一、首先获取一块物理上连续的物理内存

有多种方法。

(a)通过kernel命令行参数预留一些内存

这种方法,适合于需要大块的物理连续的内存。

假设物理内存总量为256M。命令行参数中,指定 mem=224M。即只让内核使用前224M内存,忽略其余的内存。

这样,我们就有了32M的内存可用,内存起始物理地址为224*1024*1024。

在内核态,通过ioremap,就可以将此物理地址处的内存映射到内核空间。

不过,这种方法好像在X86_64架构下会有问题。在arm上,则没有发现问题。

有高手知道原因,还望指导一下^_^

(b)直接从内核申请一块内存

通过__get_free_pages(GFP_KERNEL,n); 从内核申请n个内存页。n好像必须是2的整数次方。

二、将内存映射到用户空间

通过上面的工作,内核中已经得到了此内存的虚拟地址,当然这是内核空间的虚拟地址。我们假设此地址保存在了void  *rsv_mem变量中。

接下来把他映射到用户空间。这个工作分两部分。一部分是内核态的工作,一部分是用户态的工作。

1. 内核态的工作

在内核态调用misc_register注册一个设备,此设备的其他方面,我们就不说了。

只说说file_operations中的mmap成员的实现。这个实现很简单,代码如下:

static int soft_wdt_mmap(struct file *filp, struct vm_area_struct *vma)

{

unsigned long pfn = (virt_to_phys(rsv_mem) >> PAGE_SHIFT);

if (remap_pfn_range(vma, vma->vm_start, pfn,

vma->vm_end - vma->vm_start,

vma->vm_page_prot))

return -EAGAIN;

return 0;

}

2. 用户态的工作

假设内存大小是8192字节。

int fd=open("/dev/my_dev", O_RDWR);

void *ptr_dev_mem==mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

好了,这就完成了用户态的映射了。

时间: 2024-10-13 02:35:26

内核与用户态程序共享内存的方法的相关文章

打通用户态程序和内核系列之一:用户态程序如何执行系统调用

前言 之前弄个一段时间内核,而最近在应用程序特别是C++ 方面开发多一些.当前日常工作中碰到一些性能分析.不同锁API选择的问题,发现由于对用户态程序API背后的工作原理,特别是它和内核的调用关系.在内核中具体实现过程不甚清楚,导致前期的预期无法进行分析.为此,打算结合工作中碰到的问题,比如: 用户态程序如何执行系统调用: 用户态锁的底层实现及其和内核态锁的关系如何: 用户态不同锁(自旋锁,读写锁,条件锁)和无锁机制的对比该如何做理论分析: ?Libaio 异步IO在内核中的具体使怎样实现的:

Linux用户态程序计时方式详解

前言 良好的计时器可帮助程序开发人员确定程序的性能瓶颈,或对不同算法进行性能比较.但要精确测量程序的运行时间并不容易,因为进程切换.中断.共享的多用户.网络流量.高速缓存访问及转移预测等因素都会对程序计时产生影响. 本文将不考虑这些影响因素(相关资料可参考<深入理解计算机系统>一书),而仅仅关注Linux系统中用户态程序执行时间的计算方式.除本文所述计时方式外,还可借助外部工具统计耗时,如<Linux调试分析诊断利器——strace>一文中介绍的strace. 本文示例代码的运行环

Linux用户态程序计时方式详解[转]

转自: http://www.cnblogs.com/clover-toeic/p/3845210.html 前言 良好的计时器可帮助程序开发人员确定程序的性能瓶颈,或对不同算法进行性能比较.但要精确测量程序的运行时间并不容易,因为进程切换.中断.共享的多用户.网络流量.高速缓存访问及转移预测等因素都会对程序计时产生影响. 本文将不考虑这些影响因素(相关资料可参考<深入理解计算机系统>一书),而仅仅关注Linux系统中用户态程序执行时间的计算方式.除本文所述计时方式外,还可借助外部工具统计耗时

linux内核中分配4M以上大内存的方法

在内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数,     "if (unlikely(order >= MAX_ORDER))        return NULL;"), page的大小一般是4K bytes, MAX_ORDER缺省定义为11, 所以如果不修改内核, kmalloc能够分配的最大连续内存一般是4M bytes. 内核中获取4M以上大内存的方法有三种: 1.修改MAX_ORDER,

Windows.用户态程序高效排错.2007.电子工业出版社(熊力)__笔记(杂)

ZC: 下面记录的页码编号(P.??)都是指 书的 页码,而非 PDF的页码 (书P.21 <--> Pdf.P.41) 1.P.32:SRV*D:\Symbols_Web*http://msdl.microsoft.com/download/symbols;C:\Symbols ZC: 各个 应该是使用 分号(";")隔开 ZC: VC6编译的Release,默认设置下,未发现 pdb文件 ZC: 应该把本地的目录写在前面:D:\XiongLi(被调试程序对应的symbo

Windows.用户态程序高效排错.2007.电子工业出版社(熊力)__代码保存

1.2.1.3 #include <stdio.h> #include <stdlib.h> char* getcharBuffer() { return "6969,3p3p"; } void changeto4p(char* buffer) { while (*buffer) { if (*buffer == '3') *buffer = '4'; buffer ++; } } void main() { printf("%s\n", &

[OS] 内核态和用户态的区别

http://blog.csdn.net/fatsandwich/article/details/2131707# http://jakielong.iteye.com/blog/771663 当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态).此时处理器处于特权级最高的(0级)内核代码中执行.当进程处于内核态时,执行的内核代码会使用当前进程的内核栈.每个进程都有自己的内核栈.当进程在执行用户自己的代码时,则称其处于用户运行态(用户态).即此时处理

内核态和用户态的区别(转)

http://blog.csdn.net/fatsandwich/article/details/2131707# http://jakielong.iteye.com/blog/771663 当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态).此时处理器处于特权级最高的(0级)内核代码中执行.当进程处于内核态时,执行的内核代码会使用当前进程的内核栈.每个进程都有自己的内核栈.当进程在执行用户自己的代码时,则称其处于用户运行态(用户态).即此时处理

多线程之:用户态和内核态的区别

一:大话版用户态和内核态 (1)用户态和内核态的概念? --->内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序--->用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取 (2)为什么需要用户态和内核态? --->由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 :用