Linux 字符设备驱动(一)

       Linux字符设备驱动程序是Linux系统驱动中比较简单的了,当然我个人认为input子系统比字符设备驱动程序要简单,呵呵,不过你得熟悉了整个架构才能这么说。本文只是为了学习后免得忘记而留下的。本人记忆不是很好,经常选择性失忆,因此写出来总不会忘吧,希望这里的服务器不要给我选择性失忆。

废话就不多说了,Linux字符设备驱动基本架构如下:      
#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/version.h>
#include<linux/types.h>
#include<linux/errno.h>
#include<linux/init.h>                          
     

static int __init my_init(void)                                     //字符设备驱动模块入口函数
{
    printk("driver installed!\n");
    return 0;
}

static void __exit my_exit(void)                               //字符设备驱动模块出口函数
{
    printk("driver uninstalled!\n");

    return;
}

module_init(my_init);                                            //一个宏,指定初始入口函数
module_exit(my_exit);                                          //一个宏,指定出口函数
MODULE_AUTHOR("test@hotmail.com");
MODULE_LICENSE("GPL");

      这是最简单的字符设备驱动,几乎Linux所有的驱动程序都以此架构为基础,Linux内核为了减少内核的大小,在安装新设备更新驱动后不用重新编译内核,提出了这个模块化编程的思想。也就是可以把驱动程序做为一个新的功能加入内核,而不用重新编译内核,只需要将编译声成的模块使用命令插入内核即可。这样就大大方便了驱动程序的开发。下面来简单说说上面每一行的意义:

     头文件我就不想说了,是下面这些函数的声明,下面这个函数什么实际的事情都不做,只是打印一条提示信息,这个将是此驱动模块的入口函数,那么什么是入口函数呢,其实说简单点,就是初始化函数,在使用insmod命令将模块插入内核的时候将调用此函数,驱动程序可以在这里对硬件进行初始化动作。    

static int __init my_init(void)                                     //字符设备驱动模块入口函数
{
    printk("driver installed!\n");
    return 0;
}

     下面这个函数是驱动程序的出口函数,就是在我们使用命令rmmod卸载一个模块的时候调用的函数,在这里可以对硬件做一些退出的动作,还做一些释放在入口函数申请的内存空间,irq等资源。当然在实际中,这2个函数当然不会这么简单,这里只是一个示例;看下面的出口函数中有__exit关键字,这表示当我们的驱动程序不做为模块编译的时候,那么这个模块将永远不会被调用,那么此函数也就没有用处,在这个时候,加了__exit关键字的函数将不做编译;

static void __exit my_exit(void)                               //字符设备驱动模块出口函数
{
    printk("driver uninstalled!\n");

    return;
}

下面这行其实是一个宏,它指定模块的入口函数:

module_init(my_init);                                            //一个宏,指定初始入口函数

 

下面这行也是一个宏,它指定模块的出口函数:

module_exit(my_exit);                                          //一个宏,指定出口函数

最后2行是一些辅助性的东西,将在后面说明,这里就不做说明了:

MODULE_AUTHOR("test@hotmail.com");
MODULE_LICENSE("GPL");

在这里要说明的是,在2.4内核以前,是可以直接使用gcc命令直接编译模块的,不过在2.6内核中,必须使用makefile了,下面是编译模块的makefile,其实大多都差不多像下面这样了:

ifneq ($(KERNELRELEASE),)
      obj-m :=demo.o                                                                //模块所依赖的.o文件这默认会编译demo.c文件,
else
    KERNELDIR ?=/lib/modules/$(shell uname -r)/build               //内核目录,请指定你将要把此模块插入的内核的目录
    PWD :=$(shell pwd)                                                           //模块文件的目录
ALL:
    $(MAKE) -C  $(KERNELDIR) M=$(PWD)  modules              //按照这样写就行
endif

clean:                                                                                 //不用解释
     rm -fr *.o *.ko *~ core .depend .*.cmd *.mod.c .tmp_versions *symvers

这个makefile比较简单,看右边的说明就行了,其它的不想多说!好累,好饿,心好冷,下回继续吧!

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
探索全栈前端技术的魅力:HTML+CSS+JS+JQ+Bootstrap网站源码深度解析 在这个数字化时代,构建一个既美观又功能强大的网站成为了许多开发者和企业追逐的目标。本份资源精心汇集了一套完整网站源码,融合了HTML的骨架搭建、CSS的视觉美化、JavaScript的交互逻辑、jQuery的高效操作以及Bootstrap的响应式设计,全方位揭秘了现代网页开发的精髓。 HTML,作为网页的基础,它构建了信息的框架;CSS则赋予网页生动的外观,让设计创意跃然屏上;JavaScript的加入,使网站拥有了灵动的交互体验;jQuery,作为JavaScript的强力辅助,简化了DOM操作与事件处理,让编码更为高效;而Bootstrap的融入,则确保了网站在不同设备上的完美呈现,响应式设计让访问无界限。 通过这份源码,你将: 学习如何高效组织HTML结构,提升页面加载速度与SEO友好度; 掌握CSS高级技巧,如Flexbox与Grid布局,打造适应各种屏幕的视觉盛宴; 理解JavaScript核心概念,动手实现动画、表单验证等动态效果; 利用jQuery插件快速增强用户体验,实现滑动效果、Ajax请求等; 深入Bootstrap框架,掌握移动优先的开发策略,响应式设计信手拈来。 无论是前端开发新手渴望系统学习,还是资深开发者寻求灵感与实用技巧,这份资源都是不可多得的宝藏。立即深入了解,开启你的全栈前端探索之旅,让每一个网页都成为技术与艺术的完美融合!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值