哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处
http://blog.csdn.net/woshixingaaa/archive/2010/11/08/5995799.aspx
这个是《LINUX设备驱动程序》第二章的示例程序。编译这个程序之前要构建好内核源码树,
所谓源码树就是编译好内核后的/usr/src/$(shell uname -r) 目录
方法见我的博客http://blog.csdn.net/woshixingaaa/archive/2010/11/07/5993648.aspx
我的这个程序是在源码树之外编译内核模块。
module.h包含有可装载模块需要的大量符号和函数定义,包含init.h的目的是指定初始化和清除
函数。hello_init()和hello_exit()声明为静态是因为这两个函数只在本文件中使用。__init表明该函
数只在调用时被使用,__exit表示该函数只在模块被卸载或者系统关闭时被调用。printk是在内
核中运行向控制台输出显示的函数,LINUX内核首先在内核空间分配一个静态的缓冲区,作为
显示用的空间,然后调用sprintf,格式化显示字符串,然后调用tty_write向终端进行信息的显示。
module_init()和module_exit()是两个宏,前者用来注册模块,后者用来注销模块。使用insmod时
module_init()注册的函数被调用,使用rmmod时module_exit()注册的函数被调用。KERN_ALERT
用来定义这条消息的优先级,我们需要在模块中显示指定高优先级的原因在于:具有默认优先级
的消息可能不会输出在控制台上,这依赖于内核版本。
这个是Makefile文件,KERNELRELEASE是源码树顶层Makefile中定义的,ifneq用来判断参数是
否不相等,注意ifneq和后面的括号之间有一个空格,否则报错“Makefile:1: *** 遗漏分隔符 。 停止
。”将 KERNELRELEASE与空进行比较,如果不为空则指定目标obj-m:=hello.o, KERNELDIR 后
的?=是条件赋值运算符,如果KERNELDIR没有被赋值,则对它进行复制,后面这个/lib/modules/
$(shell uname -r)/build是一个符号链接,指向源码树。$(MAKE) -C $(KERNELDIR) M=$(PWD) mo
dules,我分析了好久,查了很多资料,是我感觉最难理解的一句。此命令首先改变当前工作目录到
-C指定的位置(即内核源码目录),其中保存有内核的顶层Makefile,执行此Makefile,需要编译模块,M
=$(PWD)指定了需要回到源码的目录,此时再次进入源码目录的Makefile,此时KERNELRELEASE
已被定义了,所以执行obj-m:=hello.o,指定了需要编译的模块,然后make modules进行编译。.PHON
Y: modules modules_install clear指定modules modules_install clear 都是伪指令,他们没有目标文件,
只相当于地址标号,如果有同名的目标不会发生错误。
可以安装模块了:
如果在文本控制台下可以直接输出
如果是在终端的仿真器中则许查看日志
此句不同发行版不同,有的是
然后卸载
再在日志中查看
模块参数传递
内核中使用module_param宏来声明参数,这个宏定义在moduleparam.h中,module_param需要3个参数:变量的名字,类型,以及用于sysfs入口项的访问许可掩码。
在程序中加入
修改hello_init
终端输入
分享到:
相关推荐
TE-2440开发板的用户手册,包括各个接口和外围电路图
本文的目的为基于linux2.6.30.4 framebuffer移植LCD驱动到FL2440开发板。本文内容大致分为以下几个部分: 1、 LCD硬件及显示原理介绍; 2、 s3c2440 LCD控制器介绍; 3、 内核LCD驱动机制framebuffer(帧缓冲技术)...
基于TX2440A开发板的网络远程视频监控系统
第一章TE2440-II开发板硬件介绍 1开发套件包含内容 2开发板主要硬件说明 3开发板支持的操作系统及其驱动 第二章TE2440-II开发板基本使用 1TE2440-II外部硬件连接 2windows下驱动的安装 3调试终端使用 4bootloader...
搭建基于S3C2440开发板的网络远程视频监控系统。内容非常详细。
S3C2440驱动代码(基于TQ2440开发板)
跨平台性:Linux操作系统可以在多种硬件架构和平台上运行,包括x86、ARM、MIPS等。这使得Linux成为了一种非常灵活的操作系统,适用于各种设备和应用场景。 可定制性:由于Linux的源代码是公开的,用户可以根据自己的...
基于jz2440开发板的linux-4.9版本内核移植
Linux内核中已经有现成的1-wire驱动,写这个驱动纯粹是为了练手。
很不错的基于TQ2440开发板的Linux-2.6;30的网络摄像机的实现,大家看到给个好评。
每一个新版本Linux内核都会带来许多新的变化,这些变化在不同层次上对开发人员有很大的影响。本文概括了在2.6内核下硬件驱动程序的变化及模 块搭建过程的变化。然而,如果用户正在手工维护现有的硬件驱动程序或开发...
TE-2440II ARM开发板,具有两个物理隔离的网络接口
天嵌科技出品--基于TQ2440开发板的Linux-2.6.30.4的网络摄像机的实现 很好的学习例子
基于Cortex-A53内核Linux系统粤嵌GEC6818开发板的电子乐队程序设计 三种音源独立设计:钢琴、钢琴和弦、鼓点 四种模式:和弦模式、键盘模式、鼓点模式、编曲模式 键盘模式包含16个按键 包含所有音名 所有调式皆可...
基于Linux系统下利用S3C2440开发板与GPRS无线通信模组
基于全志A40i开发板——Linux-RT内核应用开发教程(1).doc
天祥电子的基于TX2440A开发板的网络远程视频监控系统v1.1的技术文档
基于mini2440开发板成功移植Boa的步骤、包括每一步的详细说明。
linux led驱动,自己学习时 感觉主要是makefile不会 导致很多文件找不到 这个事可以的 在自己的GT2440开发板验证通过的