linux字符设备命令 linux 字符设备和块设备

如何在linux下用shell编程 , 判断一个文件是不是字符设备文件 , 如果是将其拷贝到/dev目录下#! /bin/bash#cp.sh#shell脚本的第一行是必须按照上面那种格式写,因为它表示的含义是#当前的shell脚本使用/bin/bash处理;第二行一般写脚本的文件名 。#1.echo 在屏幕上输出后面的字符串 , 和C的printf功能一样 。echo-e "please input filename /n"#2.判断是那个文件?可以使用read命令从键盘上获取文件名 。read FILENAME#3.如何判断是否是字符设备,3.1.这个就要使用到Test命令 。而Test命令都是系统内置的,我们记住了,#使用就可以了 。其中有[ -c FILENAME ]这个命令就是判断FILENAME是否是字符设备,如果是为真;如果不是为假;#3.2.这个程序中有如果...就....的问题,所以要用到if语句.但shell所用的if的语法和以前所学的C不#一样,但完成的功能一样 。if [ ... ]; thenfiif[ -c $FILENAME ]thencp $FILENAME /develseecho "It's not Charactor device file"fi#这个题目考察到了Shell的语法格式,以及read、if、test命令 。特别test命令可以测试文件状态 , 可以测#试数值大?。?也可以比较字符串 。所以我们以后if、while、for、until所用到条件都会使用到test命令
linux中什么是块设备和字符设备?块设备是I/O设备中的一类linux字符设备命令,是将信息存储在固定大小的块中,每个块都有自己的地址,还可以在设备的任意位置读取一定长度的数据 。数据块的大小通常在512字节到32768字节之间 。块设备的基本特征是每个块都能独立于其它块而读写 。
字符设备是在I/O传输过程中以字符为单位进行传输的设备 。在linux系统中,字符设备以特别文件方式在文件目录树中占据位置并拥有相应的结点 。结点中的文件类型指明该文件是字符设备文件 。可以使用与普通文件相同的文件操作命令对字符设备文件进行操作 。
扩展资料linux字符设备命令:
在大多数的linux操作系统中,块设备只支持以块为单位的访问方式,如磁盘等 。KYLIN支持以字符方式来访问块设备 , 即支持以字符为单位来读写磁盘等块设备 。所以在/dev目录中的块设备,如磁盘等,均以字符设备的外观出现 。
当一台字符型设备在硬件上与主机相连之后,必须为这台设备创建字符特别文件 。linux操作系统的mknod命令被用来建立设备特别文件 。
参考资料来源:
百度百科——块设备
百度百科——字符设备
linux字符设备驱动简述-1 Linux系统中linux字符设备命令,应用程序访问外设是通过文件linux字符设备命令的形式来进行的,Linux将所有的外设都看做文件,统一存放在/dev目录下 。
应用程序使用内核提供的标准系统调用来与内核中的驱动程序进行通讯,这些系统调用有linux字符设备命令:
open(), read(), write(), ioctl(), close() 等等 。
file_operations重要的成员
struct inode 结构代表一个实实在在文件,每个文件只对应一个inode;
struct file 结构代表一个打开的文件 , 同一个文件可以对应多个file结构;
structfile_operations结构代表底层操作硬件函数的集合
找到 first_drv的主设备号是249,如下图
进阶字符设备写法请看下一篇文章
linux中什么是块设备和字符设备| 字符设备
字符设备是能够像字节流一样被访问的设备,当对字符设备发出读写请求,相应的IO操作立即发生 。Linux系统中很多设备都是字符设备,如字符终端、串口、键盘、鼠标等 。在嵌入式Linux开发中,接触最多的就是字符设备以及驱动 。
| 块设备
块设备是Linux系统中进行TO操作时必须以块为单位进行访问的设备,块设备能够安装文件系统 。块设备驱动会利用一块系统内存作为缓冲区 , 因此对块设备发出读写访问 , 并不一定立即产生硬件I/O操作 。Linux系统中常见的块设备有如硬盘、软驱等等 。
| 网络设备
网络设备既可以是网卡这样的硬件设备 , 也可以是一个纯软件设备如回环设备 。网络设备由Linux的网络子系统驱动,负责数据包的发送和接收,而不是面向流设备,因此在Linux系统文件系统中网络设备没有节点 。对网络设备的访问是通过socket调用产生,而不是普通的文件操作如
open/closc和 read/write等 。
Linux 驱动-5 字符设备号w@w:~/linux_kernel/dev_t$cat hello.c
#include linux/init.h
#include linux/module.h
#include linux/kdev_t.h
#include linux/fs.h
static int major = 233;//主设备号
static int minor = 0;//次设备号
static dev_t devno;//定义设备号变量
static int hello_init(void)
{
int result;
printk("hello_init \n");
devno = MKDEV(major,minor);//创建主次设备号
result = register_chrdev_region(devno, 1, "test");//注册设备号linux字符设备命令, 1linux字符设备命令:代表注册一个设备linux字符设备命令,名称叫test
if(result0)//创建成功为0linux字符设备命令 , 失败一般为负值
{
printk("register_chrdev_region fail \n");
return result;
}
return 0;
}
static void hello_exit(void)//设备号也是资源linux字符设备命令,不用必须删除注销
{
printk("hello_exit \n");
unregister_chrdev_region(devno,1);
return;
}
module_init(hello_init);
module_exit(hello_exit);
//proc/devices
Makefile
w@w:~/linux_kernel/dev_t$ cat Makefile
ifneq ($(KERNELRELEASE),)
$(info "2nd")
obj-m:=hello.o
else
KDIR :=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
all:
$(info "1st")
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.symvers *.cmd*.mod.c *.order
endif
w@w:~/linux_kernel/dev_t$sudo make
"1st"
make -C /lib/modules/5.4.0-104-generic/build M=/home/w/linux_kernel/dev_t modules
make[1]: Entering directory '/usr/src/linux-headers-5.4.0-104-generic'
"2nd"
CC [M]/home/w/linux_kernel/dev_t/hello.o
"2nd"
Building modules, stage 2.
MODPOST 1 modules
WARNING: modpost: missing MODULE_LICENSE() in /home/w/linux_kernel/dev_t/hello.o
see include/linux/module.h for more information
CC [M]/home/w/linux_kernel/dev_t/hello.mod.o
LD [M]/home/w/linux_kernel/dev_t/hello.ko
嵌入式开发(七):linux字符型设备驱动初步姓名:王芷若学号:19020100180
学院:电子工程学院
【嵌牛导读】:本篇文章整理Linux知识点—Linux字符型设备驱动初步 。
【嵌牛鼻子】:Linux设备类型,结构体,驱动模块
【嵌牛提问】:Linux设备有什么类型?关键函数有哪些?
【嵌牛内容】–linux字符型设备驱动初步
一、Linux字符设备驱动初步
1、Linux设备类型
(1)字符设备:只能一个字节一个字节linux字符设备命令的读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后顺序进行 。字符设备是面向流的设备,常见的字符设备如鼠标、键盘、串口、控制台、LED等 。
(2)块设备:是指可以从设备的任意位置读取一定长度的数据设备 。块设备如硬盘、磁盘、U盘和SD卡等存储设备 。
(3)网络设备:网络设备比较特殊,不在是对文件进行操作,而是由专门的网络接口来实现 。应用程序不能直接访问网络设备驱动程序 。在/dev目录下也没有文件来表示网络设备 。
2、开发流程
在这里插入图片描述
3、关键函数讲解(以2.6以下版本内核为例)
(1)驱动模块注册register_chrdev()函数
原型:register_chrdev(unsigned int major, const char *name,const struct file_operations *fops)linux字符设备命令;
major:主设备号,该值为 0 时,自动运行分配 。而实际值不是 0 ;
name:设备名称;
fops:操作函数 , 实现驱动定义的open、read、write、close等内核函数与应用程序调用的open、read、write、close间的映射;
返回值:
major 值为 0 ,正常注册后 , 返回分配的主设备号 。如果分配失败,返回 EBUSY 的负值 ( -EBUSY )。major 值若大于 linux/major.h (2.4内核)中声明的最大值 (#define MAX_CHRDEV 255),则返回EINVAL 的负值 (-EINVAL)。指定 major 值后,若有注册的设备,返回 EBUSY 的负值 (-EBUSY) 。若正常注册,则返回 0 值
(2)驱动注销unregister_chrdev()函数
原型:
#include linux.fs.h
int unregister_chrdev (unsigned int major, const char *name)
变量:
major 主设备号
name 设备文件
【linux字符设备命令 linux 字符设备和块设备】 返回值:
major 值若大于 linux/major.h (2.4 内核)中声明的最大值 (#define MAX_CHRDEV 255),返回 EINVAL的负值 (-EINVAL) 。指定linux字符设备命令了 major的值后 , 若将要注销的 major 值并不是注册的设备驱动程序,返回 EINVAL的负值 ( -EINVAL ) 。正常注销则返回 0值 。
(3)File_operation结构体
file_operations结构是建立驱动程序和设备编号的连接,内部是一组函数指针,每个打开的文件,也就是file结构,和一组函数关联,这些操作主要用来实现系统调用的
struct file_operations {
struct module *owner;//拥有该结构的模块的指针,一般为THIS_MODULES
loff_t (*llseek) (struct file *, loff_t, int);//用来修改文件当前的读写位置
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);//从设备中同步读取数据
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);//向设备发送数据
ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);//初始化一个异步的读取操作
ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);//初始化一个异步的写入操作
int (*readdir) (struct file *, void *, filldir_t);//仅用于读取目录 , 对于设备文件,该字段为NULL
unsigned int (*poll) (struct file *, struct poll_table_struct *); //轮询函数,判断目前是否可以进行非阻塞的读写或写入
int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); //执行设备I/O控制命令
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); //不使用BLK文件系统,将使用此种函数指针代替ioctl
long (*compat_ioctl) (struct file *, unsigned int, unsigned long); //在64位系统上,32位的ioctl调用将使用此函数指针代替
int (*mmap) (struct file *, struct vm_area_struct *); //用于请求将设备内存映射到进程地址空间
int (*open) (struct inode *, struct file *); //打开
int (*flush) (struct file *, fl_owner_t id);
int (*release) (struct inode *, struct file *); //关闭
int (*fsync) (struct file *, struct dentry *, int datasync); //刷新待处理的数据
int (*aio_fsync) (struct kiocb *, int datasync); //异步刷新待处理的数据
int (*fasync) (int, struct file *, int); //通知设备FASYNC标志发生变化
int (*lock) (struct file *, int, struct file_lock *);
ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
int (*check_flags)(int);
int (*flock) (struct file *, int, struct file_lock *);
ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
int (*setlease)(struct file *, long, struct file_lock **);
};
linux字符设备命令的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux 字符设备和块设备、linux字符设备命令的信息别忘了在本站进行查找喔 。

    推荐阅读