linux 驱动程序 HelloWorld
Linux驱动可以直接编译进内核,也可以以模块的形式进行加载,前者比较复杂,本文就以模块的形式加载!
vi helloi_driver.c
#include <linux/init.h>
          #include <linux/module.h>
          #include <linux/kernel.h>
static int __init hello_init(void)
         {
                printk(KERN_ALERT "hello driver init!\n");
                return 0;
          }
static void __exit hello_exit(void)
        {
               printk(KERN_ALERT "hello driver exit\n");
        }
module_init(hello_init);
        module_exit(hello_exit);
程序很简单,没有什么说的。关键时驱动的Makefile文件。
ifneq ($(KERNELRELEASE),)
obj-m :=hello_driver.o
else
KERNELDIR ?=/lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
modules:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
clean:
    rm -rf *.o *~ .depend .* .
分析上述Makefile文件,KERNELRELEASE时内核源代码顶层所定义的一个变量,当Makefile第一次执行时,这个变量并没有定义,因此直接执行else中的内容,uname -r命令输出当前系统所使用的版本号,/lib/modules/$(shell uname -r)/build这个就是Linux源码所在的目录,当执行到modules时,-C $(KERNELDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。
当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句, 指明模块源码中各文件的依赖关系,以及要生成的目标模块名。
obj-m后面跟的就是最终的模块名,hello_driver.o,make 会在该目录下自动找到hello_driver.c文件进行编译
hello_driver.o可能依赖多个文件或者模块,那么在obj-m后面就可以添加下面语句hello _driver-objs:=file.o file1.o
modules目标指向obj-m变量中设定的模块。
最后通过insmod加载驱动模块,用rmmod卸载模块,此外还有两个关于模块的命令:lsmod modprob modinfo,lsmod用来列出所有的模块,modprobe命令,可以智能插入模块,它可以根据模块间依存关系,以及/etc/modules.conf文件中的内容智能插入模块。
上面加载模块的例子在加载和卸载的过程中,就会有信息输出,通过dmesg打印输出。
linux 驱动程序 HelloWorld的更多相关文章
- linux设备驱动程序--hello-world
		
linux字符设备驱动程序--hello_world 基于4.14内核, beagleBone green平台 PC端的设备驱动程序 有过电脑使用经验的人都知道,当我们将外部硬件设备比如鼠标键盘插入到 ...
 - Linux驱动程序学习【转】
		
本文转载自: 一直在学习驱动,对于下面这篇文章,本人觉得简洁明了,基本符合我们学习驱动的进度与过程,现转发到自己的博客,希望能与更多的朋友分享. 了解Linux驱动程序技巧学习的方法很重要,学习lin ...
 - Linux驱动程序开发 - 设备控制接口
		
(2008-08-08 15:02:19) 转载▼ 标签: it linux kernel driver 分类: Linux 序言设备驱动程序的一个基本功能就是管理和控制设备,同时为用户应用程序提供管 ...
 - 第六章 第一个Linux驱动程序:统计单词个数
		
现在进入了实战阶段,使用统计单词个数的实例让我们了解开发和测试Linux驱动程序的完整过程.第一个Linux驱动程序是统计单词个数. 这个Linux驱动程序没有访问硬件,而是利用设备文件作为介质与应用 ...
 - 详细讲解Linux驱动程序
		
一 编写Linux驱动程序 1.建立Linux驱动骨架 Linux内核在使用驱动时需要装载与卸载驱动 装载驱动:建立设备文件.分配内存地址空间等:module_init 函数处理驱动初始化 卸载驱动 ...
 - 第6章  第一个Linux驱动程序:统计单词个数
		
编写一个Linux的一般步骤: 第1步:建立Linux驱动骨架(装载和卸载Linux驱动) 第2步:注册和注销设备文件 第3步:指定和驱动相关的信息 第4步:指定回调函数 第5步:编写业务逻辑 第6步 ...
 - Linux 驱动程序/内核模块/ko文件
		
Linux 驱动程序/内核模块/ko文件 一.内核模块加载机制 1.解析 Linux 内核可装载模块的版本检查机制 二.驱动/内核模块 编译 1.The Linux Kernel Module Pro ...
 - 第六章  第一个Linux驱动程序: 统计单词个数
		
一.编写Linux驱动程序的步骤 第1 步:建立Linux 驱动骨架(装载和卸载Linux 驱动) 骨架部分主要是Linux驱动的初始化和退出函数,代码如下: #include <linux/m ...
 - Linux驱动程序接口
		
§1. Linux驱动程序接口 系统调用是操作系统内核与应用程序之间的接口,设备驱动程序则是操作系统内核与机器硬件的接口.几乎所有的系统操作最终映射到物理设备,除了CPU.内存和少数其它设备,所有的设 ...
 
随机推荐
- centos7.2的yum安装mysql和修改初始密码
			
一.centos7.2安装mysql CentOS 7之后的版本yum的默认源中使用MariaDB替代原先MySQL,因此安装方式较为以往有一些改变: 下载mysql的源 wget http://de ...
 - powerdesigner中把表的描述复制到Name
			
'****************************************************************************** '* File: comment2nam ...
 - OpenCV---开闭操作
			
一:开操作(先腐蚀后膨胀) 特点:消除噪点,去除小的干扰块,而不影响原来的图像 import cv2 as cv import numpy as np def camp(val1,val2): pv ...
 - MongoDB常用方法
			
一.查询 find方法 db.collection_name.find(); 查询所有的结果: select * from users; db.users.find(); 指定返回那些列(键): se ...
 - delphi 7 连接 MySql
			
网上有很多关于Delphi连接MySql数据库的文章,在这里,我只记录下自己测试过的方法,以备所需.系统环境:Windows XP SP3软件环境:Delphi 7 .mysql-installer- ...
 - 【BZOJ】1066: [SCOI2007]蜥蜴
			
[算法]网络流-最大流(dinic) [题解] 构图思路: 因为石柱高度是可以被消耗的,即一根石柱可通过的蜥蜴数量有限,取舍问题中这样表示容量的属性显然可以作为网络流中的边. 于是将一根石柱拆成顶部和 ...
 - 【bzoj】2326 [HNOI2011]数学作业
			
[题意]给定n和m,求1~n从高位到低位连接%m的结果.n=11时,ans=1234567891011%m.n<=10^18,m<=10^9. [算法]递推+矩阵快速幂 [题解] 考虑枚举 ...
 - 【leetcode 简单】第十六题 二进制求和
			
给定两个二进制字符串,返回他们的和(用二进制表示). 输入为非空字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11", b = "1" 输出: ...
 - 从ZoomEye API 到 Weblogic 弱口令扫描
			
参考资料: ZoomEye API: https://www.zoomeye.org/api/doc Weblogic-Weakpassword-Scnner: https://github.com/ ...
 - 2017中国大学生程序设计竞赛 - 网络选拔赛  1003     HDU    6152    Friend-Graph   (模拟)
			
题目链接 Problem Description It is well known that small groups are not conducive of the development of ...