Linux APM结构中函数实现

运维 系统运维
针对APM和ACPI两种不同的标准,linux内核提供了两个不同的模块来实现电源管理功能,这就是apm和acpi

需要注意,Linux APM和acpi是互相冲突的两个模块,用户在同一时间内只能加载其中之一,如果当他们在加载的时候发现二者之一已经加载,就会自动退出。

Linux APM结构中函数实现
当一个用户进程打开apm_bios设备时, 它就会调用这个函数
static int apm_open(struct inode * inode, struct file * filp)
{
//这个关键是Linux APM_user结构变量as,它是用户和Linux APM内核部分沟通的桥梁,当有Linux APM事件发生时,就把event挂到apm_user的queue上,这样当用户读时就会读到相关事件然后处理。
struct apm_user *as;
lock_kernel();
//分配一个Linux APM_user结构, 来表示一个用户进程
as = kzalloc(sizeof(*as), GFP_KERNEL);
//读写等权限设置
if (as) {
as->suser = capable(CAP_SYS_ADMIN);
as->writer = (filp->f_mode & FMODE_WRITE) == FMODE_WRITE;
as->reader = (filp->f_mode & FMODE_READ) == FMODE_READ;
//将这个用户加入用户队列
down_write(&user_list_lock);
list_add(&as->list, &apm_user_list);
up_write(&user_list_lock);
//这是一个传递私有数据的一个通用方式
filp->private_data = as;
}
unlock_kernel();
return as ? 0 : -ENOMEM;
}
当用户空间进程去读这个设备时, 这个函数就会被调用. 这个函数的主要作用是将事件读出到用户空间.
static ssize_t apm_read(struct file *fp, char __user *buf, size_t count, loff_t *ppos)
{
struct apm_user *as = fp->private_data;
apm_event_t event;
int i = count, ret = 0;
if (count < sizeof(apm_event_t))
return -EINVAL;
//队列空, 且进程非阻塞读, 立刻返回
if (queue_empty(&as->queue) && fp->f_flags & O_NONBLOCK)
return -EAGAIN;
//否则等待到队列非空为止,
wait_event_interruptible(apm_waitqueue, !queue_empty(&as->queue));
//将队列中的事件复制给用户空间
while ((i >= sizeof(event)) && !queue_empty(&as->queue)) {
event = queue_get_event(&as->queue);
ret = -EFAULT;
if (copy_to_user(buf, &event, sizeof(event)))
break;

【编辑推荐】

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

2010-06-21 10:40:06

Linux APM

2010-06-21 10:25:09

Linux APM

2010-06-21 14:05:08

Linux APM

2021-11-02 12:19:18

Go函数结构

2009-09-28 10:09:09

Linux内核Linux循环链表

2017-01-13 15:45:05

Linuxfork函数详解

2010-10-08 09:52:18

JavaScript匿

2009-11-25 10:52:22

PHP函数contin

2009-12-29 10:24:51

Linux内核循环链表

2011-08-11 15:39:39

apm中文man

2023-03-26 22:02:53

APMPR监控

2012-11-20 10:02:33

Compuware A云挑战云环境

2010-01-18 17:38:54

C++虚函数表

2010-05-10 14:16:50

Oracle树结构

2021-03-29 08:01:20

JavaScript数据结构

2010-03-16 14:15:37

Linux系统

2023-05-11 08:37:46

LinuxSpring MVC

2014-08-24 22:11:27

2012-10-12 09:38:13

APM应用性能管理深信服

2022-02-28 08:17:24

重载函数JS前端
点赞
收藏

51CTO技术栈公众号