繁体   English   中英

Linux内核中的major()和minor()函数

[英]major() and minor() function in linux kernel

嗨,我正在运行vfs_statfd/dev/tty0的打开的文件描述符:

set_fs (KERNEL_DS);
if (vfs_fstat (fd, &stat))
{
    goto out3;
}

if (stat.mode & S_IFCHR)
    printk (KERN_INFO "opening %s (dev %d)\n", filename, stat.rdev);

它打印:

[ 8657.480625] opening /dev/tty0 (dev 4194304)

所以现在我需要检索设备的主设备号,但是在Linux内核中找不到major()minor()定义。

我找到了这个答案,但似乎并不正确:

#define major(dev) ((int)(((unsigned int) (dev) >> 8) & 0xff))
#define minor(dev) ((int)((dev) & 0xff))

因为如果执行printk (KERN_INFO "opening %s (dev %d)\\n", filename, major (stat.rdev)); 第二个字段始终为零。

那我应该怎么获得专业号码呢?

我发现linux / include / linux / kdev_t.h具有:

#define MINORBITS        20
#define MINORMASK        ((1U << MINORBITS) - 1)

#define MAJOR(dev)        ((unsigned int) ((dev) >> MINORBITS))
#define MINOR(dev)        ((unsigned int) ((dev) & MINORMASK))
#define MKDEV(ma,mi)      (((ma) << MINORBITS) | (mi))

这似乎比您显示的代码“更好”,因为它为主要数字分配了更多的位(20而不是8)。

在最新的glibc和内核上,您应该包括sys / sysmacros.h,而不仅仅是sys / types.h。 这是描述此决定的评论:

/* BSD defines `major', `minor', and `makedev' in this header.
   However, these symbols are likely to collide with user code, so we are
   going to stop defining them here in an upcoming release.  Code that needs
   these macros should include <sys/sysmacros.h> directly.  Code that does
   not need these macros should #undef them after including this header.  */
# define __SYSMACROS_DEPRECATED_INCLUSION
# include <sys/sysmacros.h>
# undef __SYSMACROS_DEPRECATED_INCLUSION

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM