linux内核模块和驱动程序的编写(2)

2016-02-19 12:31 13 1 收藏

下面是个linux内核模块和驱动程序的编写(2)教程,撑握了其技术要点,学起来就简单多了。赶紧跟着图老师小编一起来看看吧!

【 tulaoshi.com - 编程语言 】


  Linux中的大部分驱动程序,是以模块的形式编写的.这些驱动程序源码可以修改到内核中,也可以把他们编译成模块形势,在需要的时候动态加载.
  
  一个典型的驱动程序,大体上可以分为这么几个部分:
  
  1,注册设备
  
  在系统初启,或者模块加载时候,必须将设备登记到相应的设备数组,并返回设备的主驱动号,例如:对快设备来说调用 refister_blkdec()将设备添加到数组blkdev中.并且获得该设备号.并利用这些设备号对此数组进行索引.对于字符驱动设备来说,要使用 module_register_chrdev()来获得祝设备的驱动号.然后对这个设备的所有调用都用这个设备号来实现
  
  2,定义功能函数
  
  对于每一个驱动函数来说.都有一些和此设备密切相关的功能函数.那最常用的块设备或者字符设备来说.都存在着诸如 open() read() write() ioctrol()这一类的操作.当系统社用这些调用时.将自动的使用驱动函数中特定的模块.来实现具体的操作.而对于特定的设备.上面的系统调用对应的函数是一定的.
  
  如:在块驱动设备中.当系统试图读取这个设备(即调用read()时),就会运行驱动程序中的block_read() 这个函数.
  
  打开新设备时会调用这个设备驱动程序的device_open() 这个函数.
  
  3,谢载模块
  
  在不用这个设备时,可以将他卸载.主要是从/proc 中取消这个设备的非凡文件.可用特定的函数实现.
  
  下面我们列举一个字符设备驱动程序的框架.来说明这个过程.
  
  /* a module of a character device */
  
   
  
  /* some include files*/
  
  #include"param.h"
  
  #include"user.h"
  
  #include"tty.h"
  
  #include"dir.h"
  
  #include”fs.h"
  
   
  
  /* the include files modules need*/
  
  #include"linux/kernel.h"
  
  #include"linux/module.h"
  
  #if CONFIG_MODBERSIONS==1
  
  degine MODBERSIONS
  
  #include" linux.modversions.h"
  
  #endif
  
  #difine devicename mydevice
  
  /* the init funcion*/
  
  int init_module()
  
  {
  
  int tag=module_register_chrdev(0,mydevice,&Fops);
  
  if (tag0)
  
  {
  
  printk("the device init is erro!");
  
  return 1;
  
  }
  
  return 0;
  
  }
  
   
  
  /*the funcion which the device will be used */
  
  int device_open ()
  
  {
  
  …….
  
  }
  
  int device_read ()
  
  {
  
  …….
  
  }
  
  int device_write ()
  
  {
  
  …….
  
  }
  
  int device_ioctl ()
  
  {
  
  …….
  
  }
  
  ……
  
  /* the deltter function of this module*/
  
  int cleanup_module()
  
  {
  
  int re=module_unregister_chrdev(tag,mydevice);
  
  if( re0)
  
  
  {
  
  printk("erro unregister the module !!");
  
  return 1;
  
  }
  
  return 0;
  
  }

来源:http://www.tulaoshi.com/n/20160219/1601115.html

延伸阅读
标签: 电脑入门
第一个内核模块(Hello World模块) 代码如下: View Code #includelinux/init.h #includelinux/module.h MODULE_LICENSE("Dual BSD/GPL"); static __init int hello_init(void) { //printk函数在内核中定义对模块可用,内核需要自已的打印涵数 //因为它靠自已运行,而没有相应的库函数。 //模块能够调用printk是因为insmod加...
绪论 这篇文章我说明在openbsd上如何进行内核编程,以下句子来自lkm手册页: "可加载内核模块可以答应系统治理员在一台运行着的系统上动态的增加或删除功能模块,它同时可以帮助软件工程师们为内核增加新的功能而根本就不需要重起计算机就可以测试他们开发的程序." 当然,像众多系统的lkm一样,它存在一定...
标签: 服务器
linux内核驱动-内核初涉   一、为什么要学习内核? 有些人要学习内核,而有些人则可以不学习它。你如果以后要从事系统研发或驱动开发的话,就要学习内核。 刚刚接触内核,主要学习内核的接口函数。不要深入的去读内核,因为你读也读不懂,内核代码庞大如野兽一般不可驾驭。 学习内核主要掌握层次学习法,即从头开始学习...
标签: PHP
            { 相信大多数人在安装Linux时遇到的第一个难题,就是Linux不认你的显卡。而显卡安装不正确或胡乱选一个驱动程序安上则难以进入X Window。即使勉强进去了,因为分辨率太低,桌面上的文字和图片都放大了好几倍,仍无法使用。我的Linux是Red Hat,显卡是Trident Blade 3D...
标签: PHP
四、中断处理程序 Linux中的中断处理程序很有特色,它的一个中断处理程序分为两个部分:上半部(tophalf)和下半部(bottom half)。之所以会有上半部和下半部之分,完全是考虑到中断处理的效率。 上半部的功能是"登记中断"。当一个中断发生时,他就把设备驱动程序中中断例程的下半部挂到该设备的下半部执行队列...

经验教程

768

收藏

87
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部