【问题标题】:Linux Driver -> insmod -> lsmod showing the driver, but no entry in /dev?Linux Driver -> insmod -> lsmod 显示驱动程序,但 /dev 中没有条目?
【发布时间】:2017-05-27 22:06:23
【问题描述】:

刚刚迈出了创建 Linux 驱动程序的第一步。终于搞定了:

#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");
}

仍在测试中,所以内容/目的目前还不是很重要,但是... 安装 GetMonth.ko 后,我可以在 lsmod-List 中看到它。我还看到了 kprintft 和 /proc 文档。

但我很害怕在 /dev 中没有看到我的驱动程序的任何内容?!

怎么可能?不是每个驱动都在这个目录下创建文件吗?

【问题讨论】:

    标签: linux driver insmod


    【解决方案1】:

    不让您在/dev 目录中有驱动程序,您必须使用mknod 命令。 mknod /dev/&lt;name&gt; &lt;char/block&gt; &lt;major-number&gt; &lt;minor-number&gt;.

    因此,现在创建的此设备驱动程序将在 /proc/modules/ 中查找主要编号,该条目由 insmod 命令创建。

    您不一定非要在 /dev/ 中创建设备驱动程序,但作为惯例,我们使用它。

    编辑:

    我喜欢这样想,当你加载一个内核模块时,它只是坐在那里,但是当你用mknod创建特殊文件时,这是你操作的文件,它使用加载的模块来运行。设备文件如何知道我们应该使用哪个模块?它决定了您提供给它的主要号码。

    【讨论】:

    • 来吧,多年来没有人这样做。我们有 udev 负责。
    • @0andriy 抱歉,我对内核模块编程也有点陌生,我的导师告诉我们使用 mknod(他告诉 udev 可能会失控)
    • 可能他是个老派,没有得到(不喜欢)udev。现在很难找到不使用某种 udev 的发行版。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2016-04-17
    相关资源
    最近更新 更多