
Linux Driver and Kernel
文章平均质量分 90
主要关于linux 内核原理机制以及驱动相关知识点介绍
wll1228
爱好linux,喜欢嵌入式
展开
-
进程占用内存分析
linux 下面查看内存有多种渠道,比如通过命令 ps ,top,free,或者通过/proc系统。一般情况下,ps,top,free可以满足要求,如果需要比较详细和精确地知道整机内存或者某个进程内存的使用情况,可以通过/proc 文件系统。使用命令free : 显示系统可用内存以及已经使用的内存的信息ps: 查看进程信息,静态,即当前状态top: 查看进程信息,动态1. ps vs topps命令–提供系统过去信息的一次性快照,也就是说ps命令能够查看刚刚系统的进程信息。top命令反转载 2021-09-16 19:29:42 · 3412 阅读 · 0 评论 -
linux内核互斥同步之互斥体
互斥体在linux内核中,除信号量以外,还有一个类似的实现叫作互斥体Mutex。信号量的count成员可以初始化为1,并且down和up操作也可以实现类似Mutex的作用,那为什么还可以单独实现Mutex机制,Mutex的语义相对于信号量要简单轻便一些,在锁争用激烈的测试场景下,Mutex比信号量执行速度快,可扩展性更好。1.互斥体定义struct mutex { /* 1: unlocked, 0: locked, negative: locked, possible waiters */ a原创 2020-11-03 22:21:19 · 1388 阅读 · 0 评论 -
linux内核总线驱动模型-设备篇
上篇主要对总线进行了一些梳理,现在来看看内核对于设备的处理过程。struct device { struct device *parent; /*指向父上游的指针*/ struct device_private *p; struct kobject kobj; /*用它联系到sysfs中*/ const char *init_name; /* initial name of the device */ const struct device_type *type; /*设备属性文件转载 2020-11-03 22:16:02 · 322 阅读 · 0 评论 -
linux内核总线驱动模型-驱动篇
如果你了解了前面总线、设备模型,分析总线设备驱动模型的driver相对来说会轻松很多。开始也是看看其数据结构。struct device_driver { const char *name; /*驱动的名字*/ struct bus_type *bus; /*驱动属于的总线类型*/ struct module *owner; const char *mod_name; /* used for built-in modules */ bool suppress_bind_attrs转载 2020-11-03 22:15:17 · 388 阅读 · 0 评论 -
linux内核总线驱动模型-platform篇
linux从2.6开始就加入了一套新的驱动管理和注册机制平台总线,是一条虚拟的总线,设备用platform_device表示,驱动用platform_driver进行注册。于传统的总线/设备/驱动程序机制相比,平台由内核进行统一管理,在驱动中使用资源,提高了代码的安全性和可移植性。下面来看看内核时怎么注册platform总线的过程:struct device platform_bus = { .init_name = "platform",};struct bus_type platform_b转载 2020-11-03 22:14:23 · 498 阅读 · 0 评论 -
linux互斥同步之等待队列与Completion
等待队列并不是互斥机制,之所以放在这里,是因为等待队列是一些内核设施的实现机制,下面要讲的完成接口completion就是利用工作队列实现的。1.等待队列等待队列本质上是双向链表,由等待队列头和队列节点构成,当运行的进程要获得某一资源而暂不可得时,进程有时候需要等待,此时它可以进入睡眠状态,内核为此生成一个新的等待队列节点将睡眠的进程挂载到等待队列中。1.1队列头队列节点等待队列头定义:struct __wait_queue_head { spinlock_t lock; struct li原创 2020-09-07 19:14:21 · 682 阅读 · 0 评论 -
linux内核互斥同步之信号量
相对于自旋锁,信号量的最大特点是允许调用它的线程进入睡眠状态,这意味着试图获得某一信号量的进程会导致对处理器有用权的丧失,也就是出现了进程的切换。1.信号量定义与初始化信号量定义如下:struct semaphore { raw_spinlock_t lock; unsigned int count; struct list_head wait_list;};其中,lock是自旋锁变量,用于实现对信号量count的互斥操作。无符号整型变量count用于表示通过该信号量允许进入临界区的原创 2020-08-18 20:15:24 · 229 阅读 · 1 评论 -
linux内核数据结构之红黑树
红黑树1.概述红黑树是一颗二叉搜索树,它在每个节点上增加了一个存储位表示节点的颜色,可以是RED或BLACK。通过对任何一条从根到叶子的简单路径上各个节点的颜色进行约束,红黑树确保没有路径会比其他路径长出2倍,因而是近乎平衡的2.红黑树性质一个红黑树是满足下面红黑性质的二叉搜索树:每个节点或是红色,或是黑色根节点是黑色每个叶子节点是黑色的(叶子是NIL节点)如果一个节点是红色的,则它的两个子节点都是黑色的对每个节点,从该结点到其所有后代结点的简单路径上,均包含相同的黑色结点每个红黑树原创 2020-08-09 22:35:11 · 695 阅读 · 0 评论 -
内存屏障今生之Store Buffer, Invalid Queue
在「前置内容」中,我们了解到「最原始」的cpu是如何在缓存一致性协议MESI的指导下工作的,同时我们也发现此时cpu的性能因为同步请求远程(其他cpu)数据而大打折扣。本文章将介绍cpu的优化过程,你将了解到硬件层面的优化——Store Buffer, Invalid Queue,以及软件层面的优化——cpu内存屏障指令。最原始的架构性能优化之旅——Store Buffer当cpu需要的数据在其他cpu的cache内时,需要请求,并且等待响应,这显然是一个同步行为,优化的方案也很明显,采用异步。思路大概是在转载 2020-08-03 23:23:34 · 15684 阅读 · 23 评论 -
Linux内核互斥同步之自旋锁
1.自旋锁 原子变量的适用范围主要是计数,但是代码临界区往往是一个操作的集合,原子变量在此显然是不合适的,需要使用锁机制来完成同步工作,spin_lock就是内核中比较常见的锁机制。 spin_lock锁在同一个时刻只有一个内核代码路径持有,如果还有内核路径试图获取已经被持有的spin_lock,那么该内核代码路径需要一直自旋等待,直到锁持有者释放该锁。如果该锁没有被被人持有,可立即获得1.1自旋锁定义自旋锁的结构体如下:typedef struct spinlock { struct原创 2020-08-03 22:37:03 · 242 阅读 · 0 评论 -
linux内核之timer定时器
利用定时器,我们可以设定在未来的某一时刻,触发一个特定的事件。所谓低分辨率定时器,是指这种定时器的计时单位基于jiffies值的计数,也就是说,它的精度只有1/HZ,假如你的内核配置的HZ是1000,那意味着系统中的低分辨率定时器的精度就是1ms。早期的内核版本中,内核并不支持高精度定时器,理所当然只能使用这种低分辨率定时器,我们有时候把这种基于HZ的定时器机制成为时间轮:time wheel。虽然后来出现了高分辨率定时器,但它只是内核的一个可选配置项,所以直到目前最新的内核版本,这种低分辨率定时器依然被大转载 2020-07-23 19:44:41 · 3928 阅读 · 0 评论 -
linux内核之内核线程
1.内核线程概述Linux内核可以看作服务进程(管理软硬件资源,响应用户进程的各种进程)。内核需要多个执行流并行,为了防止可能的阻塞,支持多线程。内核线程就是内核的一个分身,可以用以处理一件特定事情,内核线程的调度由内核负责,一个内核线程的处于阻塞状态时不影响其他的内核线程。内核线程是直接由内核本身启动的进程。内核线程实际上是将内核函数委托给独立的进程执行,它与内核中的其他“进程”并行执行。内核线程经常被称之为内核守护进程。当前的内核中,内核线程就负责下面的工作:周期性地将修改的内存页与页来源块原创 2020-07-21 23:42:02 · 1511 阅读 · 0 评论 -
linux内核数据结构之链表
1.概述链表是一种常用的组织有序数据的数据结构,它通过指针将一系列数据节点连接成一条数据链,是线性表的一种重要实现方式。相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或删除数据。链表的开销主要是访问的顺序性和组织链的空间损失。通常链表数据结构至少应包含两个域:数据域和指针域,数据域用于存储数据,指针域用于建立与下一个节点的联系。按照指针域的组织以及各个节点之间的联系形式,链表又可以分为单链表、双链表、循环链表等多种类型,下面分别给原创 2020-07-05 17:35:27 · 414 阅读 · 1 评论 -
linux内核数据结构之位图
Linux内核-实用知识点-BITMAP概述在驱动中,有时候我们会使用位图的方式去管理资源,这种方式比较简单易懂。在对效率没有特别要求的情况下,采用位图不失为一种好的选择。其实在内核源码中也是有很多地方使用位图的,比如cpumask就是其中之一:typedef struct cpumask { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t;简单点...原创 2020-06-09 07:19:54 · 2235 阅读 · 0 评论 -
linux内核机制之设备树
1. 设备树(Device Tree)基本概念及作用在内核源码中,存在大量对板级细节信息描述的代码。这些代码充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目录,对内核而言这些platform设备、resource、i2c_board_info、spi_board_info以及各种硬件的platform_data绝大多数纯属垃圾冗余代码。为了解决这一问题,ARM内核版本3.x之后引入了原先在Power PC等其他体系架构已经使用的Flatte转载 2020-05-16 08:03:12 · 3869 阅读 · 0 评论 -
深入分析 Linux 内核链表
转:https://www.ibm.com/developerworks/cn/linux/kernel/l-chain/一、 链表数据结构简介链表是一种常用的组织有序数据的数据结构,它通过指针将一系列数据节点连接成一条数据链,是线性表的一种重要实现方式。相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或删除数转载 2016-11-23 08:47:53 · 321 阅读 · 0 评论 -
start_kernel-cgroup
转载自:叶剑峰(http://www.cnblogs.com/yjf512/)前置:这里使用的linux版本是4.8,x86体系。cgroup_init_early();聊这个函数就需要先了解cgroup。cgroup概念这个函数就是初始化cgroup所需要的参数的。cgroup最初是在2006年由google的一名工程师提出的,目的是把一些共同目标的进程放在一转载 2016-11-24 15:24:47 · 338 阅读 · 0 评论 -
ARM Linux对中断的处理--中断管理系统的初始化
中断管理系统的初始化http://blog.chinaunix.net/uid-12567959-id-160975.html我们先来看一下Linux系统中,中断管理系统的初始化。中断系统的初始化主要由几个函数来完成。在系统初始化的start_kernel()函数 (在文件init/main.c中定义)中可以看到:asmlinkage void __init start_kerne转载 2016-12-17 15:32:06 · 637 阅读 · 0 评论 -
学习linux内核之一Makefile分析
转自:http://www.cnblogs.com/amanlikethis/p/3675486.html感谢作者的辛勤付出linux源码Makefile的详细分析目录一、概述 1、本文的意义 2、Linux内核Makefile文件组成二、Linux内核Makefile的“make解析”过程 1 顶层Makefile阶段 1、从总目标uIma转载 2018-01-11 11:52:01 · 402 阅读 · 0 评论 -
【深入理解Linux内核】【分页】相关函数或宏
PAGE_SHIFT PMD_SHIFT PUDSHIFT PGDIR_SHIFT 指定offset字段位数 指定offset和table总位数 确定页上级目录能够映射的区域大小 确定页全局目录能够映射的区域大小PTRS_PER_PTE,PTRS_PER_PMD,PTRS_PER_PUD,PTRS_PER_PGD:分别表示页表,页中间目录,页上级目录,页全局目录中项的个数原创 2016-05-16 17:22:35 · 985 阅读 · 0 评论