`
izuoyan
  • 浏览: 9221553 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

在FreeBSD 用户空间与内核空间使用内存共享

阅读更多

kernel创建一设备分配内存, 并将内存地址通过d_mmap 映射, userland使用mmap!

参考/sys/dev/mem/memdev.c.

FreeBSD 7.1

kernel 代码:

#include <sys/cdefs.h>
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/conf.h>
#include <sys/uio.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/module.h>
#include <sys/priv.h>
#include <sys/disk.h>
#include <vm/vm.h>
#include <vm/pmap.h>

//#include <sys/bus.h>
//#include <machine/bus.h>

/* For use with destroy_dev(9). */
static struct cdev *memio_dev;

static d_write_t memio_write;
static d_ioctl_t memio_ioctl;
static d_read_t memio_read;
static d_mmap_t memio_mmap;

#define MEMIO_MINOR 212

static struct cdevsw memio_cdevsw = {
.d_version = D_VERSION,
.d_read = memio_read,
.d_write = memio_write,
.d_ioctl = memio_ioctl,
.d_mmap = memio_mmap,
.d_name = "memio",
};

static void *zbuf;

static int
memio_read(struct cdev *dev __unused, struct uio *uio, int flags __unused)
{
int error = 0;

while (uio->uio_resid > 0 && error == 0)
error = uiomove(zbuf, MIN(uio->uio_resid, PAGE_SIZE), uio);

return error;
}
/* ARGSUSED */
static int
memio_write(struct cdev *dev __unused, struct uio *uio, int flags __unused)
{
int error = 0;
while( uio->uio_resid > 0 && error == 0 )
error = uiomove(zbuf, MIN(uio->uio_resid, PAGE_SIZE), uio);
return (0);
}

static int
memio_mmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr,
int prot __unused)
{
*paddr = vtophys( zbuf );
return (0);
}

/* ARGSUSED */
static int
memio_ioctl(struct cdev *dev __unused, u_long cmd, caddr_t data __unused,
int flags __unused, struct thread *td)
{
int error;

if (cmd != DIOCSKERNELDUMP)
return (ENOIOCTL);
error = priv_check(td, PRIV_SETDUMPER);
if (error)
return (error);
return (set_dumper(NULL));
}


/* ARGSUSED */
static int
memio_modevent(module_t mod __unused, int type, void *data __unused)
{
switch(type) {
case MOD_LOAD:
if (bootverbose)
printf("memio: <memio device>\n");
zbuf = (void *)malloc(PAGE_SIZE, M_TEMP, M_WAITOK | M_ZERO);
memcpy( zbuf, "hello from kernel", 18 );

memio_dev = make_dev(&memio_cdevsw, MEMIO_MINOR, UID_ROOT,
GID_WHEEL, 0666, "memio");
uprintf( "load memio module.\n" );
break;

case MOD_UNLOAD:
destroy_dev(memio_dev);
free(zbuf, M_TEMP);
uprintf( "unload memio module.\n" );
break;

case MOD_SHUTDOWN:
break;

default:
return (EOPNOTSUPP);
}

return (0);
}

DEV_MODULE(memio, memio_modevent, NULL);
MODULE_VERSION(memio, 1);

Makefile

SRCS = main.c
KMOD = memio
KO = $(KMOD).ko
KLDMOD = t

.include <bsd.kmod.mk>

userland test代码

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>

#define PAGE_SIZE 4096

int main ( int argc, char **argv )
{
int configfd;
configfd = open("/dev/memio", O_RDWR);
if(configfd < 0) {
perror("open");
return -1;
}

char * address = NULL;
address = mmap(NULL, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, configfd, 0);
if (address == MAP_FAILED) {
perror("mmap");
return -1;
}

printf("address=%p\n", address );
printf("initial message: %s\n", address);
memcpy(address + 11 , "*user*", 6);
printf("changed message: %s\n", address);
close(configfd);
return 0;
}

分享到:
评论

相关推荐

    FreeBSD操作系统设计与实现

    2.1 FreeBSD的功能和内核 2.2 内核结构 2.3 内核服务 2.4 进程管理 2.4.1 信号 2.4.2 进程组和会话 2.5 内存管理 2.5.1 BSD内存管理设计要点 2.5.2 内核中的内存管理 2.6 I/O系统 2.6.1 描述符与I/O 2.6.2 描述符...

    FreeBSD系统结构手册

    8. **系统调用**:FreeBSD提供了一系列系统调用来实现用户空间与内核空间的交互,如open、read、write、fork、exec等。 9. **性能优化**:如何通过调整内核配置、系统参数来优化FreeBSD的性能,例如内核编译选项、...

    FreeBSD系统编程

    系统调用是用户空间程序与内核交互的方式,用于请求内核执行特定的操作。 **4.4 信号处理** 信号处理是指如何设置和响应信号的行为,包括默认行为、忽略信号等。 **4.5 信号掩码** 信号掩码用于控制信号是否可以...

    基于FreeBSD的Proftpd虚拟用户SQL认证及配额实现.pdf

    这种基于FreeBSD和Proftpd的解决方案适合企业或学校内部文件共享,特别是在需要控制文件访问权限、限制用户存储空间和确保数据安全的环境中。通过这种方式,可以构建一个高效、安全的企业级FTP服务器,同时避免了...

    FreeBSD官方系统结构手册(中文版)

    - **微内核与宏内核**:FreeBSD采用的是宏内核设计,其中大部分系统服务都在内核空间运行,提供高效的系统调用接口。 - **多线程内核**:支持同时执行多个内核线程,提高了系统的并发处理能力。 - **虚拟内存管理...

    Unix内核11111111.zip

    2. **虚拟内存管理**:Unix内核实现了虚拟内存系统,允许程序使用比物理内存更大的地址空间。它通过页面交换机制在需要时将数据从硬盘调入内存,提高了系统的资源利用率。 3. **文件系统**:Unix的文件系统是其核心...

    macOS内核darwin的开源项目

    XNU代表“X is Not Unix”,是一个融合了Mach微内核、BSD系统调用接口和FreeBSD用户空间组件的混合内核。XNU的设计理念是提供高效的系统服务,同时保持与传统UNIX系统的兼容性。 在XNU内核中,有以下几个关键组成...

    FreeBsd 7.0特性预览胶片

    尽管它允许用户级代码在多个处理器上运行,但内核级别的执行受到“巨型锁”的限制,这意味着每次只能有一个进程在内核空间执行。此外,设备中断可以并行处理,但存在一定的约束条件。 这种历史上的 BSD 内核架构...

    全用户态服务开发套件F-Stack.pdf

    为了解决这个问题,F-Stack采用了一种称为Kernel Bypass的技术,通过DPDK(Data Plane Development Kit)绕过内核,直接在用户空间处理L2/L3层的网络流量,从而避免了内核中的调度和锁竞争,提高了数据处理速度。...

    操作系统(内存管理)

    在对内存块进行了 free 调用之后,我们需要做的是诸如将它们标记为未被使用的等事情,并且,在调用 malloc 时,我们要能够定位未被使用的内存块。因此, malloc 返回的每块内存的起始处首先要有这个结构: 清单 3...

    Understanding the Linux Kernel 3rd

    - **内核与用户空间交互**:描述了内核与用户空间之间进行通信的方式,包括系统调用接口、共享内存、信号传递等机制。 ### 知识点七:内存寻址(2章) - **内存地址概念**:介绍了内存地址的基础知识,包括物理...

    操作系统开发的基本介绍及指南

    - **宏内核**:几乎所有服务都在内核空间中运行,如 Linux。 - **类 Unix 系统**:遵循 Unix 的设计理念和标准,如 FreeBSD。 #### 三、开发步骤 **3.1 选择编程语言** 大多数操作系统使用 C 语言编写,因为 C ...

    操作系统概念及常见的操作系统

    它包括静态和动态内存分配,虚拟内存技术,以及页面置换算法等,旨在有效地利用有限的内存资源,防止内存泄漏,并提高内存的使用效率。 文件管理负责文件的存储、检索、保护和删除。操作系统提供文件系统,组织和...

    linux安装oracle.pdf

    例如,需要确保系统有足够的内存和交换空间,安装glibc、gcc等开发工具包,设置内核参数如文件句柄数、内核共享内存和信号量等。此外,还需要创建Oracle安装所需的用户和组,为Oracle数据库软件安装的文件指定特定的...

    netmap - a novel framework for fast packet IO

    在用户空间Click和其他数据包转发应用中,使用基于Netmap的libpcap仿真库也实现了显著的速度提升(5倍以上)。 #### 引言:高数据包I/O的需求 通用操作系统提供了丰富且灵活的环境,用于执行包括数据包处理、网络...

    virtualBox.rar

    在使用过程中,用户可以根据需要创建新的虚拟机,选择合适的操作系统类型,分配内存和硬盘空间,然后安装操作系统。一旦安装完成,虚拟机就可在VirtualBox中像实体机器一样独立运行,实现多系统的并行操作。

    作業系統導論

    3. **微内核结构**:核心功能非常少,大部分服务运行在用户空间。 4. **客户-服务器模型**:将操作系统的服务实现为客户机/服务器架构。 #### 五、作业系统操作 作业系统操作涉及对各种资源和服务的管理和调度。...

Global site tag (gtag.js) - Google Analytics