从socket can中断到netlink用户态内核态通信

1. Linux中的进程间的通信机制源自于Unix平台上的进程通信机制。Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运行在单个计算机上的System V IPC,后者则实现了基于socket的进程间通信机制。同时linux也遵循IEEE制定的posix IPC标准,在三者的基础上实现以下几种主要的IPC机制:管道(Pipe)和命名管道(Name Pipe),信号(Signal),消息队列(Message queue),共享内存(Shared Memory),信号量(Semaphore),套接字(Socket)。通过这些IPC机制,用户空间进程之间可以完成互相通信。而为了完成内核空间和用户空间之间的通信,linux提供了基于socket的Netlink通信机制,可以实现内核与用户空间数据的及时交换。

2. linux操作系统中当cpu处于内核状态时,可以分为有用户上下文的状态和执行硬件、软件中断两种。其中当处于有用户上下文时,由于内核态和用户态的内存映射机制不同,不可直接将本地变量传给用户态的内存区;处于硬件、软件中断时,无法直接向用户内存去传递数据,代码执行不可中断。 
他们都无法直接在内核态和用户态之间使用,原因如下:

  • 管道 
    局限于父子进程间通信。
  • 消息队列 
    在软、硬中断中无法无阻塞地接收数据
  • 信号量 
    虽然原理一样,但内核空间和用户空间的信号量是两套完全的系统,所以信号量不能用于内核空间和用户空间信息交互
  • 内存共享 
    需要信号量辅助
  • socket套接字 
    在硬、软中断中无法无阻塞地接收数据

目前linux提供了

3. 解决内核态和用户态通信机制

处于有用户上下文时,可以使用linux提供的copy_to_user()和copy_from_user()函数完成,但由于这两个函数可能阻塞,因此不能在硬件、软件中断的过程中使用。

linux将内存空间分为两部分,将最高字节的一部分,供内核使用,称为“内核空间”,而较低字节的一部分,则为“用户空间” 处理器状态:

a. 内核态,运行于进程上下文,内核代表进程运行于内核空间;

b. 内核态,运行于中断上下文,包括硬中断和软中断;

c. 用户态,运行于用户空间。

处于硬、软件中断时,主要分为两类:

(1)可以通过linux提供的spinlock自旋锁实现内核线程和中断过程的同步,由于内核线程运行在有上下文的进程中,因此可以在内核线程中使用套接字或消息队列来取得用户空间的数据,然后再将数据通过临界区传递给中断过程。

(2)通过netlink机制实现。netlink套接字的通信依据是一个对应于进程的标识,一般定为该进程的ID。netlink通信最大的特点是对中断过程的支持,它在内核空间接收用户空间数据时不再需要用户自动启动一个内核线程,而是通过另一个软中断调用用户事先指定的接收函数。通过软中断而不是自行启动内核线程保证了数据传输的及时性。

AF_NETLINK 与PF_NETLINK

@font-face {
font-family: "Times New Roman";
}@font-face {
font-family: "宋体";
}@font-face {
font-family: "Liberation Serif";
}@font-face {
font-family: "Noto Sans CJK SC Regular";
}@font-face {
font-family: "FreeSans";
}@font-face {
font-family: "Symbol";
}@font-face {
font-family: "OpenSymbol";
}@font-face {
font-family: "Microsoft YaHei;SF Pro Display;";
}@font-face {
font-family: "Source Code Pro;DejaVu Sans Mon";
}p.MsoNormal { margin: 0pt 0pt 0.0001pt; font-family: "Liberation Serif"; font-size: 12pt; }p.MsoBodyText { margin-top: 0pt; margin-bottom: 7pt; line-height: 120%; font-family: "Liberation Serif"; font-size: 12pt; }span.msoIns { text-decoration: underline; color: blue; }span.msoDel { text-decoration: line-through; color: red; }div.Section0 { }

原文地址:https://www.cnblogs.com/myplayground/p/11428470.html

时间: 2024-08-13 08:25:41

从socket can中断到netlink用户态内核态通信的相关文章

用户态内核态

Q:怎么从用户态切换到内核态 A:用户程序调用系统调用的时候,用户程序先将系统调用号放入eax,执行int0x80指令触发中断,中断发生时,cpu切入内核态,从 用户栈 切换到 内核栈 ,在 内核栈 中依次压入用户态的寄存器,也就是保护现场,根据中断号在中断向量表中查找对应的中断处理程序,并调用它. 中断 中断:操作系统是通过中断来从用户态切换到内核态 中断分两种: 硬件中断:电源掉电,键盘被按下 软件中断:i386下是 int 指令 linux上系统调用的中断号是0x80,而windows上是

