Donc j'essaye d'écrire un module noyau qui utilise le fichier linux/timer.h. Je l'ai eu à travailler à l'intérieur juste le module, et maintenant j'essaye de le faire fonctionner à partir d'un programme d'utilisateur.Comment utiliser ioctl() pour manipuler mon module noyau?
Voici mon module de noyau:
//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");
}
Plus précisément, je veux que mon programme utilisateur pour appeler la fonction TimerSetup(). Je sais que j'aurai besoin d'utiliser ioctl() mais je ne sais pas comment spécifier dans mon fichier MODULE que TimerSetup() devrait être appelé via ioctl().
Aussi, ma deuxième question: J'ai été capable d'insmod mon module et aussi mknod dans/dev/mytimer avec le nombre majeur correct. Mais quand j'ai essayé de l'ouvrir() pour que je puisse en extraire le descripteur de fichier, il revenait -1, ce que je suppose être faux. Je me suis assuré que les autorisations étaient correctes (en fait, je l'ai fait 777 juste pour être sûr) ... Ça ne marche toujours pas ... Y a-t-il quelque chose qui me manque?
Voici le programme utilisateur au cas où:
#include <stdio.h>
int main(int argc, char* argv[])
{
int fd = open("/dev/mytimer", "r");
printf("fd: %d\n", fd);
return 0;
}
J'ai effectivement regardé cela, mais je ne comprenais pas tout à fait ... J'ai vu la fonction statique long softdog_ioctl (fichier struct * fichier, cmd non signé int, argument long non signé) mais ne comprenait pas ce qu'il ya dedans .. Est-ce la seule fonction ioctl? – hahuang65
Génial, on dirait que vous avez fait un bon travail en expliquant l'interface dans votre message :) Merci. – hahuang65
Bien que cette réponse ait maintenant plus de 5 ans, j'avais une question. Si d'autres implémentations de 'ioctl' sont mal vues, quelle est l'alternative préférée? – sherrellbc