1.字符设备

字符设备、字符设备驱动与用户空间访问该设备的程序三者之间的关系

Linux内核中:

a -- 使用cdev结构体来描述字符设备;

b -- 通过其成员dev_t来定义设备号(分为主、次设备号)以确定字符设备的唯一性;

c -- 通过其成员file_operations来定义字符设备驱动提供给VFS的接口函数,如常见的open()、read()、write()等;

在Linux字符设备驱动中:

a -- 模块加载函数通过 register_chrdev_region( ) 或 alloc_chrdev_region( )来静态或者动态获取设备号;

b -- 通过 cdev_init( ) 建立cdev与 file_operations之间的连接,通过 cdev_add( ) 向系统添加一个cdev以完成注册;

c -- 模块卸载函数通过cdev_del( )来注销cdev,通过 unregister_chrdev_region( )来释放设备号;

用户空间访问该设备的程序:

a -- 通过Linux系统调用,如open( )、read( )、write( ),来“调用”file_operations来定义字符设备驱动提供给VFS的接口函数;

2.例子

hello.c

#include #include#include#include

static int major = 99; //主设备号(用于区分设备类)

static int minor = 0; //次设备号(用于区分哪个设备)

staticdev_t devno;static structcdev cdev1;struct class *hello_class;static int hello_open(struct inode *inodep, struct file *filep)

{

printk(KERN_ALERT"hello are opened \r\n");return 0;

}static struct file_operations hello_ops ={

.open=hello_open,

};static int hello_init(void)

{intret;

printk(KERN_ALERT"hello_init\r\n");//第一步:将主设备号、次设备号转化成dev_t类型

devno =MKDEV(major, minor);

ret= register_chrdev_region(devno, 1, "hello");if (ret < 0)

{

printk(KERN_ERR"my register_chrdev_region fail \r\n");returnret;

}

printk(KERN_INFO"register_chrdev_region success\n");//第二步:注册字符设备驱动

cdev_init(&cdev1, &hello_ops);

ret= cdev_add(&cdev1, devno, 1);if (ret < 0)

{

printk(KERN_ERR"Uable to add dev\n");returnret;

}

printk(KERN_INFO"cdev_add success\n");//第三步:2.6内核之后要向sys文件系统中添加设备

hello_class = class_create(THIS_MODULE, "hello");

device_create(hello_class, NULL, devno, NULL,"hello");

printk(KERN_INFO"device created success\n");return 0;

}static void hello_exit(void)

{

cdev_del(&cdev1);

unregister_chrdev_region(devno,1);

printk(KERN_ALERT"hell_exit\r\n");

}

MODULE_LICENSE("GPL");

module_init(hello_init);

module_exit(hello_exit);

test.c

#include #include#include#includemain()

{intfd;

fd= open("/dev/hello",O_RDWR);if(fd<0)

{

perror("open fail \n");return;

}else{

printf("open /dev/hello success! \n");

}

close(fd);

}

makefile

#General Purpose Makefile forcross compile Linux Kernel module

ifneq ($(KERNELRELEASE),)

obj-m := hello.o #+=是连接字符串elseARCH :=arm

CROSS_COMPILE := arm-linux-gnueabihf-KERN_DIR := /home/zqh/lichee/linux-zero-4.14.y #选择内核路径

PWD :=$(shell pwd) #当前路径

all:

$(info "1st")make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERN_DIR) M=$(PWD) modules

clean:rm -f *.ko *.o *.symvers *.mod.c *.mod.o *.order .*.o.ko.cmd .*.ko.cmd .*.mod.o.cmd .*.o.cmd

endif

