Linux 驱动-5 字符设备号

Linux 驱动-5 字符设备号,第1张

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")    //注册设备号, 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)的倍数进行。与字符设备不同,块设备并不支持基于字符的寻址。总结一下,这两种类型的设备的根本区别在于它们是否可以被随机访问。字符设备只能顺序读取,块设备可以随机读取。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7469114.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-06
下一篇 2023-04-06

发表评论

登录后才能评论

评论列表(0条)

保存