我正在尝试编写一个内核模块,使用linux/timer.h文件。我已经使它在模块内部工作,现在我正在尝试让其从用户程序中工作。
以下是我的内核模块:
//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(),但我不确定如何在我的模块文件中指定可通过ioctl()调用TimerSetup()。
另外,我的第二个问题是:我能够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;
}
ioctl
被认为是不好的,那么首选的替代方案是什么? - sherrellbc