J'essaie de construire un module de noyau simple. Voici le contenu des fichiers impliqués dans ce module :
module.c :
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/device.h>
#include <linux/kernel.h>
#include "header.h"
static int device_open(struct inode *inode, struct file *file)
{
printk("\n Open \n");
return 0;
}
static int device_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long args)
{
switch(cmd)
{
case IOCTL_CMD:
printk(KERN_ALERT "\n %s \n", (char *)args);
break;
}
return 0;
}
static int device_release(struct inode *inode, struct file *file)
{
printk("\n Release \n");
return 0;
}
static struct class *my_class;
static struct file_operations fops={
.open = device_open,
.release = device_release,
.compat_ioctl = device_ioctl
};
static int hello_init(void)
{
major_no = register_chrdev(0, DEVICE_NAME, &fops);
printk("\n Major_no : %d", major_no);
my_class = class_create(THIS_MODULE, DEVICE_NAME);
device_create(my_class, NULL, MKDEV(major_no,0), NULL, DEVICE_NAME);
printk("\n Device Initialized in kernel ....!!!");
return 0;
}
static void hello_exit(void)
{
printk("\n Device is Released or closed \n");
device_destroy(my_class,MKDEV(major_no,0));
class_unregister(my_class);
class_destroy(my_class);
unregister_chrdev(major_no, DEVICE_NAME);
printk("\n===============================================================\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
appln.c
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include "header.h"
int main()
{
int fd;
char * msg = "yahoooo";
fd = open(DEVICE_PATH, O_RDWR);
ioctl(fd, IOCTL_CMD, msg);
printf("ioctl executed\n");
close(fd);
return 0;
}
header.h :
#include <linux/ioctl.h>
#include <linux/kdev_t.h> /* for MKDEV */
#define DEVICE_NAME "my_dev"
#define DEVICE_PATH "/dev/my_dev"
#define WRITE 0
static int major_no;
#define MAGIC_NO '4'
/*
* Set the message of the device driver
*/
#define IOCTL_CMD _IOR(MAGIC_NO, 0, char *)
Mon module se charge parfaitement (je peux voir le mesg dans la fonction hello_init()). Mais quand j'exécute le programme appln.c, même quand il fait l'appel ioctl(), je ne vois aucun résultat. Quelqu'un peut-il me dire pourquoi le module ignore mon appel ioctl ?
Merci,