当前位置:首页 » 操作系统 » linux字符设备

linux字符设备

发布时间: 2022-12-17 21:28:05

1. linux 设备的含义

inux 中的设备有2种类型:字符设备(无缓冲且只能顺序存取)、块设备(有缓冲且可以随机存取)。这些设备中,有些设备是对实际存在的物理硬件的抽象,而有些设备则是内核自身提供的功能(不依赖于特定的物理硬件,又称为"虚拟设备")。每个设备在 /dev 目录下都有一个对应的文件(节点)。
常见设备及相应/dev/下的文件名:

/dev/usb/hiddev0 | /dev/usb/hiddev1 --- USB 字符设备(鼠标/键盘/游戏杆/手写版等人操作计算机的设备)
/dev/uba | /dev/ubb --- USB 块设备(U盘之类)
/dev/sda | /dev/sdb --- 第n个 SCSI 磁盘(整个磁盘)
/dev/hda | /dev/hdb --- 第n个 IDE 磁盘(整个磁盘)
/dev/sdc1 | /dev/sdc2 --- 第3个 SCSI 磁盘的第n个 分区 Linux/i386来说,分区1-4是主分区,5-15是逻辑分区。
/dev/scd0 | /dev/scd1 --- 第n个 SCSI CD-ROM
/dev/tty0 | /dev/tty1 --- 当前虚拟控制台、第n个虚拟控制台 TTY(终端)设备

Linux系统Mount点:mount的时候,mount的目标文件夹/media/cdrom要手动创建

mount /dev/cdrom /media/cdrom

2. 在linux系统下,设备分那几种

跟WINDOWS一样吧。硬盘,光盘,软盘,可移动磁盘,鼠标,打印机,网卡,磁盘。。。
常见硬件设备在linux中的代号:
IDE硬盘 /dev/hd[a-d]
SCSI硬盘 /dev/sd[a-d]
光驱 /dev/cdrom
软驱 /dev/fd[0-1]
打印机 /dev/lp[0-1]
鼠标 /dev/mouse
磁盘 /dev/ht0(IDE) /dev/st0 (SCSI)
网卡 /dev/ethn (n由0开始)

3. Linux┊字符设备和块设备的区别

字符设备和块设备的区别在于前者只能被顺序读写,后者可以随机访问。大多数设备为字符设备,以字节为单位,实现file_operations结构体。而如磁盘为块设备,以块为单位接受输入和返回输出。实现block_device_operations结构体.

4. linux用mknod怎么创建设备怎么用

首先要明白什么是设备文件,简单的我们说,操作系统与外部设备(入磁盘驱动器,打印机,modern,终端 等等)都是通过设备文件来进行通信的,在Unix/Linux系统与外部设备通讯之前,这个设备必须首先要有一个设备文件,设备文件均放在/dev目录下。

一般情况下在安装系统的时候系统自动创建了很多已检测到的设备的设备文件,但有时候我们也需要自己手动创建,命令行生成设备文件的方式有 insf,mksf,mknod等等

根据mknod命令的使用参数来看【mknod Name { b | c } Major Minor 】,使用mknod之前,至少要明白以下几点:

  1. 设备文件类型:分为块设备和字符设备。ls -l /dev 结果显示第一个字段有b*** 和 c****,这里即标识了块设备和字符设备。

  2. 字符设备文件----字符设备文件传送数据给设备的时候,一次传送一个字符,终端,打印机,绘图仪,modern等设备都经过字符设备文件传送数据

  3. 块设备---系统通过块设备文件存取一个设备的时候,先从内存中的buffer中读或写数据,而不是直接传送数据到物理磁盘,这种方式能有效的提高磁盘和CD-ROMS的I/O性能。磁盘和CD-ROMS即可以使用字符设备文件也可使用块设备文件。

  4. 主号和次号

    主号:当在任意目录使用ls -l 时,结果的第5个字段就是主号,设备主号代表了这个设备使用的是哪个设备驱动程序

    次号:次号是一个24位的十六进制数字,定义了设个设备在系统中的物理的位置

就拿我们常用的创建卷组来看:

先来看看mknod 命令,如果该设备文件你想放在一个特定的文件夹下当然就先创建文件夹

mknod 设备文件名[/dev/xyz] b/c 主号 次号

