Linux下用户态和内核态内存共享的实现

合集下载

linux 驱动 内核态与用户态的方法

linux 驱动 内核态与用户态的方法

linux驱动内核态与用户态的方法一、引言Linux操作系统以其高效、稳定和开源的特点,广泛应用于各种硬件设备。

驱动程序作为操作系统与硬件设备之间的桥梁,对于系统稳定性和性能至关重要。

在驱动程序的开发过程中,了解内核态与用户态的方法是至关重要的。

本文将详细介绍这两种状态下进行驱动程序开发的方法。

二、内核态开发1.权限与状态:在Linux中,内核态是操作系统内核空间,需要以root权限运行。

驱动程序在内核态下运行,可以对硬件设备进行直接操作。

2.内存管理:在内核态下,驱动程序可以直接访问物理内存,因此需要熟练掌握内存管理技巧,包括内存分配、释放、共享和保护等。

3.设备驱动模型:Linux提供了设备驱动模型,通过它可以方便地编写与硬件设备交互的代码。

了解设备驱动模型的结构和机制,是内核态驱动程序开发的基础。

4.中断与轮询:中断和轮询是驱动程序与硬件设备交互的主要方式。

了解这两种机制的工作原理,能够更好地编写驱动程序。

5.模块加载与卸载:内核态下的驱动程序通常以模块形式加载,了解模块加载与卸载的机制,能够更方便地编写和管理驱动程序。

三、用户态开发1.权限与状态:在Linux中,用户态是用户空间,需要以普通用户身份运行。

驱动程序在用户态下运行,只能通过系统调用与内核态交互。

2.系统调用:系统调用是用户程序与内核态交互的主要方式。

了解系统调用的机制和接口,能够更好地编写用户态驱动程序。

3.内存管理:用户态下的驱动程序需要通过系统调用访问物理内存,因此需要熟练掌握内存管理的技巧,包括内存分配、释放、共享和保护等。

4.设备驱动模型:虽然用户态下的驱动程序无法直接访问硬件设备,但通过设备驱动模型,可以间接地控制硬件设备。

了解设备驱动模型的结构和机制,对于用户态驱动程序的开发也很有帮助。

四、注意事项1.安全问题:在内核态下开发驱动程序时,需要注意避免安全漏洞,如缓冲区溢出、权限提升等。

2.稳定性问题:驱动程序的稳定性直接影响到整个系统的稳定性。

什么是Linux内核空间与用户空间

什么是Linux内核空间与用户空间

本文以32位系统为例介绍内核空间(ker n el s pa ce)和用户空间(u se r sp ac e)。

内核空间和用户空间对32位操作系统而言,它的寻址空间(虚拟地址空间,或叫线性地址空间)为4G(2的32次方)。

也就是说一个进程的最大地址空间为4G。

操作系统的核心是内核(ke rn el),它独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。

为了保证内核的安全,现在的操作系统一般都强制用户进程不能直接操作内核。

具体的实现方式基本都是由操作系统将虚拟地址空间划分为两部分,一部分为内核空间,另一部分为用户空间。

针对Li nu x 操作系统而言,最高的1G 字节(从虚拟地址0x C0000000到0xF F FF FF FF)由内核使用,称为内核空间。

而较低的 3G字节(从虚拟地址0x00000000到0xB F FF FF FF)由各个进程使用,称为用户空间。

对上面这段内容我们可以这样理解:「每个进程的 4G 地址空间中,最高1G 都是一样的,即内核空间。

只有剩余的 3G 才归进程自己使用。

」「换句话说就是,最高1G 的内核空间是被所有进程共享的!」下图描述了每个进程4G 地址空间的分配情况:为什么需要区分内核空间与用户空间在CP U 的所有指令中,有些指令是非常危险的,如果错用,将导致系统崩溃,比如清内存、设置时钟等。

如果允许所有的程序都可以使用这些指令,那么系统崩溃的概率将大大增加。

所以,C PU将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通应用程序只能使用那些不会造成灾难的指令。

比如I nt el 的C PU将特权等级分为4个级别:R in g0~Ri n g3。

其实 L in ux系统只使用了Ri ng0 和Ri n g3两个运行级别(W in do ws系统也是一样的)。

当进程运行在 R in g3级别时被称为运行在用户态,而运行在R i ng0 级别时被称为运行在内核态。

linux下共享内存