linux内核定义注册设备,linux字符型设备驱动 一.注册设备并创建设备文件相关推荐

  1. Linux内核网络数据发送(六)——网络设备驱动

    Linux内核网络数据发送(六)--网络设备驱动 1. 前言 2. 驱动回调函数注册 3. `ndo_start_xmit` 发送数据 4. `igb_tx_map` 1. 前言 本文主要介绍设备通过 ...

  2. 一文了解linux内核,一文了解Linux的系统结构

    什么是 Linux ? 如果你以前从未接触过Linux,可能就不清楚为什么会有这么多不同的Linux发行版.在查看Linux软件包时,你肯定被发行版.LiveCD和GNU之类的术语搞晕过.初次进入Li ...

  3. Linux内核入门-如何获取Linux内核源代码、生成配置内核

    如何获取Linux内核源代码 如何获取Linux内核源代码 下载Linux内核当然要去官方网站了,网站提供了两种文件下载,一种是完整的Linux内核,另一种是内核增量补丁,它们都是tar归档压缩包.除 ...

  4. 查看linux内核的编译时间,linux内核编译步骤

    linux内核编译步骤 对于linux新手来说,编译内核相对有一些难度,甚至不知道如何入手,我通过在网上收集这方面的资料,最终编译成功.现在我归纳了一下,写出这一篇还算比较详细的步骤,希望能对各位新手 ...

  5. linux内核培训广州,嵌入式Linux驱动开发高级培训班-华清远见嵌入式培训中心

    课程目标 本课程以案例教学为主,系统地介绍Linux下有关FrameBuffer.MMC卡.USB设备的驱动程序开发.参加本课程学习的学员,因为具备了Linux设备驱动开发基础,所以本课程针对性较强, ...

  6. linux内核启动分析 三,Linux内核分析 实验三:跟踪分析Linux内核的启动过程

    贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 ...

  7. linux内核 lts长期演进,Linux Kernel 4.19 将成为下一个LTS(长期支持)系列

    最近Linux内核开发人员和维护人员Greg Kroah-Hartman透露,Linux Kernel 4.19将下一个长期支持的Linux内核系列. 现在Linux Kernel 4.17已经达到使 ...

  8. Linux内核开发_1_编译LInux内核

    目录 1. 准备工作 1.1 学习环境 1.2 下载Linux内核源码 1.3 解压Linux内核 1.4 目录结构介绍 2. Linux内核配置 2.1 配置选项 1. make config 2. ...

  9. 【Linux 内核 内存管理】Linux 内核堆内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构体 | mm_struct 结构体中的 start_brk、brk 成员 )

    文章目录 一.堆内存管理 二.内存描述符 mm_struct 结构体 三.mm_struct 结构体中的 start_brk.brk 成员 一.堆内存管理 Linux 操作系统中的 " 堆内 ...

  10. 【Linux 内核】进程管理 ( Linux 内核中的进程状态 | TASK_RUNNING | TASK_INTERRUPTIBLE | __TASK_STOPPED | EXIT_ZOMBIE )

    文章目录 一.Linux 内核中的进程状态 二.TASK_RUNNING 状态 三.TASK_RUNNING 状态 四.TASK_UNINTERRUPTIBLE 状态 五.__TASK_STOPPED ...

最新文章

  1. 清华大学计算机网络研究中心,清华大学信息网络工程研究中心简介
  2. 使用Hibernate操作数据库
  3. python random.seed()函数 (生成固定随机数)random.seed(None)(取消固定随机数种子)
  4. ORA-07445 [kxsxsi()+450] [SIGSEGV]
  5. 多点测试:while的写法
  6. 《Spring技术内幕》——2.3节IoC容器的初始化过程
  7. FLASH、SDRAM
  8. BOSON cisco设备模拟器6.0+注册机
  9. 在ubuntu中安装DroidCam
  10. android手机连不上wifi,手机连不上wifi怎么办
  11. linux 删除中文文件夹,解析Linux文件夹文件创建、删除
  12. 抢答器c语言程序设计,基于单片机的智能抢答器设计与实现
  13. 这样可以几分钟快速对接支付宝APP支付和手机网站支付
  14. 自制一个简单的音乐播放器
  15. C#怎样解析.CSV文件同时把类转换成JSON
  16. Shamir 门限方案|秘密共享|拉格朗日插值|密码学
  17. CAS原理——乐观锁机制
  18. 算法系列—低位优先的字符串排序(基于键索引计数法)
  19. 复试线388分!中科大软院公布考研分数线!
  20. 千万别在有WiFi的房间里摆这种姿势,只因…

热门文章

  1. 牛顿法求根号数(Python)
  2. 创业者具备的五大技能_一个优秀创业者必备的基本素质和技能
  3. python3 下的文件输入输出特性以及如何覆盖文件内容和接下去输入
  4. TFS2012 服务器安装
  5. HTML5 随机弹跳的小球
  6. CodeSmith输错license后的解决办法
  7. STL_Hash_map
  8. 初步了解Linux内核中断初始化
  9. C# mschart 控件的基本使用和图表控件Series的概念
  10. 图解Win7下安装Oracle 12c