所以我試圖編寫一個使用linux/timer.h文件的內核模塊。我只是在模塊內部工作,現在我正試圖從用戶程序開始工作。如何使用ioctl()來操作我的內核模塊?
這裏是我的內核模塊:
//Necessary Includes For Device Drivers.
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>
#include <linux/timer.h>
#include <linux/ioctl.h>
#define DEVICE_NAME "mytimer"
#define DEVICE_FILE_NAME "mytimer"
#define MAJOR_NUM 61
#define MINOR_NUM 0
MODULE_LICENSE("Dual BSD/GPL");
static struct timer_list my_timer;
struct file_operations FileOps =
{
//No File Operations for this timer.
};
//Function to perform when timer expires.
void TimerExpire(int data)
{
printk("Timer Data: %d\n", data);
}
//Function to set up timers.
void TimerSetup(void)
{
setup_timer(&my_timer, TimerExpire, 5678);
mod_timer(&my_timer, jiffies + msecs_to_jiffies(5000));
}
//Module Init and Exit Functions.
int init_module(void)
{
int initResult = register_chrdev(MAJOR_NUM, "mytimer", &FileOps);
if (initResult < 0)
{
printk("Cannot obtain major number %d\n", MAJOR_NUM);
return initResult;
}
printk("Loading MyTimer Kernel Module...\n");
return 0;
}
void cleanup_module(void)
{
unregister_chrdev(MAJOR_NUM, "mytimer");
printk("Unloading MyTimer Kernel Module...\n");
}
更具體地說,我希望我的用戶程序調用TimerSetup()函數。我知道我需要使用ioctl(),但我不知道如何在我的MODULE FILE中指定TimerSetup()應該可以通過ioctl()調用。
另外,我的第二個問題:我能夠insmod我的模塊和mknod到正確的主編號/ dev/mytimer。但是當我試圖打開()它以便我可以從中獲取文件描述符時,它會一直返回-1,我認爲這是錯誤的。我確定權限沒有問題(事實上,我確定它只是777)......它仍然不起作用......有什麼我失蹤了嗎?
下面是用戶程序,以防萬一:
#include <stdio.h>
int main(int argc, char* argv[])
{
int fd = open("/dev/mytimer", "r");
printf("fd: %d\n", fd);
return 0;
}
我真的看了看,但並不完全瞭解它... 我看到了函數 static long softdog_ioctl(struct file * file,unsigned int cmd,unsigned long arg) 但是不明白裏面的內容。這是唯一的ioctl功能嗎? – hahuang65 2010-02-15 07:20:39
真棒,它看起來像你做了一個很好的工作解釋你的帖子界面:)謝謝。 – hahuang65 2010-02-15 07:26:16
雖然這個答案現在已經超過5年了,但我確實有一個問題。如果對'ioctl'的進一步實現令人不悅,那麼最佳選擇是什麼? – sherrellbc 2015-09-18 01:44:02