博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux字符设备驱动编写流程
阅读量:7013 次
发布时间:2019-06-28

本文共 1527 字,大约阅读时间需要 5 分钟。

    驱动程序编写基本流程:

  1.首先是一些版本信息,没什么用,但是不能少
  #define __NO_VERSION__
  #include <linux/modules.h>
  #include <linux/version.h>
  char kernel_version[] = UTS_RELEASE;
  2.为了把系统调用和驱动程序关联起来,需要一个非常关键的数据结构:struct file_operations。file_operations结构的每一个成员的名字都对应着一个系统调用。用户进程利用系统调用在对设备文件进行诸如read/write操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。这是linux的设备驱动程序工作的基本原理。编写设备驱动程序的主要工作就是编写子函数,并填充file_operations的各个域
  3.简单驱动程序的编写(test.c):
  a.包含一些基本的头文件。
  b.编写一些功能函数,比如read(),write()等。这些函数被调用时系统进入核心态。
  c.定义struct file_operations结构的对象,填充结构体。结构体中功能的顺序不能改变,若一些功能没有实现就用NULL填充,已经实现的功能如read()、write()分别添加到对应的位置。这步实现的是函数的注册。到这里驱动程序的主体可以说是写好了。现在需要把驱动程序嵌入内核。
  d.注册设备驱动程序,使用register_chrdev注册字符型设备。函数原型为:
  int register_chrdev(0, "test_name", &test_file_operations)
  函数返回主设备号,若注册成功返回值大于0。
  第一个参数:主设备号。第二个参数:注册的设备名。第三个参数:结构体名(设备相关操作方式,驱动程序实际执行操作的函数的指针)。
  这个函数由int init_module(void)函数调用,这个函数在系统启动时注册到内核时调用。
  e.在用rmmod卸载模块时,cleanup_module函数被调用,它释放字符设备test在系统字符设备表中占有的表项。
  void cleanup_module(void)
  {
  unregister_chrdev(test_major, "test");
  }
  到这里test.c基本就编写完成了。一个简单的字符设备可以说写好了。
  4.编译
  $ gcc -O2 -DMODULE -D__KERNEL__ -c test.o test.c
  得到文件test.o就是一个设备驱动程序。
  如果设备驱动程序有多个文件,把每个文件按上面的命令行编译,然后
  ld -r file1.o file2.o -o modulename
  驱动程序已经编译好了,现在把它安装到系统中去。
  $ insmod -f test.o
  安装成功在/proc/devices文件中就可以看到设备test,并可以看到主设备号。要卸载运行:
  $ rmmod test
 
  5.创建设备节点
  mkmod /dev/test c major minor
  c是指字符设备,major是主设备号,minor是从设备号,一般可以设置为0
  以上就是linux驱动编写的基本过程了
     本文转自 驿落黄昏 51CTO博客,原文链接:http://blog.51cto.com/yiluohuanghun/1080839,如需转载请自行联系原作者
你可能感兴趣的文章
一站式VDI部署教程(2)安装并配置DC、DNS、DHCP
查看>>
修改tomcat默认发布目录
查看>>
Android 提示某某程序停止的原因
查看>>
JVM致命错误日志(hs_err_pid.log)解读
查看>>
React
查看>>
WebInterface 登录事件审核查询
查看>>
从一个进程监控脚本学几个Linux命令(`ps`,`grep`,`awk`,`wc`)
查看>>
OpenCascade BRep Format Description (2)
查看>>
我在大学毕业后学习Linux、python的一些经验
查看>>
探索虚函数表
查看>>
记一次对象归档中的错误, initWithCoder报
查看>>
MacOS安装delve
查看>>
VIM简单上手
查看>>
多张图片上传简单示例
查看>>
FADE代码解析2
查看>>
线程使用三——future和callable详解
查看>>
Logstash + DataHub + MaxCompute/StreamCompute 进行实时数据分析
查看>>
阿里云数加大数据计算服务MaxCompute学习路线图 (持续更新中)
查看>>
聊聊springcloud的GatewayControllerEndpoint
查看>>
聊聊sentinel的SentinelResourceAspect
查看>>