Así que estoy tratando de escribir un módulo kernel que use el archivo linux/timer.h. Lo tengo para trabajar dentro del módulo, y ahora estoy tratando de hacerlo funcionar desde un programa de usuario.¿Cómo uso ioctl() para manipular mi módulo kernel?
Aquí es mi módulo del kernel:
//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");
}
Más específicamente, quiero que mi programa de usuario para llamar a la función TimerSetup(). Sé que tendré que usar ioctl() pero no estoy seguro de cómo especificar en mi ARCHIVO DE MÓDULO que TimerSetup() debería poder llamarse a través de ioctl().
Además, mi segunda pregunta: Me fue capaz de insmod mi módulo y también en mknod/dev/myTimer con el mayor número correcto. Pero cuando traté de abrirlo() para poder obtener el descriptor del archivo, siguió devolviendo -1, lo cual supongo que es incorrecto. Me aseguré de que los permisos estuvieran bien (de hecho, lo hice 777 solo para estar seguro) ... Todavía no funciona ... ¿Hay algo que me falta?
Aquí es el programa de usuario por si acaso:
#include <stdio.h>
int main(int argc, char* argv[])
{
int fd = open("/dev/mytimer", "r");
printf("fd: %d\n", fd);
return 0;
}
De hecho miré eso, pero no lo entendí ... Vi la función static long softdog_ioctl (archivo struct * file, unsigned int cmd, unsigned long arg) pero no entendí lo que hay en ella .. . ¿Es esa la única función ioctl? – hahuang65
Impresionante, parece que hiciste un buen trabajo explicando la interfaz en tu publicación :) Gracias. – hahuang65
Aunque esta respuesta ahora tiene más de 5 años, tenía una pregunta. Si otras implementaciones de 'ioctl' son desaprobadas, ¿cuál es la alternativa preferida? – sherrellbc