从内核空间关闭(嵌入式)linux

从内核空间关闭(嵌入式)linux,linux,linux-kernel,embedded-linux,Linux,Linux Kernel,Embedded Linux,我正在为基于ARM9的平台Olinuxino开发2.6.35内核的修改版本。我正在尝试修改电源管理驱动程序(特定于体系结构的部分) 处理器为飞思卡尔i.MX23。该处理器有一个称为PSWITCH的“特殊”引脚,它触发由电源管理驱动程序处理的中断。 如果按下开关,系统将进入待机状态。这在驱动程序中通过调用pm\u suspend(pm\u suspend\u STANDBY)完成 鉴于我的硬件设置,我想关闭系统。 所以我的问题是: 内核空间进程触发干净系统暂停/断电的首选方式是什么? 我想有一个很

我正在为基于ARM9的平台Olinuxino开发2.6.35内核的修改版本。我正在尝试修改电源管理驱动程序(特定于体系结构的部分)

处理器为飞思卡尔i.MX23。该处理器有一个称为PSWITCH的“特殊”引脚,它触发由电源管理驱动程序处理的中断。 如果按下开关,系统将进入待机状态。这在驱动程序中通过调用
pm\u suspend(pm\u suspend\u STANDBY)
完成

鉴于我的硬件设置,我想关闭系统。 所以我的问题是:

内核空间进程触发干净系统暂停/断电的首选方式是什么?

我想有一个很好的小函数调用,但到目前为止我还没有找到

我的内核代码(我正在处理的文件是arch/arm/mach-mx23/pm.c)可以在这里找到:,尽管我的问题需要一种通用的Linux内核方法。

最通用的方法是让驱动程序作为用户空间助手调用
关机

static const char * const shutdown_argv[] = 
    { "/sbin/shutdown", "-h", "-P", "now", NULL };

call_usermodehelper(shutdown_argv[0], shutdown_argv, NULL, UMH_NO_WAIT);
(假设您安装了
/sbin/shutdown
二进制文件)。这将彻底关闭用户空间,卸载文件系统,然后请求内核关闭并关闭电源


但是,您可能可以做得更好—例如,如果您可以保证没有磁盘文件系统装载读/写,您可以告诉内核线程调用
kernel\u power\u off().

您可以在
init 0
上执行
strace
,查看执行了哪些系统调用。这非常有效。我希望会有一个解决方案,不涉及调用用户空间,但我想有很多用户空间的东西需要做。。。只是一个细节:shutdown_argv应该是const char*const*或[]。我在我的嵌入式powerpc上使用了kernel_halt()来执行此操作,它似乎确实经历了init 0过程。你认为我错过了什么吗?@BenjaminLeinweber:也许你注册了一个重新启动通知程序,告诉init关闭?通常,调用
kernel\u halt()
(或
kernel\u power\u off()
)甚至不会同步磁盘-这相当于从用户空间使用
reboot(2)
系统调用。