{ mkdir /dev/vg01

mknod /dev/vg01/group c 64 0X010000}

创建之后,就可以使用你想要创建的设备对于德创建命令了,如我现在的卷组的创建命令:

vgcreate /dev/vg01 /dev/dsk/c*t*d*

一直进行下去,之后的步骤根据不同的设备而不尽相同。

5. linux中什么是块设备和字符设备

块设备是I/O设备中的一类,是将信息存储在固定大小的块中,每个块都有自己的地址,还可以在设备的任意位置读取一定长度的数据。数据块的大小通常在512字节到32768字节之间。块设备的基本特征是每个块都能独立于其它块而读写。

字符设备是在I/O传输过程中以字符为单位进行传输的设备。在linux系统中,字符设备以特别文件方式在文件目录树中占据位置并拥有相应的结点。结点中的文件类型指明该文件是字符设备文件。可以使用与普通文件相同的文件操作命令对字符设备文件进行操作。

(5)linux字符设备扩展阅读:

在大多数的linux操作系统中,块设备只支持以块为单位的访问方式,如磁盘等。KYLIN支持以字符方式来访问块设备,即支持以字符为单位来读写磁盘等块设备。所以在/dev目录中的块设备,如磁盘等,均以字符设备的外观出现。

当一台字符型设备在硬件上与主机相连之后,必须为这台设备创建字符特别文件。linux操作系统的mknod命令被用来建立设备特别文件。

参考资料来源:

网络——块设备

网络——字符设备

6. 在Linux内核中,注册字符设备驱动程序的函数是