linux下共享内存

Linux下共享内存SUNNY.MAN共享内存允许两个或多个进程进程共享同一块内存(这块内存会映射到各个进程自己独立的地址空间) 从而使得这些进程可以相互通信,进程退出时会自动和已经挂接的共享内存区段分离,但是仍建议当进程不再使用共享区段时调用shmdt来卸载区段。

注意,当一个进程分支出父进程和子进程时,父进程先前创建的所有共享内存区段都会被子进程继承。

如果区段已经做了删除标记(在前面以IPC_RMID指令调用shmctl),而当前挂接数已经变为0,这个区段就会被移除。

Linux中通过API函数shmget创建的共享内存一般都是在程序中使用shmctl来释放的,但是有时为了调试程序,开发人员可能通过Ctrl + C等方式发送中断信号来结束程序,此时程序申请的共享内存就不能得到释放,当然如果程序没有改动的话,重新运行程序时仍然会使用上次申请的共享内存,但是如果我们修改了程序,由于共享内存的大小不一致等原因会导致程序申请共享内存错误。

因此,我们总是希望每次结束时就能释放掉申请的共享内存。

有两种方法可以用来释放共享内存:第一种:如果总是通过Crtl+C来结束的话,可以做一个信号处理器,当接收到这个信号的时候,先释放共享内存,然后退出程序。

第二种:不管你以什么方式结束程序,如果共享内存还是得不到释放,那么可以通过linux命令ipcrm shm shmid来释放,在使用该命令之前可以通过ipcs -m命令来查看共享内存。

共享内存查看使用ipcs命令,不加如何参数时,会把共享内存、信号量、消息队列的信息都打印出来,如果只想显示共享内存信息,使用如下命令:[root@localhost ~]# ipcs –m同样共享内存的大小也可以用ipcs –lm来查看它的上限下限。

shmget( ) 创建一个新的共享内存区段取得一个共享内存区段的描述符shmctl( ) 取得一个共享内存区段的信息为一个共享内存区段设置特定的信息移除一个共享内存区段shmat( ) 挂接一个共享内存区段shmdt( ) 于一个共享内存区段的分离同样共享内存的大小也可以用ipcs –lm来查看它的上限下限。

Linux用户态与内核态的交互

Linux用户态与内核态的交互

Linux 用户态与内核态的交互Linux用户态与内核态的交互2010-06-13 22:30Linux用户态与内核态的交互在Linux 2.4版以后版本的内核中,几乎全部的中断过程与用户态进程的通信都是使用netlink套接字实现的,例如iprote2网络管理工具,它与内核的交互就全部使用了netlink,著名的内核包过滤框架Netfilter在与用户空间的通读,也在最新版本中改变为netlink,无疑,它将是Linux用户态与内核态交流的主要方法之一。

它的通信依据是一个对应于进程的标识,一般定为该进程的ID。

当通信的一端处于中断过程时,该标识为0。

当使用netlink套接字进行通信,通信的双方都是用户态进程,则使用方法类似于消息队列。

但通信双方有一端是中断过程,使用方法则不同。

netlink套接字的最大特点是对中断过程的支持,它在内核空间接收用户空间数据时不再需要用户自行启动一个内核线程,而是通过另一个软中断调用用户事先指定的接收函数。

《UNIX Network Programming Volume 1-3rd Edition》第18章讲到BSD UNIX系统中routing socket的应用,这种套接字是按下面方式生成的:rt_socket=socket(AF_ROUTE,SOCK_RAW,0);然后就可以用它跟内核交互,进行网络环境管理的操作,如读取/设置/删除路由表信息,更改网关等等,但书中所列代码只在4.3BSD及以后版本的原始UNIX系统下可用,Linux虽然实现了AF_ROUTE族套接字,但用法却完全不同。

由于网上这方面知识的资料想对匮乏,现对Linux下routing socket的使用做一介绍。

由于我现在在MagicLinux1.0下工作,所以以下的讲解全部基于2.4.10内核。

Linux从v2.2开始引入这一机制,因此可以肯定从v2.2到v2.4的内核都是适用的,更新的v2.6我没有试过。

Linux内核空间与用户空间通信机制的研究

Linux内核空间与用户空间通信机制的研究

