linux-PM wakeup source

###1. linux wakeup source wakeup source 用于阻止系统suspend 系统在suspend的状态时, 可以通过wakeup event来唤醒, wakeup event可能是按键被按下, usb插入, 或者是网卡接收到数据包, 产生这些wakeup event的设备则是wakeup source 在suspend的过程中, 若又产生了wakeup event,需要系统进行处理,因为此时并未真正suspend, 会停止suspend流程并且resume wakeup event用于阻止系统的suspend流程,而不是用于唤醒系统, suspend后唤醒系统的是中断 ###2. wakeup source 在linux kernel中, 只有device才能唤醒系统(并不是所有的设备能够唤醒系统),能够唤醒系统的设备就是wakeup source struct device { ...... struct dev_pm_info power; ...... }...

linux-PM PM callback

###1. linux的电源管理架构 linux的电源管理的粗略的架构如下: 在用户接口之下, 是由kernel中的 power core(位于kernel/power/)来处理与硬件无关的核心逻辑, 往下则是相关的driver,一部分是硬件体系结构相关的driver, 另一部分则是各设备驱动实现的电源管理功能 ###2. 原始的linux电源管理 在移动设备爆发之前, linux大部分被安装到pc机和服务器上面, 性能是首要的追求目标, 而电源管理则不是重点, 早期的linux电源管理极为粗放, 仅仅只是提供了 关机, 重启, 休眠(hibernate, 保存到硬盘), 睡眠(sleep, 保存到内存), 关闭显示器这些功能 这些功能的用户接口如下: 关机/重启 : 使用系统调用reboot()来实现, 另外sysRq(组合键或者写/proc/sys-trigger)也可用于触发reboot hibernate : echo disk > /sys/power/state sleep : echo mem >...

linux devres

###1. devres 传统的linux driver, 在驱动的probe函数中会进行资源的申请, 一旦初始化的过程中出现error, 就需要释放之前申请的资源, 为此需要使用一堆if语句进行条件判断, 或者使用一堆标签配合goto语句来进行跳转,致使整个probe的代码结构变得异常混乱, 并且driver代码不像linxu的core代码, 经过大量的测试, 很多时候, driver的作者都没有考虑完全driver的出错过程的资源释放, 因此进场发生应probe失败导致系统崩溃 为了解决这一问题, linux引入了devres来管理device的资源分配 ###2. 为何使用devres 早期的linux系统中, 大多的资源都由driver自行维护, 但是随着系统的复杂度的增加,各driver之间共用资源的情况也越来越多, kernel将resource的管理权回收, 同一管理和回收 devres的代码位于 driver/base/devres.c中, 它的实现非常简单, 并不负责具体回收和分配, 它实现的唯一功能是:提供一种机制, 将系统中某一个设备的所有资源, 以链表的形式组织起来, 以便在driver dettach的时候, 能够被自动释放 具体的实现, 由上层的framwork来实现, 比如 regulator, clock, IRQ, gpio这些framework再提供上层接口给driver开发使用...

initrd 处理流程

###1. initrd处理流程 从linux 2.4到linux 2.6,inird发展了不同的版本, kernel启动时,对initrd的处理流程也不相同。 ###2. linux 2.4对initrd的处理 1.bootloader 将 kernel 以及 /dev/initrd(由bootloader初始化,存放initrd) 中的内容加载到内存 2.在内核初始化的过程中,将 /dev/initrd 中的内容解压缩并拷贝到 /dev/ram0 (ramdisk)上 3.内核以刻度写的方式将 /dev/ram0 挂载为原始的根文件系统 4.如果 /dev/ram0 被指定为真正的根文件系统,那么内核跳至最后一步正常启动 5.执行 initrd 上的 /linuxrc 文件,linuxrc 通常是一个脚本文件,负责加载内核访问根文件系统必须的驱动, 以及加载根文件系统 6./linuxrc 执行完毕,真正的根文件系统被挂载 7.如果真正的根文件系统存在 /initrd 目录,那么 /dev/ram0 将从...

initrd

###1. initrd initrd(initialized ram disk)是一个被压缩的小型根文件系统,包含各种可执行程序和驱动程序,它们可以用来挂载实际的根文件系统,然后再将这个 initrd RAM磁盘卸载,并释放内存。initrd 是一个临时的文件系统。其生存周期很短,只会用作到真实文件系统的一个桥梁。对于一些没有存储设备的嵌入式系统中,也会使用initrd作为永久的根文件系统。 ###2. initrd出现的背景 initrd 的英文含义是 boot loader initialized RAM disk,就是由 boot loader 初始化的内存盘。在 linux内核启动前, boot loader 会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的 initrd 文件系统。 initrd的最初的目的是为了把kernel的启动分成两个阶段: 1.第一阶段先执行 initrd 文件系统中的”某个文件”,完成加载驱动模块等任务; 2.第二阶段才会执行真正的根文件系统中的 /sbin/init 进程; 第一阶段启动的目的是为第二阶段的启动扫清一切障碍,最主要的是加载根文件系统存储介质的驱动模块。我们知道根文件系统可以存储在包括IDE、SCSI、USB在内的多种介质上,如果将这些设备的驱动都编译进内核,可以想象内核会多么庞大、臃肿, 有了intrd,就可以在kernel中保留最少最基本的启动代码,然后把对各种各样硬件设备的支持以模块的方式放在initrd中,这样,只需要修改initrd,就可以支持多种硬件。 ###3. inird的用途 1.linux...