字符设备驱动程序框架 1、写出open、write函数 2、告诉内核 1)、定义一个struct file_operations结构并填充好 static struct file_operations first_drv_fops = { .owner = THIS_MODULE, /* 这是一个宏,推向编译模块时自动创建的__this_mole变量 */ .open = first_drv_open, .write = first_drv_write, }; 2)、把struct file_operations结构体告诉内核 major = register_chrdev(0, "first_drv", &first_drv_fops); // 注册, 告诉内核相关参数:第一个,设备号,0自动分配主设备号,否则为主设备号0-255 第二个:设备名第二个:struct file_operations结构体 4)、register_chrdev由谁调用(入口函数调用) static int first_drv_init(void) 5)、入口函数须使用内核宏来修饰 mole_init(first_drv_init); mole_init会定义一个结构体,这个结构体里面有一个函数指针指向first_drv_init这个函数,当我们加载或安装一个驱动时,内核会自动找到这个结构体,然后调用里面的函数指针,这个函数指针指向first_drv_init这个函数,first_drv_init这个函数就是把struct file_operations结构体告诉内核 6)、有入口函数就有出口函数 mole_exit(first_drv_exit); 最后加上协议 MODULE_LICENSE("GPL"); 3、mdev根据系统信息自动创建设备节点: 每次写驱动都要手动创建设备文件过于麻烦,使用设备管理文件系统则方便很多。在2.6的内核以前一直使用的是devfs,但是它存在许多缺陷。它创建了大量的设备文件,其实这些设备更本不存在。而且设备与设备文件的映射具有不确定性,比如U盘即可能对应sda,又可能对应sdb。没有足够的主/辅设备号。2.6之后的内核引入了sysfs文件系统,它挂载在/sys上,配合udev使用,可以很好的完成devfs的功能,并弥补了那些缺点。(这里说一下,当今内核已经使用netlink了)。 udev是用户空间的一个应用程序,在嵌入式中用的是mdev,mdev在busybox中。mdev是udev的精简版。首先在busybox中添加支持mdev的选项: Linux System Utilities ---> [*] mdev [*] Support /etc/mdev.conf [*] Support subdirs/symlinks [*] Support regular expressions substitutions when renaming device [*] Support command execution at device addition/removal 然后修改/etc/init.d/rcS: echo /sbin/mdev > /proc/sys/kernel/hotplug /sbin/mdev -s 执行mdev -s :以‘-s’为参数调用位于 /sbin目录写的mdev(其实是个链接,作用是传递参数给/bin目录下的busybox程序并调用它),mdev扫描 /sys/class 和 /sys/block 中所有的类设备目录,如果在目录中含有名为“dev”的文件,且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev 下创建设备节点文件。一般只在启动时才执行一次 “mdev -s”。热插拔事件:由于启动时运行了命 令:echo /sbin/mdev > /proc/sys/kernel/hotplug ,那么当有热插拔事件产生时,内核就会调用位于 /sbin目录的mdev。这时mdev通过环境变量中的 ACTION 和 DEVPATH,来确定此次热插拔事件的动作以及影响了/sys中的那个目录。接着会看看这个目录中是否“dev”的属性文件,如果有就利用这些信息为 这个设备在/dev 下创建设备节点文件重新打包文件系统,这样/sys目录,/dev目录就有东西了下面是create_class的原型: #define class_create(owner, name) / ({ / static struct lock_class_key __key; / __class_create(owner, name, &__key); / }) extern struct class * __must_check __class_create(struct mole *owner, const char *name, struct lock_class_key *key); class_destroy的原型如下: extern void class_destroy(struct class *cls); device_create的原型如下: extern struct device *device_create(struct class *cls, struct device *parent, dev_t devt, void *drvdata, const char *fmt, ...) __attribute__((format(printf, 5, 6))); device_destroy的原型如下: extern void device_destroy(struct class *cls, dev_t devt); 具体使用如下,可参考后面的实例: static struct class *firstdrv_class; static struct class_device *firstdrv_class_dev; firstdrv_class = class_create(THIS_MODULE, "firstdrv"); firstdrv_class_dev = class_device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xyz"); /* /dev/xyz */ class_device_unregister(firstdrv_class_dev); class_destroy(firstdrv_class); 下面再来看一下应用程序如何找到这个结构体的在应用程序中我们使用open打开一个设备:如:open(/dev/xxx, O_RDWR); xxx有一个属性,如字符设备为c,后面为读写权限,还有主设备名、次设备名,我们注册时 通过register_chrdev(0, "first_drv", &first_drv_fops)(有主设备号,设备名,struct file_operations结构体)将first_drv_fops结构体注册到内核数组chrdev中去的,结构体中有open,write函数,那么应用程序如何找到它的,事实上是根据打开的这个文件的属性中的设备类型及主设备号在内核数组chrdev里面找到我们注册的first_drv_fops,实例代码: #include #include #include #include #include #include #include #include #include #include static struct class *firstdrv_class; static struct class_device *firstdrv_class_dev; volatile unsigned long *gpfcon = NULL; volatile unsigned long *gpfdat = NULL; static int first_drv_open(struct inode *inode, struct file *file) { //printk("first_drv_open\n"); /* 配置GPF4,5,6为输出 */ *gpfcon &= ~((0x3<<(4*2)) | (0x3<<(5*2)) | (0x3<<(6*2))); *gpfcon |= ((0x1<<(4*2)) | (0x1<<(5*2)) | (0x1<<(6*2))); return 0; } static ssize_t first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos) { int val; //printk("first_drv_write\n"); _from_user(&val, buf, count); // _to_user(); if (val == 1) { // 点灯 *gpfdat &= ~((1<<4) | (1<<5) | (1<<6)); } else { // 灭灯 *gpfdat |= (1<<4) | (1<<5) | (1<<6); } return 0; } static struct file_operations first_drv_fops = { .owner = THIS_MODULE, /* 这是一个宏,推向编译模块时自动创建的__this_mole变量 */ .open = first_drv_open, .write = first_drv_write, }; int major; static int first_drv_init(void) { major = register_chrdev(0, "first_drv", &first_drv_fops); // 注册, 告诉内核 firstdrv_class = class_create(THIS_MODULE, "firstdrv"); firstdrv_class_dev = class_device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xyz"); /* /dev/xyz */ gpfcon = (volatile unsigned long *)ioremap(0x56000050, 16); gpfdat = gpfcon + 1; return 0; } static void first_drv_exit(void) { unregister_chrdev(major, "first_drv"); // 卸载 class_device_unregister(firstdrv_class_dev); class_destroy(firstdrv_class); iounmap(gpfcon); } mole_init(first_drv_init); mole_exit(first_drv_exit); MODULE_LICENSE("GPL"); 编译用Makefile文件 KERN_DIR = /work/system/linux-2.6.22.6 all: make -C $(KERN_DIR) M=`pwd` moles clean: make -C $(KERN_DIR) M=`pwd` moles clean rm -rf moles.order obj-m += first_drv.o 测试程序: #include #include #include #include /* firstdrvtest on * firstdrvtest off */ int main(int argc, char **argv) { int fd; int val = 1; fd = open("/dev/xyz", O_RDWR); if (fd < 0) { printf("can't open!\n"); } if (argc != 2) { printf("Usage :\n"); printf("%s \n", argv[0]); return 0; } if (strcmp(argv[1], "on") == 0) { val = 1; } else { val = 0; } write(fd, &val, 4); return 0; }