Linux内核空间与用户空间通信机制的研究Linux kernel space and user space communicationmechanism摘要Linux是一个源码开放的操作系统,无论是普通用户还是企业用户都可以编写自己的内核代码,再加上对标准内核的裁剪从而制作出适合自己的操作系统,深受大家喜爱。

Linux系统中,在使用虚拟内存技术的多任务系统上,内核和用户有不同的地址空间,因此,在内核与用户之间进行数据交换需要专门的机制来实现。

一个或多个内核模块的实现并不能满足一般Linux 系统软件的需要,因为内核的局限性太大,内核空间与用户空间进程通信的方法就显得尤为重要。

本文将列举几种内核态与用户态进程通信的方法:Netlink通信机制,基于文件系统的通信机制,内核启动参数通信机制,并用实验板对几种重要的通信机制进行验证,详细分析它们的实现和适用环境,优缺点,并做出比较。

提供用户适合使用这种通信机制的环境,以便更好的运用Linux操作系统。

关键字内核空间用户空间地址空间ABSTRACTLinux is an open source operating system, whether ordinary users or business users can write your own kernel code, with the modification of the standard kernel,everyone can make up their own operating system, which makes Linux popular.In Linux systems, in the use of multi-tasking system with virtual memory technology, the kernel and the user have different address spaces, so the change of data between kernel and user needs Special Method to achieve. One or more kernel modules can not meet the general needs of Linux system software, just because the limitations of the kernel, make it important that the process communication method between kernel space and user space. In this article I will list some kernel mode and user mode process communication methods: Netlink communication mechanism, communication mechanism based on the file system, the kernel boot parameters of communication mechanism.I will analysis of their implementation, application environment, the advantages and disadvantages in detail, and make the comparison. I will provide users with suitable environment for each communication mechanism in order to let others make good use of Linux operating system.Keywords kernel space user space address spaces目录第一章绪论 (1)1.1操作系统发展史 (1)1.2选题背景及研究意义 (2)1.3主要工作 (2)第二章内核空间与用户空间通信机制概述 (4)2.1L INUX嵌入式操作系统简介 (4)2.2课题研究所需知识点解释 (4)2.3内核空间与用户空间通信概述 (5)第三章用户空间与内核空间通信机制 (9)3.1N ETLINK通信机制 (9)3.2基于文件系统的通信机制 (14)3.3内核启动参数通信机制 (22)第四章典型通信机制的验证 (24)4.1验证环境简介 (24)4.2N ETLINK通信机制 (24)4.3 PROCFS通信使用方法 (27)4.4系统调用的使用方法 (29)第五章结论 (32)5.1九种通信机制总结 (32)致谢 (33)参考文献 (34)第一章绪论1.1 操作系统发展史操作系统的发展历程和计算机硬件的发展历程是密切相关的。

Linux内核参数-共享内存信号量semaphore设置

Linux内核参数-共享内存信号量semaphore设置

Linux内核参数-共享内存信号量semaphore设置共享内存:可以通过ipcs -lm命令查看目前系统共享内存的参数限制:# ipcs -lm—— Shared Memory Limits ——–max number of segments = 4096max seg size (kbytes) = 1048576max total shared memory (pages) = 2097152min seg size (bytes) = 1这里涉及到3个于共享内存相关的参数:SHMMAX,SHMMNI,SHMALLSHMMAX含义:单个共享内存段最大字节数设置:比SGA略大查看:cat /proc/sys/kernel/shmmax$ cat /proc/sys/kernel/shmmax1073741824修改:sysctl -w kernel.shmmax=1073741824echo “kernel.shmmax=1073741824″ >> /etc/sysctl.confSHMMNI含义:共享内存段最大个数设置:至少4096 查看:cat /proc/sys/kernel/shmmni# cat /proc/sys/kernel/shmmni4096修改:# sysctl -w kernel.shmmni=4096# echo “kernel.shmmni=4096″ >> /etc/sysctl.confSHMALL含义:系统中共享内存页总数设置:至少ceil(shmmax/PAGE_SIZE);ORACLE DOC 默认值:2097152*4096=8GB 查看:cat /proc/sys/kernel/shmall $ getconf PAGE_SIZE4096# cat /proc/sys/kernel/shmall2097152修改:# sysctl -w kernel.shmall=2097152# echo “kernel.shmall=2097152″ >> /etc/sysctl.conf信号量:当前系统信号量限制:oracle@lab-rd-01:~$ ipcs -ls—— Semaphore Limits ——–max number of arrays = 128max semaphores per array = 250max semaphores system wide = 32000max ops per semop call = 100SEMMSL含义:每个信号量set中信号量最大个数设置:最小250;对于processes参数设置较大的系统建议设置为processes+10 SEMMNI含义:linux系统信号量set最大个数设置:最少128SEMMNS含义:linux系统中信号量最大个数设置:至少32000;SEMMSL * SEMMNISEMOPM含义:semop系统调用允许的信号量最大个数设置:至少100;或者等于SEMMSL查看信号量设置:cat /proc/sys/kernel/semorder:SEMMSL, SEMMNS, SEMOPM, SEMMNIoracle@lab-rd-01:~$ cat /proc/sys/kernel/sem250 32000 100 128修改:sysctl -w kernel.sem=”250 32000 100 128″echo “kernel.sem=250 32000 100 128″ >> /etc/sysctl.conf修改完后,执行:sysctl -p。

