共計(jì) 1392 個(gè)字符,預(yù)計(jì)需要花費(fèi) 4 分鐘才能閱讀完成。
如何進(jìn)行 Linux APM 結(jié)構(gòu)中函數(shù)實(shí)現(xiàn),相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
需要注意,Linux APM 和 acpi 是互相沖突的兩個(gè)模塊,用戶在同一時(shí)間內(nèi)只能加載其中之一,如果當(dāng)他們?cè)诩虞d的時(shí)候發(fā)現(xiàn)二者之一已經(jīng)加載,就會(huì)自動(dòng)退出。
Linux APM 結(jié)構(gòu)中函數(shù)實(shí)現(xiàn)
當(dāng)一個(gè)用戶進(jìn)程打開 apm_bios 設(shè)備時(shí), 它就會(huì)調(diào)用這個(gè)函數(shù)
static int apm_open(struct inode * inode, struct file * filp)
{
// 這個(gè)關(guān)鍵是 Linux APM_user 結(jié)構(gòu)變量 as,它是用戶和 Linux APM 內(nèi)核部分溝通的橋梁,當(dāng)有 Linux APM 事件發(fā)生時(shí),就把 event 掛到 apm_user 的 queue 上,這樣當(dāng)用戶讀時(shí)就會(huì)讀到相關(guān)事件然后處理。
struct apm_user *as;
lock_kernel();
// 分配一個(gè) Linux APM_user 結(jié)構(gòu), 來表示一個(gè)用戶進(jìn)程
as = kzalloc(sizeof(*as), GFP_KERNEL);
// 讀寫等權(quán)限設(shè)置
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;
// 將這個(gè)用戶加入用戶隊(duì)列
down_write(user_list_lock);
list_add(as- list, apm_user_list);
up_write(user_list_lock);
// 這是一個(gè)傳遞私有數(shù)據(jù)的一個(gè)通用方式
filp- private_data = as;
}
unlock_kernel();
return as ? 0 : -ENOMEM;
}
當(dāng)用戶空間進(jìn)程去讀這個(gè)設(shè)備時(shí), 這個(gè)函數(shù)就會(huì)被調(diào)用. 這個(gè)函數(shù)的主要作用是將事件讀出到用戶空間.
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;
// 隊(duì)列空, 且進(jìn)程非阻塞讀, 立刻返回
if (queue_empty( as- queue) fp- f_flags O_NONBLOCK)
return -EAGAIN;
// 否則等待到隊(duì)列非空為止,
wait_event_interruptible(apm_waitqueue, !queue_empty( as- queue));
// 將隊(duì)列中的事件復(fù)制給用戶空間
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;
看完上述內(nèi)容,你們掌握如何進(jìn)行 Linux APM 結(jié)構(gòu)中函數(shù)實(shí)現(xiàn)的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道,感謝各位的閱讀!