Linux内核
文章平均质量分 85
Loopers
操作系统爱好者
展开
-
Linux进程分配内存的两种方式--brk() 和mmap()
原文链接:https://www.cnblogs.com/vinozly/p/5489138.html这篇文章将brk和mmap讲解的很到位,以及缺页的过程。如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看。 majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文...转载 2018-03-21 11:10:29 · 1633 阅读 · 0 评论 -
深入理解Linux中内存管理
前一段时间看了《深入理解Linux内核》对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看法和认识。 我比较喜欢搞清楚一个技术本身的发展历程,简而言之就是这个技术是怎么发展而来的,在这个技术之前存在哪些技术,这些技术有哪些特点,为什么会被目前的技术所取代,而目前的技术又解决了之前的技术所存在转载 2016-10-20 16:53:22 · 526 阅读 · 0 评论 -
Linux设备驱动模型-Bus
前言在linux设备驱动模型中,总线可以看作是linux设备模型的核心,系统中的其他设备以及驱动都是以总线为核心围绕。不过驱动程序员在系统中创建一条总线的机会并不多。驱动模型中的总线可以是真是存在的物理总线(USB总线,I2C总线,PCI总线),也可以是为了驱动模型架构设计出的虚拟总线(Platform总线)。为此linux设备驱动模型都将围绕"总线--设备--驱动"来展开,因为符合linux原创 2016-10-20 16:13:28 · 1251 阅读 · 0 评论 -
Linux电源管理-Runtime PM
前言1. 什么是Runtime PM? Runtime PM (Runtime Power Management)翻译过来就是运行时电源管理。主要的作用是: 每个设备处理好自己的电源管理,在不需要工作时进入低功耗状态。也就是"各人自扫门前雪"。2. 为什么需要Runtime PM? system suspend需要很长时间完成,其中还可能出现失败。比如f原创 2016-11-10 11:05:40 · 14330 阅读 · 5 评论 -
Linux设备驱动模型-Driver
前言linux将所有的驱动抽象为struct device_driver结构。这样设计可以方便驱动程序更好编写,在编写驱动的时候只需要将此结构嵌入到具体的驱动中即可。比如常见的结构: struct platform_driver结构struct platform_driver { int (*probe)(struct platform_device *); int (*remo原创 2016-10-19 20:03:41 · 1162 阅读 · 0 评论 -
Linux设备驱动模型-Device
前言Linux将所有的设备统一抽象为struct device结构, 同时将所有的驱动统一抽象为struct device_driver结构。这样设计之后就方便驱动开发工程师编写驱动,只需要将具体的设备包含struct device结构,具体的驱动包含struct device_driver结构。最终会调用device_register和driver_register将驱动和设备注册到系统,表原创 2016-10-19 16:53:44 · 1173 阅读 · 0 评论 -
Linux电源管理-Suspend/Resume流程
前言根据上一节linux电源管理-概述可知,linux电源管理存在的几种方式,如何查看这几种方式,以及最后的如何睡眠唤醒等。通过echo mem > /sys/power/state就可以达到睡眠,所以可以根据此节点的sys代码分析suspend的流程。suspend代码分析在手机端执行如下命令:echo mem > /sys/power/state根据sys节点的属原创 2016-10-27 17:10:48 · 16108 阅读 · 0 评论 -
Linux电源管理-概述
前言在如今嵌入式可移动设备大热的时期,功耗是检测此设备一项重要的指标。如何能做到手机待机时间长久,而且用户还能玩的尽兴,这时候就必须对设备进行省电管理。那用什么省电方式呢? 比如在手机听音乐的时候关闭屏幕,在看电影的时候调节屏幕亮度等都可以用来省电。这些方法在linux操作系统中已经做了统一的实现: suspend/resume机制。本节就简单认识下linux下的电源管理。电源状态原创 2016-10-25 17:52:22 · 5583 阅读 · 0 评论 -
Linux设备驱动模型-Uevent
前言当一个设备动态的加入到系统时候(比如常见的将U盘插入到PC机器上), 设备驱动程序就需要动态的检测到有设备插入了系统,就需要将此事件通知到用户层,然后用户层对这一事件做响应的处理,比如加载USB驱动,更新UI等。而将此事件通知到用户层就需要某种机制,典型的就是mdev hotplug和udev。关于udev和mdev hotplug可以在上篇文章有解释。Linux系统对uevent机制的具原创 2016-09-29 17:21:16 · 4606 阅读 · 1 评论 -
udev和mdev hotplug
1. udev 和mdev 是两个使用uevent 机制处理热插拔问题的用户空间程序,两者的实现机理不同。udev 是基于netlink 机制的,它在系统启动时运行了一个deamon 程序udevd,通过监听内核发送的uevent 来执行相应的热拔插动作,包括创建/删除设备节点,加载/卸载驱动模块等等。2. mdev 是基于uevent_helper 机制的,它在系统启动时修改了内核中转载 2016-09-29 15:31:57 · 1256 阅读 · 0 评论 -
Linux电源管理-Autosleep
前言什么是Autosleep? 字面理解就是"没有事情干的时候睡觉"。而起初autosleep是在Android上的一个patch(https://lwn.net/Articles/479711/)演化而来的,当时名字叫做"Opportunistic sleep",翻译过来叫做"机会主义睡眠",也就是有机会就睡。因为此名字比较有争议,最后修改为autosleep。autosle原创 2016-11-04 16:52:01 · 6142 阅读 · 0 评论 -
devtmpfs文件系统创建设备节点
devtmpfs概述1.devtmpfs 的功用是在 Linux 核心 启动早期建立一个初步的 /dev,令一般启动程序不用等待 udev,缩短 GNU/Linux 的开机时间。2.重要解释Devtmpfs lets the kernel create a tmpfs very early at kernel initialization, before any drive转载 2016-10-08 16:22:35 · 7045 阅读 · 1 评论 -
Linux RTC驱动模型分析之rtc-proc.c
认识rtc节点proc下的rtc节点的位置是: /proc/driver/rtc。 该节点可以清晰的显示出当前的时间,当前的日期,alarm的时间,日期,alarm是否使能等详细信息。在分析代码之前先认识一下。root@test:/opt/ltp-ddt # cat /proc/driver/rtc rtc_time : 06:25:56原创 2016-08-30 17:00:11 · 1587 阅读 · 0 评论 -
Linux RTC驱动模型分析之rtc-sysfs.c
rtc节点rtc-sysfs文件主要的操作就是在sys下创建rtc的属性节点,可以方便用户方便快捷的访问,查找问题。下来大概看看sys下的rtc节点,有个直观的认识。[root@test ~]# cat /sys/class/rtc/rtc0/date hctosys power/ time dev原创 2016-08-30 19:21:58 · 5970 阅读 · 1 评论 -
Linux电源管理-Operating Performance Points(OPP)
概述1. 什么是Operating Performance Points?如今复杂的Soc由多个并行工作的子模块组成。在一个执行各种用例的操作系统中,不是Soc中的所有模块都一直以其最高的执行频率工作。为了实现这一目的,Soc中的子模块被分组成域,允许一些域以较低的频率和电压运行,而其他的域运行在较高的电压和频率上。将域中每个设备支持的电压和频率的离散元组的集合称为Operati原创 2016-12-29 17:19:40 · 5378 阅读 · 0 评论 -
socketpair机制
描述先看下传统的CS模型,如下:总是一方发起请求,等待另一方回应。当一次传输完成之后,client端发起新的请求之后,server端才作出回应。 那如何才能做到双向通信? 一种解决办法就是client端即使client,又是server,server端即使client也是server,如下:但是上述方面比较复杂,这时候就引入要分析的socketpair了。原创 2017-01-05 11:25:36 · 9202 阅读 · 1 评论 -
Epoll 机制
描述epoll 是poll系统调用的升级版。可以用做单边沿(level-triggered)和双边沿(edge-triggered)的两种工作模式,同样也可以用于检测多个文件描述符。 APIepoll_create(int size)用于创建一个epoll的实例对象。参数size代表可以一次性检测的文件对象的个数。返回值是epoll 实例对象的文件描述符,次描述符用于后续的原创 2017-01-04 17:14:12 · 862 阅读 · 0 评论 -
Inotify机制
描述Inotify API用于检测文件系统变化的机制。Inotify可用于检测单个文件,也可以检测整个目录。当检测的对象是一个目录的时候,目录本身和目录里的内容都会成为检测的对象。此种机制的出现的目的是当内核空间发生某种事件之后,可以立即通知到用户空间。方便用户做出具体的操作。Inotify APIinotify_init(void)用于创建一个inotify的实例,然后返原创 2017-01-04 14:14:13 · 13016 阅读 · 0 评论 -
Linux电源驱动-Linux Cpuidle Framework
前言现如今,Linux处理器电源管理重点聚焦在处理器处于运行状态时对其进行电源管理,主要的技术是Cpufreq: 根据cpu的负载,实时的改变cpu的频率或这电压,同时管理处理器的性能水平和电源功耗等。相反当处理器处于空闲状态,也就是idle状态时的功耗也需要进行管理。也就是本文需要讨论的重点: Cpuidle。目前市场中几乎所有的移动处理器都支持多处理器空闲状态的概念,而且每个原创 2016-12-12 17:15:17 · 3451 阅读 · 0 评论 -
Linux电源管理-Linux Regulator Framework代码分析
示例分析在内核kernel/drivers/regulator/dummy.c文件中构造了一个虚拟的regulator,参考此文件编写一个虚拟的regulator driver。#include #include #include #include #include #include #include static struct regulator_dev *dummy_原创 2016-11-15 14:44:23 · 6345 阅读 · 0 评论 -
拒绝Wakelock提高续航!安卓省电优化攻略
安卓耗电的元凶:Wakelock 相信不少朋友都在为安卓的耗电问题所困扰,在通常的使用环境下,iOS的电源管理远比安卓优秀,这个差距主要体现在待机上——你可以将iPhone安心放在枕边一夜醒来电量纹丝不动,但如果换成安卓机的话,恐怕电量早已测漏光光连闹钟都不会响了。不过,虽说安卓本身是个实时多任务系统,但在待机时,系统本身是不甚耗电的,安卓4.2.2发布后电量控制更是备受好评。待机时转载 2016-11-02 18:01:44 · 3548 阅读 · 0 评论 -
Linux电源管理-wakeup count
前言在wakeup events framework小节中提到,wakeup events framwork可以解决system suspend和wakeup events之间的同步问题。而整篇下来没有看到是如何解决同步问题的。所有本小节继续分析wakeup events framework中的重要知识点-wakeup count。"wakeup count"是不是很熟悉? 是的原创 2016-11-02 16:11:40 · 3344 阅读 · 1 评论 -
Linux电源管理-Linux regulator framework概述
前言1. 什么是regulator? regulator翻译为"调节器",分为voltage regulator(电压调节器)和current(电流调节器)。一般电源管理芯片(Power Management IC)中会包含一个甚至多个regulator。2. regulator有什么作用? 通常的作用是给电子设备供电。大多数regulator可以启用(e原创 2016-11-14 14:53:01 · 9710 阅读 · 3 评论 -
Linux电源管理-wakeup events framework
前言通常新机制/事物的出现往往是解决某些问题的,同样wakeup events framework机制也不例外。先带大家了解下wakeup events framework出现的背景,然后在了解其内部的实现机制。Linux系统中的电源管理一般是冷睡眠,而Android系统却将linux系统中的睡眠作为通常待机使用,显然Linux中的电源管理不符合Android系统。Android说既然不符原创 2016-11-01 14:51:17 · 7108 阅读 · 1 评论 -
Linux电源管理-wakelock
前言之前说过Google为了在user space阻止系统suspend,为Android设计出一套新的电源管理: wakelocks, early_suspend等。此机制修改了Linux原生的susupend流程,定义子自己的休眠接口。起初Android为了合入此patch和Linux内核开发者有一段时间的讨论。比如此地址:http://lwn.net/Articles/318611/原创 2016-11-03 14:43:07 · 7089 阅读 · 0 评论 -
Linux设备驱动模型-Kset
前言当多个kobject属于同一类的时候,为了方便管理,就引入了Kset。Kset可以认为是一组kobject的集合,是kobject的容器。比如/sys/bus下就属于同一类kobject。shell@test:/sys/bus $ lsclockeventsclocksourcecontainercoresightcpuevent_sourcehid原创 2016-09-26 15:44:31 · 1094 阅读 · 0 评论 -
Linux内核通知链(Notifier)
引入在linux内核中,各个子系统之间有很强的相互关系,某些子系统可能对其他子系统产生的事件比较感兴趣。因此内核引入了notifier机制,当然了notifier机制只能用在内核子系统之间,不能用在内核与应用层之间。比如当系统suspend的时候,就会使用到notifier机制来通知系统的内核线程进行suspend。内核实现的notifier机制代码位于kernel/kernel/原创 2016-09-21 15:34:37 · 3206 阅读 · 2 评论 -
顺序锁(seqlock)
顺序锁的引入前面学习了spin_lock可以知道,spin_lock对于临界区是不做区分的。而读写锁是对临界区做读写区分,并且度进程进入临界区的几率比较大,因为写进程进入时需要等待读进程退出临界区。而有没有一种方法,可以保护写进程的优先权,使得写进程可以更快的获得锁? 答案是有的,就是顺序锁。顺序锁的原理顺序锁的设计思想是:对某一个共享数据读取的时候不加锁,写的时候加锁。同时为原创 2016-08-17 17:00:59 · 5514 阅读 · 0 评论 -
自旋锁spin_lock
原子变量适用在多核之间多单一共享变量进行互斥访问,如果要保护多个变量,并且这些变量之间有逻辑关系时,原子变量就不适用了。例如:常见的双向链表。假设有三个链表节点A、B、C。需要将节点B插入节点A、C之间。如果CPU A刚好将A节点的后向指针指向B,但是还没有将B的后向指针指向C。此时CPU B要遍历链表,这将会一个灾难性的后果。原创 2016-08-01 19:01:52 · 3564 阅读 · 0 评论 -
spinlock变量没有初始化
最近在一次的稳定性测试中发现如下问题:c7 BUG: spinlock bad magic on CPU#7, Binder_5/6373c7 lock: system_int_lock+0x0/0x18, .magic: 00000000, .owner: /-1, .owner_cpu: 0c7 CPU: 7 PID: 6373 Comm: Binder_5 Tainted: c7原创 2016-08-16 20:01:28 · 6687 阅读 · 0 评论 -
读写锁rwlock
读写锁引入在前面小节分析了spin_lock的实现,可以知道spin_lock只允许一个thread进入临界区,而且对进入临界区中的操作不做细分。但是在实际中,对临界区的操作分为读和写。如果按照spin_lock的实现,当多个read thread都想进入临界区读取的时候,这时候只有一个read thread进入到临界区,这样效率和性能明显下降。所以就针对某些操作read thread占绝大多原创 2016-08-15 17:34:31 · 2737 阅读 · 1 评论 -
Linux互斥与同步之原子操作
例子一个全局共享的变量flagint flag=0进程Avoid funcA(){ flag++;}进程Bvoid funcB(){ flag++}在进程A和进程B都运行起来后,flag的值应该会是多少?case1funcA先执行,再执行funcB。或者 funcB先执行,再执行funcA。 上述无论那个先执行,结果都是原创 2016-07-20 09:57:19 · 1775 阅读 · 0 评论 -
disable_irq/enable_irq使用不匹配
最近在一次稳定性测试中,发现Kernel Log中出现了如下的Warring,如下:WARNING: CPU: 4 PID: 2956 at /space/builder/repo/sprdroid6.0_trunk_k318_dev/kernel/kernel/irq/manage.c:444 __enable_irq+0x50/0x94()Unbalanced enable for IRQ 2原创 2016-06-22 16:09:04 · 6804 阅读 · 0 评论 -
per-CPU变量
为什么需要per-CPU变量假设系统中有4个cpu, 同时有一个变量在各个CPU之间是共享的,每个cpu都有访问该变量的权限。 当cpu1在改变变量v的值的时候,cpu2也需要改变变量v的值。这时候就会导致变量v的值不正确。这时候机智的你就会说,在cpu1访问变量v的时候可以使用原子操作加锁,cpu2访问变量v的时候需要等待。可是机智的是否考虑过加锁对性能的影响,原子操作对cpu是极耗cpu的。再原创 2016-07-26 17:21:21 · 5940 阅读 · 0 评论 -
GCC内嵌汇编
如果你是一个嵌入式开发人员,或者是Linux内核研发人员。可能经常会在内核中遇见如下代码:/* * CPU interrupt mask handling. */static inline unsigned long arch_local_irq_save(void){ unsigned long flags; asm volatile( "mrs %0原创 2016-07-14 16:25:55 · 2509 阅读 · 1 评论 -
zram 简介
本文部分转载于: http://kernel.meizu.com/zram-introduction.htmlzram 技术的由来zram(也称为 zRAM,先前称为 compcache)是 Linux 内核的一项功能,可提供虚拟内存压缩。zram 通过在 RAM 内的压缩块设备上分页,直到必须使用硬盘上的交换空间,以避免在磁盘上进行分页,从而提高性能。由于 zram 可以用内存替代硬盘为系统提供交转载 2016-07-13 17:57:52 · 13983 阅读 · 0 评论 -
Linux消息队列
什么是消息队列消息队列可以分为队列和消息队列 队列是从开始到结束,有序的排放消息。消息队列是用来在应用程序发送消息,队列中存放了一些待处理的消息。消息 消息用来在接受者和发送者之间传输,它本质上是一个字节数组,上面有一些头信息。一个消息示例可以是任何告诉一个系统开始处理任务或完成任务的信息。消息队列的基本结构是简单的,有一个客户端应用程序称为生产者,创建消息,并将它们传送到消息队列。其他应原创 2016-07-22 16:44:09 · 594 阅读 · 0 评论 -
jiffies
HZLinux内核每隔固定周期都会发生时钟中断, 而HZ代表系统在1s中发生时钟中断的次数。如果HZ=1000,则系统在1s之内会发生1000次时钟中断。HZ的值可以在kernel的配置文件config中配置,其中可以配置为100, 250, 1000等。# CONFIG_HZ_100 is not setCONFIG_HZ_250=y# CONFIG_HZ_300 is原创 2016-08-19 10:26:36 · 3432 阅读 · 1 评论 -
spin_lock的变体
spin_lock变体的引入考虑如下图所示的情况:当处理器上当前进程A需要对共享变量a操作,所以在操作前通过spin_lock获取锁进入临界区,如上图标号1。当进程A进入临界区后,进程A所在的处理器发生了一个外部硬件中断,此时系统必须停下进程A的执行转向执行中断,如上图标号2。假设中断处理程序也需要操作共享变量a,所以在操作之前也许要调用spin_lock获取锁来操作变量a。当中断原创 2016-08-08 16:28:23 · 1514 阅读 · 0 评论 -
workqueue
Workqueue引入在之前的softirq中提到过,内核在中断的bottom half引入了softirq, tasklet, workqueue。 而softirq和tasklet只能用在中断上下文中,而且不可以睡眠。所以内核引入了workqueue,工作队列运行在进程上下文,同时可以睡眠。在以前版本的内核中workqueue的代码比较简单。在linux2.6.30代码量在1000行左原创 2016-09-13 17:44:16 · 2110 阅读 · 0 评论