请问是谁把系统从休眠状态叫醒的?

207 views
Skip to first unread message

Dig

unread,
Dec 20, 2010, 8:19:55 AM12/20/10
to linux-...@zh-kernel.org
大家好,

最近遇到在系统休眠上遇到一些问题,想请教一下各路神仙。
一般要让系统休眠,只要 echo mem > /sys/power/state
就可以了,但是,是谁把它叫回来的呢?休眠以后,cpu好像已经停掉了,驱动肯定也没有跑,怎么动一下键盘它就能醒过来?

还有一个问题是,在我一台机器上,echo mem > /sys/power/state
以后,它就不断的进去休眠,用键盘或者按电源按钮,能醒过来一下,但马上又去睡了,我要在哪里 echo on >
/sys/power/state 叫醒系统呢?是 kernel/power 下面吗,还是init做的,还是别的什么?请各位神仙指路,谢谢了。
_______________________________________________
Linux 内核开发中文邮件列表
Linux-...@zh-kernel.org
http://zh-kernel.org/mailman/listinfo/linux-kernel
Linux 内核开发中文社区: http://zh-kernel.org

Adam Lee

unread,
Dec 20, 2010, 8:24:33 AM12/20/10
to Dig, linux-...@zh-kernel.org
On Mon, Dec 20, 2010 at 09:19:55PM +0800, Dig wrote:
> 最近遇到在系统休眠上遇到一些问题,想请教一下各路神仙。
> 一般要让系统休眠,只要 echo mem > /sys/power/state
> 就可以了,但是,是谁把它叫回来的呢?休眠以后,cpu好像已经停掉了,驱动肯定也没有跑,怎么动一下键盘它就能醒过来?

ACPI?

--
Regards,
Adam Lee
--------------------------------------------------
E-mail: adam...@gmail.com
Website: http://www.adam8157.info
--------------------------------------------------

onlyfever

unread,
Dec 20, 2010, 10:35:06 AM12/20/10
to Dig, linux-...@zh-kernel.org
按键盘会触发中断,这应该算是remote wakeup

chensheng duan

unread,
Dec 20, 2010, 8:26:41 PM12/20/10
to Dig, linux-...@zh-kernel.org


x86上不熟悉,不过就嵌入式来说,即使系统关机或者休眠,cpu核不工作了,但总有还在工作的部分,比如rtc,比如pmu。所以还能响应特定的gpio传来的信号来唤醒核心。醒了以后接着以前的pc继续走呗,不过据说有的soc唤醒还要先让uboot走一圈,就不了解了

linjian xiang

unread,
Dec 20, 2010, 8:37:10 PM12/20/10
to chensheng duan, linux-...@zh-kernel.org
不是有的吧,基本所有的嵌入式都应该这样,linux的唤醒要uboot支持,wince唤醒要eboot支持

chensheng duan

unread,
Dec 20, 2010, 8:53:16 PM12/20/10
to linjian xiang, linux-...@zh-kernel.org
在 2010年12月21日 上午9:37,linjian xiang <xiangl...@gmail.com>写道:

> 不是有的吧,基本所有的嵌入式都应该这样,linux的唤醒要uboot支持,wince唤醒要eboot支持
>
> 在 2010年12月21日 上午9:26,chensheng duan <csdua...@gmail.com>写道:
>
> 在 2010年12月20日 下午9:19,Dig <dig....@gmail.com>写道:
>>
>> > 大家好,
>> >
>> > 最近遇到在系统休眠上遇到一些问题,想请教一下各路神仙。
>> > 一般要让系统休眠,只要 echo mem > /sys/power/state
>> > 就可以了,但是,是谁把它叫回来的呢?休眠以后,cpu好像已经停掉了,驱动肯定也没有跑,怎么动一下键盘它就能醒过来?
>> >
>> > 还有一个问题是,在我一台机器上,echo mem > /sys/power/state
>> > 以后,它就不断的进去休眠,用键盘或者按电源按钮,能醒过来一下,但马上又去睡了,我要在哪里 echo on >
>> > /sys/power/state 叫醒系统呢?是 kernel/power 下面吗,还是init做的,还是别的什么?请各位神仙指路,谢谢了。
>> > _______________________________________________
>> > Linux 内核开发中文邮件列表
>> > Linux-...@zh-kernel.org
>> > http://zh-kernel.org/mailman/listinfo/linux-kernel
>> > Linux 内核开发中文社区: http://zh-kernel.org
>>
>>
>>
>> x86上不熟悉,不过就嵌入式来说,即使系统关机或者休眠,cpu核不工作了,但总有还在工作的部分,比如rtc,比如pmu。所以还能响应特定的gpio传来的信号来唤醒核心。醒了以后接着以前的pc继续走呗,不过据说有的soc唤醒还要先让uboot走一圈,就不了解了
>> _______________________________________________
>> Linux 内核开发中文邮件列表
>> Linux-...@zh-kernel.org
>> http://zh-kernel.org/mailman/listinfo/linux-kernel
>> Linux 内核开发中文社区: http://zh-kernel.org
>>
>