7. LINUX,下面设备文件中那些是字符设备文件

/dev/audio是字符设备文件,其他的是块设备文件
补充:对audio的存取是以
字节流
方式来进行的。其它的设备/dev/cdrom,
/dev/fd0,
/dev/had都是磁盘(光驱,软驱,主硬盘),它们的存取是通过
数据块
来进行的

8. linux命令怎么打开字符设备文件

在Linux中使用ls-l命令来列出文件时,b、c字母开头的文件,分别表示区块(block)设备和字符(character)设备,是特殊类型的文件。也就是说Linux字符设备文件以c字母做为开始标志 。

可以执行如下命令,查看到大量字符设备的文件:

ls-l/dev | more

执行结果如下图所示:

9. 字符设备和块设备

提供连续的数据流,是一个线性设备,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节/字符来读写数据。举例来说,调制解调器是典型的字符设备。
如:键盘、鼠标、显示屏

应用程序可以随机访问设备数据,程序可自行确定读取数据的位置。硬盘是典型的块设备,应用程序可以寻址磁盘上的任何位置,并由此读取数据。此外,数据的读写只能以块(通常是512B)的倍数进行。与字符设备不同,块设备并不支持基于字符的寻址。
如:硬盘、U盘
两种设备本身并没用严格的区分,主要是字符设备和块设备驱动程序提供的访问接口(file I/O API)是不一样的

Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件,完成对设备的操作,就像操作普通的数据文件一样。为了管理这些设备,系统为设备编了号,每个设备号又分为主设备号和次设备号。 主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备。 对于常用设备,Linux有约定俗成的编号,如硬盘的主设备号是3。
一个字符设备或者块设备都有一个主设备号和次设备号。主设备号和次设备号统称为设备号。主设备号用来表示一个特定的驱动程序。次设备号用来表示使用该驱动程序的各设备。 例如一个嵌入式系统,有两个LED指示灯,LED灯需要独立的打开或者关闭。那么,可以写一个LED灯的字符设备驱动程序,可以将其主设备号注册成5号设备,次设备号分别为1和2。这里,次设备号就分别表示两个LED灯。

一般的, 主设备号标识出与设备关联的设备驱动 。如 /dev/null 和 /dev/port 由 1 号驱动来管理。

现在的 Linux 内核允许多个驱动共享一个主设备号,但更多的设备都遵循一个驱动对一个主设备号的原则。

内核由 次设备号确定当前所指向的是哪个设备。 根据所编写的驱动程序,可以从内核那里得到一个直接指向设备的指针,或者使用次设备号作为一个设备本地数组的索引。但不论如何,内核自身几乎不知道次设备号的什么事情。

当静态分配设备号时,需要查看系统中已经存在的设备号,从而决定使用哪个新设备号。可以读取/proc/devices文件获得设备的设备号。/proc/devices文件包含字符设备和块设备的设备号,如下所示:

用于创建Linux中的字符设备文件和块设备文件。

热点内容
汽修汽配源码 发布:2025-05-14 20:08:53 浏览:742
蜜蜂编程官网 发布:2025-05-14 19:59:28 浏览:57
优酷怎么给视频加密 发布:2025-05-14 19:31:34 浏览:635
梦三国2副本脚本 发布:2025-05-14 19:29:58 浏览:860
phpxmlhttp 发布:2025-05-14 19:29:58 浏览:434
Pua脚本 发布:2025-05-14 19:24:56 浏览:449
苹果像素低为什么比安卓好 发布:2025-05-14 19:13:23 浏览:461
安卓机微信怎么设置红包提醒 发布:2025-05-14 19:00:15 浏览:272
androidsystem权限设置 发布:2025-05-14 18:56:02 浏览:971
mq脚本 发布:2025-05-14 18:45:37 浏览:25