linux内核电源管理浅析

2023-10-30

一 重启(reboot)

应用程序通过reboot系统调用实现机器重启,reboot系统调用定义在kernel/sys.c文件中:

SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
void __user *, arg)
{

if (!capable(CAP_SYS_BOOT))
return -EPERM;

...............

switch (cmd) {
case LINUX_REBOOT_CMD_RESTART:
kernel_restart(NULL);
break;

...........

}

}

kernel_restart()调用machine_restart(),然后调用brcm_machine_restart_mips(),最后调用掉brcm_machine_restart():

void brcm_machine_restart(const char *command)
{
/* PR21527 - Fix SMP reboot problem */
#ifdef CONFIG_SMP
smp_send_stop();
udelay(10);
#endif


#ifdef BCHP_SUN_TOP_CTRL_SW_RESET
BDEV_WR_F_RB(SUN_TOP_CTRL_RESET_CTRL, master_reset_en, 1);
BDEV_WR_F_RB(SUN_TOP_CTRL_SW_RESET, chip_master_reset, 1);
#else
BDEV_WR_F_RB(SUN_TOP_CTRL_RESET_SOURCE_ENABLE,
sw_master_reset_enable, 1);
BDEV_WR_F_RB(SUN_TOP_CTRL_SW_MASTER_RESET, chip_master_reset, 1);
#endif


while (1)
;
}

设置软件复位寄存器,导致硬件复位。需要注意的是:执行该动作需要CAP_SYS_BOOT能力,所以在linux container中可以去掉该能力,调用reboot命令,只杀死该命名空间所有进程,导致init进程重启,看到的效果就是container重启了而系统主机不重启。


二 关机(halt和poweroff)

应用程序通过如下方式实现关机:

system("echo 1 > /sys/devices/platform/brcmstb/halt_mode");
system("halt");
其中echo 1 > /sys/devices/platform/brcmstb/halt_mode
broadcom增加的,详细可以查看driver/brcmstb/sysfs.c文件:

__ATTR(halt_mode, 0644, brcm_pm_show_halt_mode,
brcm_pm_store_halt_mode),

halt命令同样通过reboot系统调用实现,和上面reboot一样,调用kernel_halt()函数,然后调用machine_halt():

void brcm_machine_halt(void)
{
/* may be S3 cold boot */
brcm_pm_s3_cold_boot();


local_irq_disable();
while (1)
;
}

最后会调用到brcm_pm_s3_cold_boot()函数,该函数定义在driver/brcmstb/power.c文件中。

通过上面的代码可以看出,该函数是永远不会返回的,在唤醒后重新启动,S3_cold_boot是通过该模式实现的。

poweroff和halt实现几乎一样,也是通过reboot系统调用实现,调用kernel_power_off(),然后关闭掉其他的cpu核 (disable_nonboot_cpus()),最后调用machine_power_off(),该函数底层和machine_halt()实现方式一样。


三 挂机(suspend)

应用程序调用:

system("echo mem > /sys/power/state");  

实现方式为:调用pm_suspend()-->enter_state()-->suspend_devices_and_enter()-->suspend_enter()-->brcm_pm_enter()

S3_warm_boot通过该方式实现,特点是DDR自刷新,当唤醒时可以从进入待机的地方返回继续执行。


四 C_A_D

可以通过reboot系统调用关闭或者打开C_A_D功能。

当键盘按下ctrl+alt+delete组合键时,会调用fn_boot_it()函数,定义在drivers/tty/vt/keyboard.c文件中:

static void fn_boot_it(struct vc_data *vc)
{
ctrl_alt_del();
}

其中ctrl_alt_del()的定义为:

void ctrl_alt_del(void)
{
static DECLARE_WORK(cad_work, deferred_cad);


if (C_A_D)
schedule_work(&cad_work);
else
kill_cad_pid(SIGINT, 1);
}

在C_A_D打开时,将deferred_cad()放在workqueue上延迟运行,deferred_cad()函数的定义为:

static void deferred_cad(struct work_struct *dummy)
{
kernel_restart(NULL);
}

所以在这种情况下,按下ctrl+alt+delete组合键看到的效果就是机器重启了。

当C_A_D关闭时,调用的是kill_cad_pid(),进一步跟踪,很容易发现该函数实际就是给init进程发送了SIGINT信号,init进程收到该信号后杀死所有用户空间进程,然后重启init进程,这种情况下,按下ctrl+alt+delete组合键看到的效果就是机器重新注销登陆。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux内核电源管理浅析 的相关文章