> 是这样嘛,我以前用过的一款soc,
因为对休眠唤醒做了不少工作,所以感觉好像没这一步。我用的那款芯片用的不是uboot,而是芯片商自己弄的一个极小的bootloader,
休眠的时候底层的核心代码在让内存进入自刷新状态,相关时钟停掉后,最后down掉cpu,感觉回来也是继续走后面的内存,时钟等相关处理。我不清楚这里需要他这个bootloader如何介入,做什么工作,从我跟踪及调试代码来看貌似和bootloader没啥关系。

cyher

unread,
Dec 20, 2010, 9:41:50 PM12/20/10
to chensheng duan, linux-...@zh-kernel.org


嵌入式的电源管理,android的系统架构,就是对sys节点控制,然后使得系统休眠可以去查阅android
kernel代码,按键启动,一般有几种情况,主要是看什么芯片。如果是高通的,因为高通是双核arm11这边睡了,但是arm9那边的pmic还是有中断相应的,你的电源键应该是直接链接到pmic类似的设备上,然后用终端唤醒系统的,因为系统停在一个状态,回来的时候只需要恢复状态就行了,速度也比较快。

--
Best Regards!

http://cyher.net

chensheng duan

unread,
Dec 20, 2010, 10:20:59 PM12/20/10
to cyher, linux-...@zh-kernel.org

恩我以前用的是单核arm11,然后通过pmu唤醒。pmu会对应多个唤醒源,配置相应的gpio就可以了。
我很好奇那些需要bootloader来唤醒的例子,不知道bootloader在这里面起到什么作用。
我想是不是那些soc把休眠实现的和带状态恢复的重启差不多,所以在bootloader里面做了些工作。

xavi kpan

unread,
Dec 20, 2010, 11:13:09 PM12/20/10
to chensheng duan, linux-...@zh-kernel.org
唤醒后需要给cpu重新上电,上电后cpu需要执行一段指令是bootloader提供的,然后该代码会判断是唤醒还是开机。

2010/12/21 chensheng duan <csdua...@gmail.com>

--
a fan of Barcelona and Linux

chensheng duan

unread,
Dec 21, 2010, 12:17:13 AM12/21/10
to xavi kpan, linux-...@zh-kernel.org

在 2010年12月21日 下午12:13,xavi kpan <xav...@gmail.com>写道:
- 显示引用文字 -

这样,不过我以前用的那款soc应该是没这步的,
我又看了下spec,是像前面的朋友所说,会在Operating Mode之间切换。我想是不是越老款的soc,在休眠方面越需要bootloader的支持
(重发,丢了抄送。。。)

Américo Wang

unread,
Dec 21, 2010, 2:36:21 AM12/21/10
to Dig, linux-...@zh-kernel.org
On Mon, Dec 20, 2010 at 09:19:55PM +0800, Dig wrote:
>大家好,
>
> 最近遇到在系统休眠上遇到一些问题,想请教一下各路神仙。
>一般要让系统休眠,只要 echo mem > /sys/power/state
>就可以了,但是,是谁把它叫回来的呢?休眠以后,cpu好像已经停掉了,驱动肯定也没有跑,怎么动一下键盘它就能醒过来?

应该是你的BIOS,或者其它什么硬件的东西,像ACPI RTC alarm。

>
>还有一个问题是,在我一台机器上,echo mem > /sys/power/state
>以后,它就不断的进去休眠,用键盘或者按电源按钮,能醒过来一下,但马上又去睡了,我要在哪里 echo on >
>/sys/power/state 叫醒系统呢?是 kernel/power 下面吗,还是init做的,还是别的什么?请各位神仙指路,谢谢了。

系统被唤醒后就相当于执行了一次快速启动,因为休眠之前已经保存了之前的状态,
所以这种重启是很快的。

你这里执行的是suspend,而不是hibernate。对于x86,这部分代码可以看acpi_save_state_mem():

memcpy((void *)acpi_realmode, &wakeup_code_start, WAKEUP_SIZE);

Dig

unread,
Dec 21, 2010, 8:35:55 AM12/21/10
to chensheng duan, linux-...@zh-kernel.org
-------------
  Dig Ge
