Linux APM在ARM中具體實(shí)現(xiàn)初始化
misc設(shè)備的主設(shè)備號(hào)是10, 而Linux APM_bios作為個(gè)misc設(shè)備, 次設(shè)備號(hào)是134。 Linux2.6.30.10內(nèi)核的/drivers/char/apm-emulation.c提供了Linux APM_bios的驅(qū)動(dòng)模型,也就是系統(tǒng)進(jìn)入睡眠的入口函數(shù),更早的版本的接口文件為: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
這個(gè)Linux APM_bios設(shè)備通過ioctl系統(tǒng)調(diào)用和用戶空間進(jìn)行通訊, 即當(dāng)用戶進(jìn)程通過ioctl發(fā)來suspend命令時(shí), 它就傳給內(nèi)核, 使系統(tǒng)進(jìn)入suspend狀態(tài).
1,初始化
- static int __init apm_init(void)
- {
- int ret;
- if (apm_disabled) {
- printk(KERN_NOTICE "apm: disabled on user request.\n");
- return -ENODEV;
- }
//創(chuàng)建一個(gè)線程, 用于處理事件隊(duì)列, 工作函數(shù)是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
//注冊(cè)misc設(shè)備
- 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 查看磁盤空間實(shí)現(xiàn)代碼介紹
- Linux操作系統(tǒng)需要微軟的十大幫助
- 探尋Linux到底需要多低的配置
- Linux測(cè)試工具tcpdump監(jiān)視TCP/IP連接命令介紹
- Linux流量控制實(shí)例應(yīng)用介紹