随机推荐

  • 关于easyui弹出两次onChange解决方案和其他的应用例子

    lt DOCTYPE html gt
  • C和C++混合编程

    C和C 混合编程 在很多情况下 C系统中会用到C 的代码 而C 中也会用到C代码 所以在Linux系统下充斥中 h c cpp后缀的代码文件 这样就引入了一个问题 如何让这些代码很好的在一起编译链接 在这几天项目中确实也遇到了相似的问题 把
  • Java之package语句和import语句

    Java之package语句和import语句
  • 机器学习人工智能中的Rubyyy或nay

    Ror是机器学习的最佳选择吗 IS ROR THE BEST CHOICE FOR MACHINE LEARNING Currently we see many web developers and tech enthusiasts tal
  • EXT.JS2.2ajax请求

    ext2 x ext3 x 不支持ajax的同步请求 ext4就开始支持 Ext Ajax request url adapterInfo do invoke queryAdapterDatabases method post params
  • 对于Java封装、继承、多态的新理解

    封装 封装包括两个字 封和装 先是装 后才封 在面向过程语言中 一般数据都是相互独立 例如姓名 年龄 性别这些数据 虽然它们都是在描述一个人 但是它们数据是离散的 这样就不便于数据的传递 例如方法需要的参数为姓名 年龄 性别等一系列参数 那
  • 1.3扩展演练---认识错误(BUG)

    1 3扩展演练 认识错误 BUG 第一个演练中常见的错误 1 gt 手误 例如使用pint hello world NameError name pint is not defined 名称错误 pint 名字没有定义 2 gt 将多条pr
  • java中super的三种用法

    java中super的用法 super只在子类中出现 super有三种用法 1 super xxx xxx可以是类的属性 例如super name 即从子类中获取父类name属性的值 2 super xxx xxx 可以是类中的方法名 su
  • el-select实现懒加载

    先看一个线上的演示示例 https code juejin cn pen 7273352811440504889 背景 我们在实际开发中经常遇到这样的需求 el select实现懒加载 用通俗的话说 为了增加响应速度 就是初始下拉只展示50
  • 「区块链+数字身份」:DID 身份认证的新战场

    美国经济学家布莱恩 阿瑟在其著作 技术的本质 中 写过这么一句话 技术总是进行着这样一种循环 为解决老问题去采用新技术 新技术又引发新问题 新问题的解决又要诉诸更新的技术 区块链技术之所以能流行 部分原因是它能解决互联网时代遗留下的问题 比
  • 手把手教你配置JAVA环境变量、安装IDEA,简单易懂,学会你给我点赞,学不会我给你点赞

    前言 保姆级教程 让你易如睡觉 学不会来叨我 我飞去给你配 如果车票报销的话 手把手教程 别人配置java的痛苦你体会不到 让你边配边笑 新手学java 看完这个就能开写啦 配置java环境 配置java环境就是安装jdk和配置环境变量 安
  • 动态库的链接和链接选项-L,-rpath-link,-rpath【转】

    转自 https my oschina net shelllife blog 115958 链接动态库 如何程序在连接时使用了共享库 就必须在运行的时候能够找到共享库的位置 linux的可执行程序在执行的时候默认是先搜索 lib和 usr
  • CPU的标志寄存器

    1 ZF 零标志位 执行指令后结果为0 ZF 1 否则ZF 0 2 PF 奇偶标识位 它记录相关指令执行后 其结果的所有二进制位中1的个数是否为偶数 如果是偶数 PF 1 否则PF 1 3 SF 符号标识位 它记录相关指令执行后 其结果是否
  • jQuery 入门教程(43): jQuery UI Tooltip 示例

    JQuery tooltip 的基本用法 可以把所有元素的的 title 属性做为Toolbar显示 比如 1 2
  • 云栖大会带热一座城,靠的是什么?

    云栖大会带热一座城 靠的是什么 这几年 每到九十月份 杭州都会热闹一阵子 几万人突然出现在杭州 然后到一个叫云栖小镇的 偏僻 地方开会 好像动物大迁徙 是什么吸引了近6万人从全国各地甚至世界各地赶来 大会的门票也跟明星演唱会那样一票难求 这
  • 微信小程序实现一些优惠券/卡券

    背景 前几周有小伙伴问我如何用css实现一些优惠券 卡券 今天就来分享一波吧 速速来Get吧 文末分享源代码 记得点赞 关注 收藏 1 实现效果 2 实现原理 2 1 实现内凹圆角 假设我们要实现这样的一个效果 两侧透明内圆角 外侧投影 有
  • Unity SpriteAtlas 打图集流程,与遇到的问题和解决方法

    Unity SpriteAtlas 打图集流程 与遇到的问题和解决方法 1 创建图集 2 遇到的问题 3 解决方法 1 创建图集 在unity里面使用SpriteAtlas 把需要用到的游戏贴图资源 创建成对应的图集
  • Spring Boot(七)logback配置

    简介 Java 日志框架众多 常用的有 java util logging log4j logback commons logging logback 是 log4j 框架的作者开发的新一代日志框架 它效率更高 能够适应诸多的运行环境 同时
  • 2分钟理解C++的条件表达式

    今天我们来学习下C 中的条件运算符和条件表达式 说个明白 条件运算符 是C 中唯一的三目运算符 由其构成的表达式称为条件表达式 它是这样的 s1 s2 s3 它的意思就是 如果s1为真 非零 则表达式的结果为s2 否则为s3 对应的if e
  • linux内核电源管理浅析

    一 重启 reboot 应用程序通过reboot系统调用实现机器重启 reboot系统调用定义在kernel sys c文件中 SYSCALL DEFINE4 reboot int magic1 int magic2 unsigned in