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中:
- /*
- * The apm_bios device is one of the misc char devices.
- * This is its minor number.
- */
- #define Linux APM_MINOR_DEV 134
这个Linux APM_bios设备通过ioctl系统调用和用户空间进行通讯, 即当用户进程通过ioctl发来suspend命令时, 它就传给内核, 使系统进入suspend状态.
1,初始化
- static int __init apm_init(void)
- {
- int ret;
- if (apm_disabled) {
- printk(KERN_NOTICE "apm: disabled on user request.\n");
- return -ENODEV;
- }
//创建一个线程, 用于处理事件队列, 工作函数是kapmd
- kapmd_tsk = kthread_create(kapmd, NULL, "kapmd");
- if (IS_ERR(kapmd_tsk)) {
- ret = PTR_ERR(kapmd_tsk);
- kapmd_tsk = NULL;
- goto out;
- }
- wake_up_process(kapmd_tsk);
//通过proc,向用户空间输出Linux APM信息
- #ifdef CONFIG_PROC_FS
- proc_create("apm", 0, NULL, &apm_proc_fops);
- #endif
//注册misc设备
- ret = misc_register(&apm_device);
- if (ret)
- goto out_stop;
- ret = register_pm_notifier(&apm_notif_block);
- if (ret)
- goto out_unregister;
- return 0;
- out_unregister:
- misc_deregister(&apm_device);
- out_stop:
- remove_proc_entry("apm", NULL);
- kthread_stop(kapmd_tsk);
- out:
- return ret;
- }
【编辑推荐】
- Linux 查看磁盘空间实现代码介绍
- Linux操作系统需要微软的十大帮助
- 探寻Linux到底需要多低的配置
- Linux测试工具tcpdump监视TCP/IP连接命令介绍
- Linux流量控制实例应用介绍