【问题标题】:What's an easy way to use the MKDEV macro?使用 MKDEV 宏的简单方法是什么?
【发布时间】:2020-09-12 15:00:11
【问题描述】:

我有一个 char 设备的次要编号和主要编号,我想将它们变成 dev_t(用于保存设备编号),但我不想完成构建和编写一个模块,insmod 它进入内核等等。

MKDEV 宏有什么简单快速的使用方法?

#include <linux/kdev_t.h>
#include <linux/types.h>

dev_t device_num = MKDEV(int major, int minor);

使用标准的 C 程序显然是行不通的,因为它是内核代码/内核空间。

更新:编写用户空间程序确实有效,但我不能使用 dev_t 数据类型,可能是因为它只能由内核使用?

#include <linux/kdev_t.h> // MKDEV
#include <linux/types.h> // dev_t
#include <stdio.h> // I/O

int main(void)
{
    int device_id = MKDEV(10, 249);
    printf("%d\n", device_id); // 2809
    return 0;
}

【问题讨论】:

  • 实际上,即使编译为用户空间程序,您的代码也应该可以工作。
  • 嗯?我的意思是您在问题中发布的代码应该可以工作。两个标题linux/kdev_t.hlinux/types.h 都可用于用户空间程序。只需将 dev_t device_num = MKDEV(&lt;major&gt;, &lt;minor&gt;); 放在函数体中的某个位置即可。
  • @Tsyvarev 它仅在我没有声明具有dev_t 数据类型的变量时才有效,可能是因为它仅由内核使用? error: unknown type name dev_t
  • 是的,dev_t 仅适用于内核。但你可以使用任何整数类型。
  • @Tsyvarev 是的,我确实使用了integer。谢谢!如果您想发布答案,欢迎您(:

标签: c linux-kernel linux-device-driver


【解决方案1】:

提供MKDEV 宏的标头linux/kdev_t.h 也可供用户空间程序访问。

dev_t 类型的定义不可被用户空间程序访问(标题linux/types.h 对于内核和用户来说是不同),但对于MKDEV 的结果,您可以使用任何整数类型16 位或更多。

#include <linux/kdev_t.h>

<...>
int device_id = MKDEV(10, 249);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2010-11-17
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多