Linux APM在ARM中具体实现初始化

运维 系统运维
由于Linux APM系统中没有bios设备, 所以只能为APM系统创建一个虚拟的字符设备与用户空间进行通讯. 即在APM中实现一个misc设备,实质上也是一个字符设备

misc设备的主设备号是10, 而Linux APM_bios作为个misc设备, 次设备号是134。 Linux2.6.30.10内核的/drivers/char/apm-emulation.c提供了Linux APM_bios的驱动模型,也就是系统进入睡眠的入口函数,更早的版本的接口文件为:arch/arm/kernel/apm.c

在Linux APM-emulation.c中:
 

  1. /*  
  2. * The apm_bios device is one of the misc char devices.  
  3. * This is its minor number.  
  4. */  
  5. #define Linux APM_MINOR_DEV 134  

 

这个Linux APM_bios设备通过ioctl系统调用和用户空间进行通讯, 即当用户进程通过ioctl发来suspend命令时, 它就传给内核, 使系统进入suspend状态.

1,初始化
 

  1. static int __init apm_init(void)  
  2. {  
  3. int ret;  
  4. if (apm_disabled) {  
  5. printk(KERN_NOTICE "apm: disabled on user request.\n");  
  6. return -ENODEV;  
  7. }  

 

//创建一个线程, 用于处理事件队列, 工作函数是kapmd
 

  1. kapmd_tsk = kthread_create(kapmd, NULL, "kapmd");  
  2. if (IS_ERR(kapmd_tsk)) {  
  3. ret = PTR_ERR(kapmd_tsk);  
  4. kapmd_tsk = NULL;  
  5. goto out;  
  6. }  
  7. wake_up_process(kapmd_tsk);  

 

//通过proc,向用户空间输出Linux APM信息
 

  1. #ifdef CONFIG_PROC_FS  
  2. proc_create("apm", 0, NULL, &apm_proc_fops);  
  3. #endif 

//注册misc设备
 

  1. ret = misc_register(&apm_device);  
  2. if (ret)  
  3. goto out_stop;  
  4. ret = register_pm_notifier(&apm_notif_block);  
  5. if (ret)  
  6. goto out_unregister;  
  7. return 0;  
  8. out_unregister:  
  9. misc_deregister(&apm_device);  
  10. out_stop:  
  11. remove_proc_entry("apm", NULL);  
  12. kthread_stop(kapmd_tsk);  
  13. out:  
  14. return ret;  
  15. }  

 

【编辑推荐】

  1. Linux 查看磁盘空间实现代码介绍
  2. Linux操作系统需要微软的十大帮助
  3. 探寻Linux到底需要多低的配置
  4. Linux测试工具tcpdump监视TCP/IP连接命令介绍
  5. Linux流量控制实例应用介绍

 

责任编辑:chenqingxiang 来源: IT实验室
相关推荐

2009-08-31 10:38:34

C#变量初始化

2019-11-04 13:50:36

Java数组编程语言

2009-09-07 09:24:26

2011-06-17 15:29:44

C#对象初始化器集合初始化器

2011-03-16 10:52:20

2023-07-13 09:13:18

Docker容器

2010-06-21 10:49:24

Linux APM

2011-08-16 14:54:12

iphone开发APP

2011-03-31 16:46:10

LinuxMySQL

2023-11-12 23:08:17

C++初始化

2010-02-01 14:21:24

C++初始化列表

2010-08-20 16:02:45

Cassandra集群

2022-03-30 08:19:12

JavaGroovy

2022-03-21 09:50:50

JavaGroovy映射Map

2023-10-06 20:57:52

C++聚合成员

2010-01-05 15:35:21

.NET Framew

2010-02-24 15:41:19

Linux Light

2010-03-11 19:25:35

Python环境

2010-01-13 18:01:43

VB.NET数组初始化

2011-07-06 14:16:25

Linux服务器Shell脚本
点赞
收藏

51CTO技术栈公众号