在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 *** 作硬盘相应寄存器。
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
将一个进程置于休眠状态,一般步骤如下:0. 定义并初始化(如果还没有的话)一个等待队列头(wait_queue_head_t),这个等待队列头应该是能被要休眠的进程和负责唤醒的进程都能访问 到。
1. 对进程的每次休眠,定义并初始化一个等待队列(wait_queue_t)
2. 把等待队列加入到相应的等待队列头中。
3. 把进程状态置为 TASK_INTERRUPTIBLE 或 TASK_UNINTERRUPTIBLE
4. 再次检查休眠条件是否为真,否则跳过第5步
5. 执行 schedule()
6. 清理:将进程状态改为 TASK_RUNNING(通常已经是,除非是从第4步跳过来的),把等待队列从等待队列头中删除(防止多次唤醒)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)