《LINUX设备驱动》学习总结(基础篇)

原创 2015年07月10日 18:24:54

基本概念:

编程机制和策: “需要提供什么样的功能(机制)”和“如何使用这些功能(策略)”
编写驱动程序应注意:编写访问硬件的内核代码时,不要给用户强加任何策略。不过有时候还是需要实现一些策略,例如,某个数字IO驱动程序只提供以字节为单位访问硬件的方法,这样可以避免写额外代码来处理单个数据位的麻烦。

内核模块和应用程序: 理解module_init 和module_exit 。模块初始化的任务是为以后调用模块函数做预先准备; 模块退出函数是为了告诉内核“我要离开了不要再让我做任何事了”。 应用程序退出时可以不管资源的释放或者其他清理工作,但是,模块退出函数必须要仔细撤销初始化函数所做的一切,否则,在系统重新引导之前某些东西就会残留在系统中。
应用程序能够调用它并未定义的函数,这是因为链接过程能够解析外部引用从而使用适当的函数库。例如定义在libc中的printf函数就是这种可被调用的函数之一。然而,模块仅仅被链接到内核,因此它能调用的函数仅仅是由内核导出的那些函数,而不存在任何可链接的函数库。
因为没有任何函数库和模块链接,因此,源文件中不能包含通常的头文件,像

# To build modules outside of the kernel tree, we run "make"
# in the kernel source tree; the Makefile these then includes this
# Makefile once again.
# This conditional selects whether we are being included from the
# kernel Makefile or not.
ifeq ($(KERNELRELEASE),)  #判断是否被上层makefile包含,区别在单独编译和与内核一起编译。

    # Assume the source tree is where the running kernel was built
    # You should set KERNELDIR in the environment if it's elsewhere
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build  #指定内核路径,需要是目录中包含.config文件,即配置好的内核
    # The current directory is passed to sub-makes as argument
    PWD := $(shell pwd) #当前编译路径
modules:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules  #在当前路径生成模块
modules_install:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install  #编译好的模块会被拷贝到指定的路径中

clean:
        rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

.PHONY: modules modules_install clean

else
    # called from kernel build system: just declare what our modules are
    obj-m := hello.o

endif

makefile基础
赋值符号 “=” “:=” “?=” “+=”
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值 两个链接符之间用自动添加空格

关于 := 和 = 的区别看下面的例子

            A=first
            B:=$(A)add
            A=final
all:
            @echo $(B)

运行 make 结果显示 firstadd

        A=first
        B=$(A)add
        A=final
all:
        @echo $(B)

运行make显示 finaladd

总结:似乎 使用:=赋值的时候没有对后面的赋值语句进行检查,而使用 =的时候会受到后面语句的影响。
语句中@echo 和echo的区别是是否显示echo 。加@echo只显示输出结果不显示命令。echo会显示命令之后显示对应输出。

“ifdef”是条件关键字。语法是ifdef ;; else ; endif
ifdef只检验一个变量是否被赋值,它并不会去推导这个变量,并不会把变量扩展到当前位置。
“ifeq”与“ifdef”类似。“ifeq”语法是ifeq (;, ;),功能是比较参数“arg1”和“arg2”的值是否相同。

ifneq ($(KERNELRELEASE),)
     module-objs:=hello.o  #当有多个源文件时可以写成  hello1.o hello2.o
     obj-m:=hello.o   #有多个源文件时这个名字不能和上面的重复
else
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    PWD := $(shell pwd)
modules:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
endif

clean:
        rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

.PHONY: modules modules_install clean   

学习中遇到问题:
1、printk输出数据没在终端显示
重新打开一个终端,在终端下输入

    whlie true
    do
        sudo dmesg -c
        sleep   1
    done

这段程序会不停的读取当前系统日志并清空

版权声明:本文为博主原创文章,转载请注明出处。

【Linux开发】linux设备驱动归纳总结(一):内核的相关基础概念

linux设备驱动归纳总结(一):内核的相关基础概念 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
  • LG1259156776
  • LG1259156776
  • 2016年05月16日 11:55
  • 509

如何学好linux设备驱动

Linux系统目前主要维护2.4和2.6两个内核版本,在http://www.kernel.org/ 网站上已经可以下载到最新的2.6内核linux-2.6.38.6,及最新的2.4内核linux-2...
  • shuilaner_
  • shuilaner_
  • 2017年01月10日 16:32
  • 1239

《鸟哥的linux私房菜:基础学习篇》第3版 - 核心笔记(全)

一、什么是 Linux 呢?! • Unix 与 Linux 的历史     o Multics 系统:由 Bell(贝尔实验室)、MIT(麻省理工学院)与 GE(美国通     用电器)合作开发的...
  • sinat_36184075
  • sinat_36184075
  • 2017年05月19日 23:50
  • 544

鸟哥的Linux私房菜 基础学习篇(第三版)

第零章 计算器概论 1 计算机:辅助人脑的好工具 接收用户指令与数据,经由中央处理器的数学与逻辑单元运算处理后,以产生或存储成有用的信息。 1.1 计算器的五大单元 输入单元,CPU控制单元,CPU算...
  • niuzhihuan
  • niuzhihuan
  • 2015年08月03日 20:17
  • 905

《鸟哥的Linux私房菜--基础学习篇》 读书笔记

############################################ 第20章 启动流程、模块管理与Loader 2015.04.11 ######################...
  • ustc_summer
  • ustc_summer
  • 2015年04月11日 17:59
  • 1286

linux设备驱动归纳总结--S3C2440

linux设备驱动归纳总结(一):内核的相关基础概念 linux设备驱动归纳总结(二):模块的相关基础概念 linux设备驱动归纳总结(三):1字符型设备之设备申请 linux设备驱动归纳总结(三...
  • lyl494223339
  • lyl494223339
  • 2013年07月31日 16:06
  • 883

linux设备驱动归纳总结(九):1.platform总线的设备和驱动

linux设备驱动归纳总结(九):1.platform总线的设备和驱动 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
  • jsn_ze
  • jsn_ze
  • 2016年02月26日 14:46
  • 511

鸟哥的Linux私房菜基础篇第三版 -- 目录

服务器端使用的OS,Linux是最最常用的,所以,日常的部署、排查问题,就不可避免的与Linux打交道,日积月累,对Linux就有了多多少少的了解。 反过来,再系统的从头开始,读一本关于Linux基础...
  • puma_dong
  • puma_dong
  • 2015年09月27日 22:49
  • 1927

我的2014个人总结——学习篇、工作篇、生活篇

2013的个人总结在我印象当中是写过的,2014已成为过去,当我想回过头来看看我2013年的总结时,奈何我已不知它的踪迹了,所以决定以后的个人总结还是以博客的形式记录吧!平静下来,该是好好总结这一年各...
  • qq710262350
  • qq710262350
  • 2015年01月18日 10:09
  • 1482

linux驱动开发学习路线

结构、操作系统、体系结构、编译原理、计算机网络你全修过 我想大概可以分为4个阶段,水平从低到高 从安装使用=>linux常用命令=>linux系统编程=>内核开发阅读内核源码 其...
  • wowotoupi
  • wowotoupi
  • 2014年07月17日 09:00
  • 502
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《LINUX设备驱动》学习总结(基础篇)
举报原因:
原因补充:

(最多只允许输入30个字)