Linux系统
文章平均质量分 76
driver
gomogomono
多媒体开发者
展开
-
Linux系统中存在的各种进程间通信机制
前面我们对进程间通信的本质和框架有了基本的了解,下面我们来简单介绍一下Linux中的所有进程间通信机制。我们先来看一下总图。我们先把这张图简介浏览一下。首先从大类上分,进程间通信方法可以分为3类,消息传递式、共享内存式、进程间同步。为啥这里会有进程间同步呢?进程间同步是为了同步两个进程对共享内存的读写,进程间同步也算是在两个进程间传递了信息,所以把进程间同步也放在了进程间通信中。可以看到共享内存式机制比消息传递式机制要少,我们就先介绍共享内存式。转载 2024-10-04 18:42:05 · 345 阅读 · 0 评论 -
linux进程调度 - 组织进程
1. 进程的运行状态进程的运行状态有下面这么几种: 进程运行状态 描述 TASK_RUNNING 运行的进程被设置 TASK_INTERRUPTIBLE 进程被挂起,除非有硬件中断或者信号传递来唤醒进程 TASK_UNINTERRUPTIBLE 与可中断类似,但是信号不能唤醒进程 TASK_STOPPED 进程的执行被暂停进程被创建后,会被设置各种运行状态,然原创 2016-11-20 20:25:14 · 737 阅读 · 0 评论 -
Linux中断子系统 - softirq
本文基于linux4.6.3内核版本代码来说明softirq机制,代码在kernel/softirq.c中,代码不算多也就近800行。在中断处理中,分上半部和下半部,有一些任务不是特别紧急的,没必要在关闭中断的条件下处理,可以在开中断的情况下,延迟一段时间放在后边处理,这些情况属于后半部(bottom half)处理部分。在内核中有两种机制来做这一部分工作:软中断(softirq)和工作队列,本文主原创 2016-09-15 18:05:21 · 2348 阅读 · 1 评论 -
linux内核细节-NULL
#define NULL ((void *)0)原创 2016-05-24 15:34:09 · 781 阅读 · 0 评论 -
linux进程创造 - 创建进程API及过程
1. 创建进程函数API1.1 创建进程fork()fork的翻译为“叉子,分叉”,其实在unix编程中,我们来创建进程的时候是深有体会的,感觉创建一个进程就像是走到了一个岔路口,父进程和子进程在叉路口分道扬镳,所以我想这就是前辈为什么要用fork来表示创建一个进程的缘由吧。通过fork(),除了task_struct和堆栈,子进程和父进程共享所有的资源,相当于复制了一个父进程,但是由于linux采原创 2016-11-20 00:56:20 · 2589 阅读 · 0 评论 -
linux工作队列 - 把work_struct加入工作队列
把work_struct加入到工作队列workqueue的API在系列文章1有介绍,这些API虽然用法不一,但是最终都会调用__queue_work()函数来进行实际加入操作,比如API:queue_work_on:bool queue_work_on(int cpu, struct workqueue_struct *wq, struct work_struct *work)原创 2016-10-16 22:53:23 · 4929 阅读 · 0 评论 -
linux时间子系统 - 动态任务
1. 动态任务的切换系统初期是在periodic模式,在周期性函数调用update_process_times过程中,会进行动态任务的切换,具体是在函数hrtimer_run_queues中进行2. 低精度模式下的动态任务2.1 切换到低精度动态任务static void tick_nohz_switch_to_nohz(void){ struct tick_sched *ts = thi原创 2017-01-02 18:40:28 · 898 阅读 · 0 评论 -
linux进程创造 - 内核进程初始化及创建
1. 内核进程初始化1.1 idle/swapper进程 - (pid:0)内核的第一个进程叫idle进程或者swapper进程,这是初始化阶段从无到有创建的第一个内核进程,每个cpu都有一个进程0,当内核中没有其他进程运行时,就会调用该进程使得cpu处于idle状态,进程描述符为init_task,如下:(init/init_task.c)struct task_struct init_task原创 2016-11-27 17:51:09 · 1492 阅读 · 0 评论 -
linux时间子系统 - 时间概念
1. UTC与GMTUTC,协调世界时(Coordinated Universal Time),又称世界统一时间,世界标准时间,国际协调时间。协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。这套时间系统被应用于许多互联网和万维网的标准中,例如,网络时间协议就是协调世界时在互联网中使用的一种方式。GMT,格林尼治标准时间(Greenwich Mean Time,GMT)是指原创 2016-12-11 17:05:14 · 1163 阅读 · 0 评论 -
linux时间子系统 - hrtimer
1. hrtimer对象1.1 hrtimer结构体struct hrtimer { struct timerqueue_node node;----------------------------红黑树的节点 ktime_t _softexpires;----------------------------到期时间 enum hrtimer原创 2017-01-08 17:22:22 · 1333 阅读 · 0 评论 -
linux工作队列 - workqueue_struct创建
1.创建workqueue代码分析1.1整体代码分析根据FLAG的不同,创建workqueue的API分好几种(见系列文章1说明),根据情况使用,但最终这些API都会调用到alloc_workqueue,这是一个宏定义,它的调用序列图如下所示:这里重点介绍函数alloc_and_link_pwqs(),wq在此函数中创建:static int alloc_and_link_pwqs(struct w原创 2016-10-16 19:27:20 · 5568 阅读 · 0 评论 -
linux工作队列 - workqueue总览
workqueue归入中断子系统是由于和中断处理有密切关系,写博客重要在于整理自己的思绪,写的时候会把一些不懂的细节问题暴露出来,这样会把问题看的更透彻,workqueue的代码在文件kernel/workqueue.c中,大约5K+行,本文基于linux 4.6.3编写,由于能力有限,本文介绍不全面或者理解有误之处还请见谅,欢迎指正一起探讨。文章系列1.linux工作队列 - workqueue原创 2016-10-15 18:17:28 · 13506 阅读 · 0 评论 -
linux时间子系统 - 总体框架
1. 定时器类型经典定时器(低精度)内核最初版本就是提供的此类定时器,实现于kernel/timer.c中,提供的典型分辨率为4ms,从现在看来分辨率很低,此类定时器只产生周期性的信号高精度定时器随着应用需求的提升,后来引入了高分辨率定时器,分辨率可以达到ns级别,这样就可以不用只产生周期行的信号,而是设置一些需要的事件信号就可以,这样就可以随机发出信号,而原先的周期信号就可以通过模拟来产生2. 源原创 2017-01-02 16:15:38 · 1024 阅读 · 0 评论 -
linux时间子系统 - clocksource/timekeeper
linux时间子系统中有一个很重要的记录时间的模块就是timekeeper,而timekeeper需要底层clock硬件设备的支持,每一个设备用结构体clocksource来表示,注册进系统的每一个clocksource会凭借优先级最终被选择成为timekeeper的时钟源。1. clocksource的注册1.1 clocksource结构体struct clocksource { cy原创 2016-12-11 20:13:15 · 2584 阅读 · 0 评论 -
linux用户态和内核态的概念区别
究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子:1)例子C代码1. void testfork(){ 2. if(0 = = fork()){ 3. printf(“create new转载 2016-03-29 10:14:48 · 793 阅读 · 0 评论 -
linux工作队列 - work_struct被调用过程
work_struct被调用在函数worker_thread中进行,代码如下:static int worker_thread(void *__worker){ struct worker *worker = __worker; struct worker_pool *pool = worker->pool; /* tell the scheduler that this i原创 2016-10-17 22:02:38 · 3596 阅读 · 0 评论 -
linux进程身份 - 进程标识
1. 进程标识在Linux中,在同一命名空间中,进程总是会被分配唯一的号码来标识它们,该号码被称作进程ID号,简称PID。对于进程和线程来说,他们都是用同样的结构体task_struct来表示,可以都被看做是进程,在内核中,他们也有自己的进程ID,也就是说会有唯一的进程ID来标识它们;但是对于线程来说,它还会有自己的线程ID,在task_struct 结构体中,用字段tgid来表示,pid代表线程所原创 2016-11-13 20:50:23 · 2350 阅读 · 2 评论 -
linux时间子系统 - clockevents和tick_device
在驱动中,clock设备在注册的时候会被注册进clockevent,每个clockevent会转化为tick device,然后会进行一次选择,最后成为某种类型的tick device(包括oneshot/periodic/broadcast)1. clockevents1.1 clockevent设备1.1.1 clockevent结构体clockevent设备用一下结构体表示 ( inclu原创 2016-12-18 17:27:36 · 2193 阅读 · 0 评论 -
linux内核对于指令异常的处理
1.处理流程以arm64来介绍一下流程,如果在用户层发生指令异常时,首先进入入口el0_undef( arch/arm64/kernel/entry.s )el0_undef: /* * Undefined instruction */ // enable interrupts before calling the main handler enable_原创 2017-01-11 17:21:35 · 3943 阅读 · 0 评论 -
linux中断子系统 - 中断控制器的注册
1. 前言中断控制器的代码都在目录drivers/irqchip/目录下,本文以GIC-V3中断控制器为例来介绍中断控制器的注册,代码在文件irq-gic-v3.c中。和中断控制器密切关联的结构体struct irq_domain、struct irq_chip,及其API,本文也详细介绍2. 中断控制器初始化/* drivers/irqchip/irq-gic-v3.c */IRQCHIP_DEC原创 2016-11-05 16:04:02 · 3213 阅读 · 0 评论 -
linux中断子系统 - irq_desc的创建
irq_desc的代码主要在kernel/irq/irqdesc.c中 linux4.6.3 1.irq_desc组织方式irq_desc在内核中有两种组织方式,这是根据宏CONFIG_SPARSE_IRQ是否定义来决定的,这两种方式分别是:(1)radix-tree方式,这是以基数树的方式来组织irq_desc (2)数组的方式 ,前面的文章介绍irq结构时,就是用此方原创 2016-10-31 22:33:59 · 6668 阅读 · 1 评论 -
linux进程调度 - 进程调度初始化与运行队列
进程调度初始化运行队列change log date原创 2016-12-04 22:10:33 · 2055 阅读 · 0 评论 -
linux中断子系统 - 中断及执行流程
linux中断子系统系列文章计划总共由5篇文章组成,本篇会通过中断的执行流来整体介绍一下中断,并引出其他文章的内容简介,中断的代码基本在kernel/irq目录下,中断控制器的代码在drivers/irqchip目录下 内核版本linux4.6.3 中断相关结构体介绍通过参照一下ULK3的IRQ描述符图,本图描述了linux4.6.3版本中断中各个结构体所代表的对象,str原创 2016-10-23 18:25:36 · 4824 阅读 · 0 评论 -
linux内核-notifier事件通知链
Ref.Linux内核基础–事件通知链(notifier chain) linux notifier机制及应用原创 2020-05-17 13:46:14 · 276 阅读 · 0 评论 -
linux进程身份 - 进程类型与进程关系
文章系列进程类型进程与线程(轻量级进程)借用情景分析中的定义,本小节来介绍linux内核中的进程与线程,在linux中进程都具有下列四个要素: 1. 有一段程序供其执行,这段程序不一定是进程所专有,可以与其他进程共用 2. 有进程专用的系统堆栈空间 3. 有自己独立的task_struct数据结构 4. 有独立的存储空间,意味着有专用的用户空间 上述四个要素缺一条就不成其为进程,如原创 2016-11-07 22:54:01 · 1281 阅读 · 0 评论 -
linux内核细节- typeof、offsetof、container_of
container_of链表是内核最经典的数据结构之一,说到链表就不得不提及内核最经典(没有之一)的宏container_of。 container_of似乎就是为链表而生的,它的主要作用是根据一个结构体变量中的一个域成员变量的指针来获取指向整个结构体变量的指针,最典型的应用就是根据链表节点获取链表上的元素对象。 container_of的宏定义如下: #define container_原创 2016-05-24 15:25:55 · 1405 阅读 · 0 评论 -
linux时间子系统 - 周期性任务
如果内核是有生命的话,那么时间就是内核的心脏,控制着内核的脉搏,但是这颗心脏跳动的方式根据硬件的配置会有不同的跳动方式。内核中有大量的需求需要时间的帮助,比如:定时、进程调度、获得时间等等,在内核中时间子系统就是来实现这部分功能的,根据不同的工作模式(periodic和oneshot)会有不同的工作函数来实现周期性任务,具体分为低精度模式和高精度模式。1. 低精度模式1.1 tick_handle原创 2016-12-25 17:33:07 · 3994 阅读 · 0 评论 -
linux内核细节-va_arg、va_end、va_start、printf
#define _bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd)))#define va_arg(ap, T) (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))#define va_end(ap) (ap = (v原创 2016-05-24 16:33:29 · 2571 阅读 · 1 评论 -
linux中断子系统 - 申请中断
1.申请中断APIextern int __must_checkrequest_threaded_irq(unsigned int irq, irq_handler_t handler, irq_handler_t thread_fn, unsigned long flags, const char *name, void *dev);stati原创 2016-10-25 22:47:57 · 1323 阅读 · 0 评论 -
Binder子系统驱动架构
Binder作为Android系统的主要进程间通信方式,在驱动层不会有开发的需求,我们主要还是了解下binder在驱动成的运行原理,以便于理解android binder的工作方式原创 2020-06-27 10:08:09 · 331 阅读 · 0 评论 -
linux中以devm开头的一些函数(设备资源管理)
devm简介在驱动代码中我们经常会见到一些以devm开头的函数,这一类的函数都是和设备资源管理(Managed Device Resource)相关的,驱动中提供这些函数主要是为了方便对于申请的资源进行释放,比如:irq、regulator、gpio等等。在驱动进行初始化的时候如果失败,那么通常会goto到某个地方释放资源,这样的标签多了之后会让代码看起来不简洁,devm就是为来处理这种情况。原创 2016-08-07 17:35:36 · 12420 阅读 · 0 评论 -
linux设备树的解释 - 总览
本文系列文章建议参考文章Documentation/devicetree/booting-without-of.txtlinux设备树的解释 - 总览 文章从全局介绍了dt使用的整个流程,言简意赅linux设备树的解释 - DTC编译器 文章介绍了dtc编译器及DT文件组织结构linux设备树的解释 - DTB文件格式 文章介绍了被编译完成的dtb文件格式,要能够理解内核是怎么把dts转换成d原创 2016-06-29 16:17:30 · 9690 阅读 · 0 评论 -
SPI子系统驱动架构 - 具体实现
文章系列SPI设备注册流程同I2C驱动的设备注册流程类似,遵从platform_bus_register->spi_bus_register->spi设备的流程spi主控制器的注册流程spi主控制器设备是挂载在platform总线上的,所以要通过platform bus子系统的注册方法来注册设备,遵从device-bus-driver的规律,首先要进行platform_device的注册,这是通过在原创 2016-07-06 15:03:36 · 10512 阅读 · 0 评论 -
SPI子系统驱动架构 - 简介
文章系列SPI介绍SPI由Motorola开发,是一种全双工的同步串口通信协议,适用于短距离通信,有四种工作模式,速率低可达12Mhz,高可达100Mhz。硬件连接SCLK : 时钟线 (主控制器输出). MOSI : 主输出,从输入,Master Output, Slave Input (output from master). MISO : 主输入,从输出,Master Inpu原创 2016-07-05 11:34:09 · 7342 阅读 · 0 评论 -
I2C子系统驱动架构 - 驱动框架
文章系列I2C子系统驱动架构 - 简介I2C子系统驱动架构 - 驱动框架I2C子系统驱动架构 - 具体实现 基于linux内核4.6.3版本介绍I2C驱动框架I2C驱动框架图如下所示,用户空间上的节点是用于上层开发工程师来操作i2c设备,内核空间的驱动架构分2层,Bus层的驱动代码是芯片厂商已经写好的,对于驱动开发人员来说,主要是设计device层的代码,不过要理解i2c驱动框架对于整个框架机原创 2016-07-03 18:15:11 · 10336 阅读 · 0 评论 -
I2C子系统驱动架构 - 具体实现
I2C设备注册流程第一步是先进行i2c bus设备的注册流程,然后是i2c 从设备的注册流程,遵从这么几步:platform_bus-> i2c_bus->i2c设备i2c bus设备的注册流程i2c-bus是挂载在platform总线上的,所以一个i2c-bus设备就是一个platform-device,所以就要通过函数platform_device_register来进行注册,而这一过程已经在l原创 2016-07-04 11:36:47 · 6005 阅读 · 0 评论 -
I2C子系统驱动架构 - 简介
文章系列I2C子系统驱动架构 - 简介I2C子系统驱动架构 - 驱动框架I2C子系统驱动架构 - 具体实现I2C介绍I2C(Inter-Integrated Circuit)是由Philips半导体(现在的NXP半导体)研发的一种串行总线,一条总线上可以接多个设备。I2C支持三种速率模式:标准,快速和高速,标准模式速率为100Khz,快速模式速率为400Khz,高速模式速率为3.4Mhz,后来在快速原创 2016-07-03 15:56:57 · 5032 阅读 · 3 评论 -
视频驱动V4L2子系统驱动架构 - ioctl
文章系列 视频驱动V4L2子系统驱动架构 - 驱动框架 视频驱动V4L2子系统驱动架构 - ioctl 基于linux4.6.3,最后会附上一张ioctl调用总图,分析代码还是要用图来说明,这样更清晰一点,我就是这么分析的,不过平时分析的图很随便,而且很大,所以就不能在这里呈现,我在这里会贴出一个简略图ioctl详解进入ioctl都是从cdev->ops->ioctl进入的,一般的驱动cde原创 2016-07-23 23:21:45 · 8104 阅读 · 2 评论 -
视频驱动V4L2子系统驱动架构 - 驱动框架
文章系列 视频驱动V4L2子系统驱动架构 - 驱动框架 视频驱动V4L2子系统驱动架构 - ioctl 基于linux4.6.3V4L2驱动框架v4l2驱动架构如图所示,v4l2也就是video for linux two,那么也就是说还有One了,v4l2前面还有v4l图中芯片模块对应Soc的各个子模块,video_device结构体主要用来控制Soc的video模块,v4l2_devic原创 2016-07-23 23:20:55 · 13794 阅读 · 0 评论 -
linux设备树的解释 - DT文件数据结构
DT数据结构总括一个设备树的总体结构如下 / o device-tree |- name = "device-tree" |- model = "MyBoardName" |- compatible = "MyBoardFamilyName" |- #address-cells = <2> |- #size-cells = <2>原创 2016-07-01 13:17:24 · 9050 阅读 · 0 评论