#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") //注册设备号, 1:代表注册一个设备,名称叫test
if(result<0) //创建成功为0,失败一般为负值
{
printk("register_chrdev_region fail \n")
return result
}
return 0
}
static void hello_exit(void) //设备号也是资源,不用必须删除注销
{
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中I/O设备分为两类:字符设备和块设备。两种设备本身没有严格限制,但是,基于不同的功能进行了分类。(1)字符设备:提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节/字符来读写数据。举例来说,键盘、串口、调制解调器都是典型的字符设备。(2)块设备:应用程序可以随机访问设备数据,程序可自行确定读取数据的位置。硬盘、软盘、CD-ROM驱动器和闪存都是典型的块设备,应用程序可以寻址磁盘上的任何位置,并由此读取数据。此外,数据的读写只能以块(通常是512B)的倍数进行。与字符设备不同,块设备并不支持基于字符的寻址。总结一下,这两种类型的设备的根本区别在于它们是否可以被随机访问。字符设备只能顺序读取,块设备可以随机读取。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)