今天写了一个linux的驱动,编译成功,用NFS在目录板上运行,insmod后,在/proc/devices里面能看到,用lsmod也能看到那个设备,但在/dev里找不到设备文件。应用测试程序open也出错了。后来在网上查了一些资料,说是需要先mknod才行,于是:mknod /dev/testdrv c 195 0 ,后再insmod,然后运行测试应用程序,OK! 下面是一些mknod的资料
mknod是创建设备文件,但在创建设备文件之前,一定要先写驱动程序。
1.在驱动程序中是要注册你自己的设备的,通过register将主次设备号注册进一个结构体中。
2.通过mknod命令创建的设备节点:是在/dev目录下创建相应的设备只是为了应用程序去使用它提供了途径,它们之间是通过设备号联系在一起的,应用程序触发中断后系统会去第一步中的那个结构体中寻找对应的设备进行操作。或者通过在第一步中使用一个classdev结构体【字符设备中】创建一个类,让系统自动为你创建设备节点。
Linux中设备文件有两种管理方式,一种是mknod这种,插入驱动模块之后还必须在/dev目录下有对应的文件,这就要用mknod来创建;另一种是devfs,设备文件系统,这种管理形式,在驱动程序注册的时候使用devfs_mk_dir建立一个文件,不过不需要一定在/dev目录下。
mknod
用途 :创建特殊文件。
语法 :只能由 root 用户或系统组成员运行
mknod Name { b | c } Major Minor
创建 FIFO(已命名的管道)
mknod Name { p }
描述 :mknod 命令建立一个目录项和一个特殊文件的对应索引节点。第一个参数是 Name 项设备的名称。选择一个描述性的设备名称。mknod 命令有两种形式,它们有不同的标志。
mknod 命令的第一种形式只能由 root 用户或系统组成员执行。在第一种形式中,使用了b 或 c 标志。b 标志表示这个特殊文件是面向块的设备(磁盘、软盘或磁带)。c 标志表示这个特殊文件是面向字符的设备(其他设备)。
第一种形式的最后两个参数是指定主设备的数目,它帮助操作系统查找设备驱动程序代码,和指定次设备的数目,也就是单元驱动器或行号,它们是十进制或八进制的。一个设备的主要和次要编号由该设备的配置方法分配,它们保存在 ODM 中的 CuDvDr 类里。在这个对象类中定义了主要和次要编号以确保整个系统设备定义的一致性,这是很重要的。
在 mknod 命令的第二种形式中,使用了 p 标志来创建 FIFO(已命名的管道)。