用户态/内核态、用户栈/内核栈

一.用户态和内核态 内核态和用户态是操作系统的两种运行级别,用于区分不同程序的不同权利. 内核态就是拥有资源多的状态,或者说访问资源多的状态,也称为特权态.相对来说,用户态就是非特权态,访问的而资源将受到限制.如果一个程序运行在特权态,该程序就可以访问计算机的任何资源,它的资源访问权限不受限制.如果一个程序运行在用户态,其资源需求将受到各种限制.如:要访问操作系统的内核数据结构,如进程表,则需要在特选态下才能办到.如果要访问用户程序里的数据,在用户态即可. 二.用户栈和内核栈 内核在创建进程的时

DSP 之原子与高性能设计(一) 用户态/内核态 原子原语

type __sync_fetch_and_add (type *ptr, type value, ...)type __sync_fetch_and_sub (type *ptr, type value, ...)type __sync_fetch_and_or (type *ptr, type value, ...)type __sync_fetch_and_and (type *ptr, type value, ...)type __sync_fetch_and_xor (type *pt

用户态-内核态

前戏 我们知道计算机主要分为三部分,硬件,操作系统和应用程序,然后硬件的头脑cpu才是控制内核态和用户态的大佬 操作系统 操作系统是直接和硬件打交道的,操作系统在内核态下运行,从而可以访问整个硬件 应用程序 应用程序直接和用户交互,但是应用程序不能直接操作硬件,应用程序在用户态下运行,但是有时候应用程序也需要操作硬件,这个时候,就涉及到用户态和内核态的切换 内核态-用户态概念 内核态(所有指令都给操作系统使用) 当cpu在内核态运行时,cpu可以执行指令集中所有的指令,很明显,所有的指令中包含了

linux 用户态 内核态

http://blog.chinaunix.net/uid-1829236-id-3182279.html 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例子 C代码 1.     void testfork(){   2.     if(0 = = fork()){   3.     printf(“create new process suc

进程:linux用户态-内核态

用户态:Ring3运行于用户态的代码则要受到处理器的诸多检查,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中I/O许可位图(I/O Permission Bitmap)中规定的可访问端口进行直接访问. 内核态:Ring0在处理器的存储保护中,核心态,或者特权态(与之相对应的是用户态),是操作系统内核所运行的模式.运行在该模式的代码,可以无限制地对系统存储.外部设备进行访问. 一.用户态和内核态 现在我们从特权级的调度来理解用户态和内核态就

字符设备驱动ioctl实现用户层内核层通信

测试代码实现 memdev.h #ifndef _MEMDEV_H_ #define _MEMDEV_H_ #include<linux/ioctl.h> #ifndef MEMDEV_MAJOR #define MEMDEV_MAJOR 0 #endif #ifndef MEMDEV_NR_DEVS #define MEMDEV_NR_DEVS 2 #endif #ifndef MEMDEV_SIZE #define MEMDEV_SIZE 4096 #endif struct mem_de

关于内核态用户态和信号的思考(其中中断上下段没有看懂)

终于搞懂用户态内核态以及中断.信号的上下文切换关系了,处于内核态的时候用户态的上下文保存在内核栈中,此时如果发生中断或者切换,是不会区分进程处于用户态还是内核态的,直接切之,软中断导致的是内核态和用户态的转化,也即是用户上下文到内核上下文的转化,而中断导致的是用户态或者内核态上下文到中断上下文的转化,进程切换导致的是用户态/内核态上下文到用户态/内核态上下文的转化.关键是每个进程都对应一个用户栈和内核栈. 扩展阅读: http://19880512.blog.51cto.com/936364/2

Linux用户态和内核态内存管理技术

通常程序访问的地址都是虚拟地址,用32位操作系统来讲,访问的地址空间为4G,linux将4G分为两部分.如图1所示,其中0~3G为用户空间,3~4G为内核空间.通过MMU这两部分空间都可以访问到实际的物理内存. 进程在用户态只能访问0~3G,只有进入内核态才能访问3G~4G *进程通过系统调用进入内核态 *每个进程虚拟空间的3G~4G部分是相同的 *进程从用户态进入内核态不会引起CR3的改变但会引起堆栈的改变 图1 1 虚拟地址和物理地址之间的映射关系 页作为基本的映射单元,一页的大小一般为4K