-------------

cpu在停掉以后,包括ip寄存器在内的值应该都没有了吧,所以被reset以后是bootloader根据某些条件判断恢复寄存器还是重新加载内核/ramdisk
是吗?
那么bootloader根据什么条件来判断呢?我一直以为加载完kernel,bootloader就不再参与工作了,看了上面的回复,感觉bootloader还要动,那么它根据什么判断的呢?比如uboot,能不能请各位再指点一下大概是哪里的代码呢?多谢。

(抱歉,重发,我也丢了抄送)

Allen Wang

unread,
Dec 21, 2010, 9:46:50 PM12/21/10
to Dig, linux-...@zh-kernel.org
> 在 2010年12月21日 下午12:13,xavi kpan <xav...@gmail.com>写道:
> > - 显示引用文字 -
> >
> > 这样,不过我以前用的那款soc应该是没这步的,
> > 我又看了下spec,是像前面的朋友所说,会在Operating
> Mode之间切换。我想是不是越老款的soc,在休眠方面越需要bootloader的支持
> > (重发,丢了抄送。。。)
>
>
> cpu在停掉以后,包括ip寄存器在内的值应该都没有了吧,所以被reset以后是bootloader根据某些条件判断恢复寄存器还是重新加载内核/ramdisk
> 是吗?
>
> 那么bootloader根据什么条件来判断呢?我一直以为加载完kernel,bootloader就不再参与工作了,看了上面的回复,感觉bootloader还要动,那么它根据什么判断的呢?比如uboot,能不能请各位再指点一下大概是哪里的代码呢?多谢。
>

1.我在u-boot里面没有看到相关的代码
2.需要u-boot来参与休眠这种实现有些不可思议,既然在唤醒时能够运行u-boot,为什么不直接把kernel恢复过来呢?
3.我所知的方法是,在休眠后,CPU进入睡眠模式,关掉主时钟,只留一个低频率(例如32K)的时钟检测硬件中断,CPU检测到中断后,重新进入普通模式,因为睡眠时能够保存寄存器状态,而内存中的值也不需要改变,可以很方便、快速的恢复。

Dig

unread,
Dec 22, 2010, 8:04:43 AM12/22/10
to Allen Wang, linux-...@zh-kernel.org
2010/12/22 Allen Wang <elendi...@gmail.com>:

>
>
>> > 在 2010年12月21日 下午12:13,xavi kpan <xav...@gmail.com>写道:
>> > - 显示引用文字 -
>> >
>> > 这样,不过我以前用的那款soc应该是没这步的,
>> > 我又看了下spec,是像前面的朋友所说,会在Operating
>> > Mode之间切换。我想是不是越老款的soc,在休眠方面越需要bootloader的支持
>> > (重发,丢了抄送。。。)
>>
>>
>> cpu在停掉以后,包括ip寄存器在内的值应该都没有了吧,所以被reset以后是bootloader根据某些条件判断恢复寄存器还是重新加载内核/ramdisk
>> 是吗?
>>
>> 那么bootloader根据什么条件来判断呢?我一直以为加载完kernel,bootloader就不再参与工作了,看了上面的回复,感觉bootloader还要动,那么它根据什么判断的呢?比如uboot,能不能请各位再指点一下大概是哪里的代码呢?多谢。
>
> 1.我在u-boot里面没有看到相关的代码
> 2.需要u-boot来参与休眠这种实现有些不可思议,既然在唤醒时能够运行u-boot,为什么不直接把kernel恢复过来呢?
> 3.我所知的方法是,在休眠后,CPU进入睡眠模式,关掉主时钟,只留一个低频率(例如32K)的时钟检测硬件中断,CPU检测到中断后,重新进入普通模式,因为睡眠时能够保存寄存器状态,而内存中的值也不需要改变,可以很方便、快速的恢复。

所以即使在休眠模式(suspend),CPU或者和外围的部分器件仍然是在工作,在接收到某些中断以后,会由硬件(CPU本身)恢复休眠之前的寄存器,是这样吗?
请赐教,多谢。

cyher

unread,
Dec 22, 2010, 8:13:31 AM12/22/10
to Dig, linux-...@zh-kernel.org


这样理解从很宏观的角度可能是对的,不过确切的是,在手持设备里面的话。
cpu基本都是停转的,大部分系统只有pmic就是电源管理模块能够响应一些特殊的操作,比如rtc的一些和按键。内存是降频的,不过还是供电的,所有状态保存在内存中,启动后依次恢复状态。
--
Best regards!

http://cyher.net

Reply all
Reply to author
Forward
0 new messages