linux中select、poll、epoll原理

linux中select、poll、epoll原理

linux中select、poll、epoll原理select、poll和epoll是Linux下常用的I/O多路复用技术,都用于实现高效的事件驱动型的网络编程。

1. select(选择)select是最古老的I/O多路复用机制,它通过在套接字上设置阻塞(阻塞方式)进行等待,一旦有文件描述符准备就绪(可读、可写等),则返回。

select使用fd_set集合来保存要监听的文件描述符,因此其监听的文件描述符数量受到系统给定的FD_SETSIZE限制。

select的实现原理是:在内核中创建一个称为“等待队列”的数据结构(fd_set),该队列保存了需要等待的文件描述符,当某个文件描述符就绪时,会通过和用户进程的映射表通知用户进程。

select通过轮询所有注册的文件描述符,检查哪些文件描述符已经准备好,并将准备好的文件描述符从用户态拷贝到内核态。

select的缺点是每次调用都需要轮询全部的注册文件描述符,效率较低。

2. poll(轮询)poll是在select的基础上进行改进的多路复用技术。

poll与select的最大区别在于,它没有限制文件描述符的数量,并且使用了一个pollfd结构体数组来保存每个文件描述符及其关注的事件。

poll在内核中创建一个称为“等待队列”的数据结构,该队列保存了需要等待的文件描述符,当某个文件描述符就绪时,会通过和用户进程的映射表通知用户进程。

poll的实现原理是:将用户进程注册要监听的文件描述符及其关注的事件存储在内核中的一个事件表中,当发生事件时,内核会将该事件存储在内核态的事件表中,并通知用户进程。

与select不同的是,poll只需在事件发生时拷贝某些信息到内核态,而不需要拷贝全部的文件描述符。

poll的缺点是,当注册的文件描述符数量较大时,每次调用poll都需要遍历整个事件表,效率较低。

3. epoll(事件通知)epoll是Linux特有的一种I/O多路复用机制,通过内核与用户空间的共享内存来实现高效的事件通知。

copy_from_user工作原理

copy_from_user工作原理

copy_from_user工作原理摘要:一、引言二、copy_from_user工作原理1.用户空间和内核空间的内存布局2.内存拷贝过程3.拷贝函数的实现三、copy_from_user的应用场景1.进程间数据传递2.内核模块与用户空间数据交互四、copy_from_user的优缺点1.优点1.高效的数据传输2.简化编程逻辑2.缺点1.潜在的安全风险2.受限的数据大小五、结论正文:一、引言在计算机系统中,内核与用户空间之间的数据交换是常见的操作。

为了实现这种交换,copy_from_user函数应运而生。

本文将详细介绍copy_from_user的工作原理、应用场景以及优缺点。

二、copy_from_user工作原理1.用户空间和内核空间的内存布局在Linux系统中,内存被分为用户空间和内核空间。

用户空间主要用于进程的普通数据和程序代码,而内核空间则用于操作系统内核的数据和代码。

两者之间的内存是相互隔离的,以确保系统安全。

2.内存拷贝过程当需要在内核空间和用户空间之间进行数据拷贝时,copy_from_user函数即可派上用场。

该函数的原型为:```cunsigned long long copy_from_user(void __user *to, const void__user *from, unsigned long long n);```参数说明:- to:目标地址,指向用户空间的指针- from:源地址,指向用户空间的指针- n:要拷贝的数据长度copy_from_user函数的工作过程如下:(1)检查输入参数的有效性,确保to和from指向的用户空间地址合法。

