2017-05-27 1 views
0

juste faire mes premiers pas dans la création du pilote Linux. Vous avez ce travail a finalement:Pilote Linux -> insmod -> lsmod montrant le pilote, mais pas d'entrée dans/dev?

#include <linux/version.h> 
#include <linux/module.h> 
#include <linux/proc_fs.h> 
#include <linux/uaccess.h> 

#define DRIVER_AUTHOR "DirtyDiddy" 
#define DRIVER_DESC "Ein Treiber der zuordnet Hexzahl -> Monatsname" 

static unsigned int GM_major = 0; 
static unsigned int GM_minor = 0; 
static size_t count_w4proc = 0; 
static size_t count_r4proc = 0; 

MODULE_LICENSE("GPL"); 
MODULE_AUTHOR(DRIVER_AUTHOR); 
MODULE_DESCRIPTION(DRIVER_DESC); 

/*Listing 15*/ 
int GM_read_proc(char* page, char** start, off_t offset, int count, int* eof, void* data) 
{ 
    int len = 0, min; 
    len = snprintf(page, count,  "Major number = %d \n" 
        "Minor number = %d \n" 
        "geschrieben = %d \n" 
        "gelesen = %d \n", 
    GM_major, GM_minor, count_w4proc, count_r4proc); 
    *eof = 1; 
    min = (len > count ? count : len); 
    return min; 
} 

/*Listing 16*/ 
int GM_open(struct inode* inode, struct file* filp) 
{ 
    GM_minor = iminor(inode); 
    printk(KERN_INFO "GM_open: Minor number = %d\n", GM_minor); 
    return 0; 
} 

int GM_close(struct inode* inode, struct file* filp) 
{ 
    printk(KERN_INFO "GM_close\n"); 
    return 0; 
} 

/*Listing 17*/ 
ssize_t GM_read(struct file* filp, char*buf, size_t count, loff_t* t) 
{ 
    char kbuf[10]; 
    unsigned long not_copied; 
    kbuf[0] =0x00; 
    printk(KERN_INFO "gm_read: count = %d\n", count); 
    not_copied = copy_to_user(buf, kbuf, 10); 
    if(not_copied != 0) return (-EFAULT); 
    count_r4proc++; 
    return 10; 
} 

/*Listing 18*/ 
ssize_t GM_write(struct file* filp, char*buf, size_t count, loff_t* t) 
{ 
    printk(KERN_INFO "gm_write: count = %d\n", count); 
    count_r4proc++; 
    return count; 
} 

/*Listing 19*/ 
struct file_operations GM_fops = { 
.owner = THIS_MODULE, 
.read = GM_read, 
.write = GM_write, 
.open = GM_open, 
.release= GM_close 
}; 

/*Listing 20*/ 
int init_module(void) 
{ 
    int result; 
    printk(KERN_INFO "init_module_gm\n"); 

    result = register_chrdev(GM_major, "GetMonth", &GM_fops); 
    if(result < 0) 
    { 
     printk(KERN_INFO "GM_init_module: kein Zugriff auf Major number\n"); 
     return result; 
    } 
    printk(KERN_INFO "GM_init_module: register _chrdev ok\n"); 
    if(GM_major == 0) GM_major = result; 
    printk(KERN_INFO "GM_init_module: Major number = %d \n", GM_major); 

    create_proc_read_entry("GetMonth", 0, NULL, GM_read_proc, NULL); 
    return 0; 
} 

/*Listing 21*/ 
void cleanup_module(void) 
{ 
    printk(KERN_INFO "cleanup_module_gm : ungregister\n"); 
    unregister_chrdev(GM_major, "GetMonth"); 
    remove_proc_entry("GetMonth", NULL); 
    printk(KERN_INFO "GM_cleanup: Ende \n"); 
} 

test encore, si content/but est pas si important à ce jour, mais ... Après insmoding le GetMonth.ko, je pouvais le voir dans la lsmod-List. J'ai aussi vu le fonctionnement de kprinft et le document/proc.

Mais j'ai été horrifié de ne rien voir de mon pilote dans/dev?!

Comment cela peut-il être? Chaque pilote ne crée-t-il pas un fichier dans ce répertoire?

Répondre

0

Non pour vous d'avoir un pilote dans /dev répertoire vous devez utiliser la commande mknod. mknod /dev/<name> <char/block> <major-number> <minor-number>.

Donc ce pilote de périphérique créé maintenant recherchera le numéro majeur dans /proc/modules/ où l'entrée a été faite par la commande insmod.

Vous ne devez pas nécessairement créer des pilotes de périphérique dans /dev/ mais comme une convention, nous l'utilisons.

Edit:

Je l'aime penser de cette façon, lorsque vous chargez un module de noyau, il se trouve juste là, mais lorsque vous créez fichier spécial avec mknod c'est le fichier sur lequel vous évoluez et utilise le ce module chargé courir. Comment le fichier de périphérique sait-il quel module nous devrions utiliser? Il décide que sur le numéro majeur que vous lui fournissez.

+0

Allez, personne ne le fait pendant des années. Nous avons * udev * en charge. – 0andriy

+0

@ 0andriy désolé je suis un peu nouveau à la programmation du module du noyau aussi et mon instructeur nous a dit d'utiliser 'mknod' (udev peut sortir de la main il a dit) – user5954246

+0

Probablement, il est un gars oldschool, qui n'a pas (didn ' J'aime) * udev *. Il est difficile de trouver une distribution qui n'utilise pas une sorte de * udev * de nos jours. – 0andriy