网站首页 > 技术教程 正文
在用户空间向文件/sys/power/state写入mem即可触发Linux内核睡眠(Suspend)功能。
相关功能代码见:kernel/power/main.c和suspend.c等文件。
Linux内核Suspend总体流程如下:
state_store()->
pm_suspend()->
pm_suspend_marker("entry") ## 1、标记进入睡眠
enter_state()-> ## 2、处理睡眠相关工作,重点关注
sys_sync() ## 2.1、同步文件系统
suspend_prepare() ## 2.2、准备进入系统睡眠状态,并冻结用户空间进程和内核线程
suspend_devices_and_enter() ## 2.3、休眠外设并进入系统睡眠状态,该函数在系统唤醒时返回
suspend_finish() ## 2.4、睡眠结束并被唤醒
pm_suspend_marker("exit") ## 3、标记退出睡眠
下面重点介绍suspend_devices_and_enter()函数的流程:
suspend_devices_and_enter()->
## 1、冻结串口,可以在u-boot传入no_console_suspend,释放suspend流程中串口打印
suspend_console()
## 2、外设驱动suspend
dpm_suspend_start()->
dpm_prepare()->
device_prepare() ## 执行设备电源管理函数中的prepare函数
dpm_suspend()->
device_suspend()->
__device_suspend()->
dpm_run_callback()->
initcall_debug_start() ## 显示调用的各suspend()函数名等信息,需要打开pm_print_times
cb() ## 执行各.suspend()函数,包括:外设驱动,电源域,总线等(重点关注****)
initcall_debug_report() ## 显示各suspend()函数返回值和执行时间
## 3、系统进入睡眠状态,该流程同时处理唤醒操作
suspend_enter()->
platform_suspend_prepare()
dpm_suspend_late(PMSG_SUSPEND)->
device_suspend_late()->
__device_suspend_late()->
dpm_run_callback()->
initcall_debug_start() ## 显示调用的各suspend()函数名等信息,需要打开pm_print_times
cb() ## 执行各.suspend_late()函数 (重点关注****)
initcall_debug_report() ## 显示各.suspend_late()函数返回值和执行时间
dpm_suspend_noirq(PMSG_SUSPEND)->
device_suspend_noirq()->
__device_suspend_noirq()->
dpm_run_callback()->
initcall_debug_start() ## 显示调用的各suspend()函数名等信息,需要打开pm_print_times
cb() ## 执行各.suspend_noirq()函数 (重点关注****)
initcall_debug_report() ## 显示各.suspend_noirq()函数返回值和执行时间
disable_nonboot_cpus() ## 冻结非启动cpu
arch_suspend_disable_irqs() ## 关中断
syscore_suspend() ## 执行注册在syscore_ops_list上的syscore_ops的suspend
##################################### 开始唤醒,流程和suspend相反 #######################
syscore_resume()
arch_suspend_enable_irqs()
enable_nonboot_cpus()
dpm_resume_noirq(PMSG_RESUME)
dpm_resume_early()
platform_resume_finish()
dpm_resume_end(PMSG_RESUME)
resume_console()
注:本文基于RockPI 4A单板Debian系统Linux 4.4内核。
猜你喜欢
- 2025-05-03 通俗易懂:把linux驱动编译进内核(linux驱动编译命令)
- 2025-05-03 Linux之父:Linux内核5.8是“我们有史以来最大的发行版之一”
- 2025-05-03 深度操作系统 Deepin V23 安装最新的 linux 内核
- 2025-05-03 TCP/IP协议栈在Linux内核中的运行时序分析
- 2025-05-03 Linux内核源码分析(linux内核源码谁会看)
- 2025-05-03 多年一直用Linux内核,微软也内疚
- 2025-05-03 深入了解Linux的虚拟内存管理「嵌入式工程师」
- 2025-05-03 从 0 到 1:如何用 eBPF 深入监控 Linux 内核?
- 2025-05-03 「技术干货」一文搞懂怎么使用Linux内核模块
- 2025-05-03 详解Linux内核源码体系结构与内核结构(图解)
你 发表评论:
欢迎- 最近发表
-
- linux日志文件的管理、备份及日志服务器的搭建
- Linux下挂载windows的共享目录操作方法
- Linux系统中的备份文件命令(linux系统中的备份文件命令有哪些)
- 麒麟KYLINOS|通过不同方法设置用户访问文件及目录权限
- 「Linux笔记」系统目录结构(linux目录的结构及含义)
- linux中修改归属权chown命令和chgrp命令
- 工作日报 2021.10.27 Android-SEAndroid权限问题指南
- Windows和Linux环境下,修改Ollama的模型默认保存路径
- 如何强制用户在 Linux 上下次登录时更改密码?
- 如何删除Linux文件夹中除某些扩展名之外的所有文件?
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)