共计 1392 个字符,预计需要花费 4 分钟才能阅读完成。
如何进行 Linux APM 结构中函数实现,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
需要注意,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;
看完上述内容,你们掌握如何进行 Linux APM 结构中函数实现的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!