(2)将从from地址开始的数据字节依次拷贝到to地址所在的位置。

(3)当拷贝完成后,返回实际拷贝的字节数。

3.拷贝函数的实现copy_from_user函数的具体实现依赖于平台和编译器。

一般来说,编译器会对copy_from_user进行优化,使其具有较高的性能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1 引言
Linux 是一类 Unix 计算机操作系统的统称。Linux 操作系 统的内核的名字也是“Linux”。Linux 操作系统也是自由软件 和开放源代码发展中最著名的例子。Linux 是一套免费使用和 自由传播的类 Unix 操作系统。无论是普通用户还是企业用户 都可以编写自己的内核代码,再加上对标准内核的裁剪从而 制作出适合自己的操作系统。
系统调用和中断两种情况下发生,一般程序一开始都是运行 于用户态,当程序需要使用系统资源时,就必须通过调用软 中断进入内核态。
3 Linux 的用户态和内核态
Linux 使用了 Ring3 级别运行用户态,Ring0 作为内核态。 Ring3 状态不能访问 Ring0 的地址空间,包括代码和数据 。 Linux 进程的 4GB 地址空间,3GB-4GB 部分是共享的,是内 核态的地址空间,这里存放着整个内核的代码和所有的内核 模块,以及内核所维护的数据。
4 实现内核态与用户态的通信
内核与用户空间共享内存的关键是,用户空间必须知道 共享内存的起始地址,这就要求内核空间应该有一种通信机 制来通知用户空间。理论上任何内核空间与用户空间的通信 方法都可以利用。接下来主要介绍基于 Netlink 机制的实现。
Netlink 在 linux 的内核与用户空间通信中用得很多,其最 大优势是接口与网络编程中的 socket 相似,且内核要主动发 信息给用户空间很方便。既然涉及到内核与用户空间两个空 间,就应该在两个空间各有一套接口。用户空间的接口与一
SOFTWARE DEVELOPMENT AND DESIGN
软件开发与设计
Linux 下用户态和内核态内存共享的实现
陈浩
(江苏食品职业技术学院计算机应用技术系,淮安 223003)
摘 要: 共享内存是进程间通信中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存,就如同 malloc ( )函数向不同进程返回了指向同一个物理内存区域的指针。因为所有进程共享同一块内存,共享内存在各种 进程间通信方式中具有最高的效率。主要介绍 Linux 下基于 Netlink 机制的用户态和内核态内存共享的实现。 关键词: 内核态; 用户态; netlink; 共享内存
内核态:当一个任务 (进程) 执行系统调用而陷入内核 代码中执行时,就称进程处于内核运行态或简称为内核态。 此时处理器处于特权级最高的 0 级内核代码中执行。当进程 处于内核态时,执行的内核代码会使用当前进程的内核栈。
在内核态下 CPU 可执行任何指令,在用户态下 CPU 只能 执行非特权指令。当 CPU 处于内核态,可以随意进入用户态; 而当 CPU 处于用户态时,用户从用户态切换到内核态只有在
用户空间调用 open /dev/shm 进行物理内存设备的读写, 发送 Netlink 消息给内核,得到共享内存的起始物理地址,最 后调用 mmap 上步得到的物理地址。用户空间的进程得到这个 地址后根据这个地址去读取其中的内容。 5.2 设计实现
为了创建一个 Netlink socket,用户需要使用如下参数调 用 socket ():
接收函数收到用户空间 进程 ID
用户态
用户空间进程创建套接 字,并将进程 ID 发送至内 核空间
用户空间与内核空间可以通信
图 2 用 Netlink 套接字实现内核态与用户态的通信
5 基于 Netlink 的共享内存
5.1 工作流程 内 核 部 分 首 先 用 get_order 获 取 页 数 , 接 着 调 用
6 结语
介绍基于 Netlink 的用户空间与内核空间的数据交换方式, 并通过实际例子程序向读者讲解了如何在内核开发中使用这 些技术。Netlink 是一种双向的数据交换方式,它使用起来非
socket (AF_NETLINK, SOCK_RAW, netlink_type) socket 函数返回的套接字可以交给 bing 等函数调用: static int skfd; skfd = socket (PF_NETLINK, SOCK_RAW, NL_IMP2) ; if (skfd < 0) { printf (" can not create a netlink socket\n") ; exit (0) ; } 用 户 空 间 可 以 调 用 send 函 数 簇 向 内 核 发 送 消 息 , 如 sendto、sendmsg 等。也可以使用 struct sockaddr_nl 来描述一 个对端地址,以待 send 函数来调用,与本地地址稍不同的是, 因为对端为内核,所以 nl_pid 成员需要设置为 0: struct sockaddr_nl kpeer; memset (&kpeer, 0, sizeof (kpeer)) ; kpeer.nl_family = AF_NETLINK; kpeer.nl_pid = 0; kpeer.nl_groups = 0; 当发送完请求后,就可以调用 recv 函数簇从内核接收数 据了,接收到的数据包含了 Netlink 消息首部和要传输的数据, 然后调用 close 函数关闭 Netlink 套接字,退出程序。 5.3 内核空间的设计与实现 与应用程序内核一样,内核空间也主要完成 3 件工作: 创建 Netlink 套接字、接收处理用户空间发送的数据、发送数 据至用户空间。API 函数 netlink_kernel_create 用于创建一个 Netlink socket,同时,注册一个回调函数,用于接收处理用户 空间的消息: struct sock * netlink_kernel_create (int unit, void (*input) (struct sock *sk, int len)) ; 用户空间向内核发送了自定义消息,分别是请求和关闭。 kernel_receive 函数分别处理这两种消息。因为内核模块可能 同时被多个进程同时调用,所以函数中使用了信号量和锁来 进行互斥。 函数初始化 Netlink 消息首部,填充数据区,然后设置控 制字段,最后调用 netlink_unicast 函数把数据发送出去。在内 核中使用函数 sock_release 来释放函数 netlink_kernel_create ()
作者简介:陈浩,男,研究方向:计算机应用。 收稿日期:2010-12-18
201019. 04 25
电脑编程技巧与维护
般的 socket 接口相似,标准的 socket API 的函数,socket () , bind () , sendmsg () , recvmsg () 和 close () 很 容 易 地 应 用 netlink socket;内核空间则稍为复杂:首先也是建立描述符, 建立描述符时会注册一个回调函数,然后当用户空间有消息 发过来时,函数将被调用;当内核要主动发消息给用户进程 时,直接调用一个类 send 函数即可。
用户运行一个程序,该程序所创建的进程开始是运行在 用户态的,如果要执行文件操作,网络数据发送等操作,必 须通过 write,send 等系统调用,这些系统调用会利用内核中 的 代 码 来 完 成 操 作 , 这 时 , 必 须 切 换 到 Ring0, 然 后 进 入 3GB-4GB 中的内核地址空间去执行这些代码,完成操作,完 成后,切换回 Ring3,回到用户态。这样,用户态的程序就不 能随意操作内核地址空间,具有一定的安全保护作用。
26 2011. 04
_get_free_page 分配连续的物理内存页,这时返回的是虚拟地 址,然后调用 SetPageReserved,相当于告诉系统,这个页面 已经占了。对于每一个申请到的页面,应该都要这样做,同 样地,释放内存时,需要对每一页调用 ClearPageReserved。如 果用户空间通过 Netlink 要求获取共享内存的起始物理地址, 将 _get_free_pages 返回的地址 _pa 下发给用户空间。
Abstract:Shared memory is the most simple of the Process communication. Shared memory allowed two or more process visit the same piece of memory. as like as function malloc(),It towards to the different process return a pointer of point to the same physics memory area.Because all of the process shared the same memory,shared memory is the top efficiency of all kind of process Communication.This paper principally introduction implementation base on Netlink mechanism user mode and kernel mode shared memory under Linux. Key words:kernel mode ; user mode ; netlink ; Shared memory
中断过程发送数据
图 1 Netlink 通过软中断调用用户进程
当 Netlink 套接字用于内核空间与用户空间的通信时,在 用户空间的创建方法和一般套接字使用类似,但内核空间的 创建方法则不同,图 2 是 Netlink 套接字实现此类通信时创建 的过程。
内核态
使用 netlink_kernel_create() 创建套接字,并指明接收函数
2 用户态和内核态
用户态与内核态是操作系统的两种运行级别,Intel CPU 提 供 Ring0 -Ring33 种 级 别 的 运 行 模 式 。 Ring0 级 别 最 高 , Ring3 最低。
相关文档
最新文档