Linux内核睡眠唤醒状态

Linux内核睡眠唤醒状态,第1张

Linux内核支持四种系统睡眠状态即: mem、standby、freeze and disk 。

可通过文件 /sys/power/state 进行读写访问,区别如下:

在 RockPI 4A 单板 Debian 系统 Linux 4.4 内核中,查看电源状态,仅支持 freeze和mem 两种。

原因:

1、 Platform 驱动只实现了 mem 类型的 suspend

2、只有在 hibernation 可用时,才支持 STD

1、 psci 初始化流程

suspend_set_ops() 函数赋值数组 pm_states 实现如下:

2、power state显示

/sys/power/state 文件显示的内容,通过 state_show() 函数实现,该函数最终显示数组 pm_states 的内容。

参考:

Documentation/power/states.txt

最近做无线网络在系统多次休眠唤醒后是否正常的测试,但每次休眠后都需要手动点击键盘来唤醒系统,显而易见的这种方法需要人来值守,很不放便。

此时便想是否有做自动唤醒的程序,毕竟这种需求也挺正常的,应该有人已经做过了。因此就开始查找自动唤醒的方法,果然就发现了 rtcwake 这个程序,这个程序是让系统进入休眠模式并在指定的时间后唤醒。立刻便觉得这个程序很神奇,然后就去看它的源码来找出它的实现方式,这边发现了本文的主题 RTC 子系统。

RTC 子系统在目录 /sys/class/rtc/ 下,会根据设备创建对应的目录,需要在内核中开启支持,配置如下:

debian/ubuntu 的系统可以在 /boot/config-$(uname -r) 查看内核的编译选项, archlinux 可以在 /proc/config.gz 查看。

RTC 目录下的文件含义可以在 sysfs-class-rtc 中查看。

RTC 目录中的 wakealarm 文件内容便是下次触发唤醒时间的时间,默认这个文件是没有值的。文件的内容需要设置是时间的秒数,可以向下面这样设置:

这就表示在 1 minute 后触发唤醒事件。

所以做休眠唤醒测试的流程如下:

在linux下,我喜欢用命令让系统进入休眠:

$ echo mem | sudo tee /sys/power/state

当然,不用每次都要敲这么一长串,可以把它加入到一个脚本中。 再将该脚本命令加入到/etc/sudoers文件,就可以避免每次都需要输入用户密码了。

man hdparm

hdparm -Y /dev/hd*:使硬盘进入睡眠模式;

hdparm -y /dev/hd*:使硬盘进入省电模式;

hdparm -S[num] /dev/hd*:设置超时值使硬盘进入睡眠模式;

唤醒硬盘hdparm好像没有相应参数,实际上你去 *** 作硬盘就会自动唤醒硬盘,使用ioctl有个参数可以唤醒硬盘,你可以查看硬盘 *** 作的相应头文件。

具体看hdparm的源代码,实际是使用ioctl *** 作硬盘相应寄存器。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7573777.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-07
下一篇 2023-04-07

发表评论

登录后才能评论

评论列表(0条)

保存