一、驱动基础

1、什么是驱动

能够通过软件操作硬件的这份程序就是驱动

2、Linux驱动和ARM裸机驱动的区别

  1)Linux设备驱动工作时依赖于Linux内核, ARM裸机驱动不依赖于Linux内核,可以单独执行。
2)Linux设备驱动工作的空间在内核空间的【3G~4G】中,驱动中不能有main函数出现,也不能有while(1)的死循环, ARM裸机驱动的代码都在一个main函数中编写完成的。
3)Linux设备驱动可以并行执行(核与核之间可以并行执行,单个核时也可以分时复用执行) ARM裸机驱动的程序是在一个while中分时复用执行的

3、驱动在内核中的位置

------------------------------------------------------------------------------
user(应用层):
APP APP glibc(C标准库)
-----------------------------------------------------
shell:
-----------------系统调用(swi软中断)-------------------------------------------
kernel(内核层):(5大功能)
1)文件管理
2)内存管理
3)进程管理
4)网络管理:网络协议栈管理(网络的几个层次,TCP/IP四层、OSI七层)
5)设备管理:设备驱动管理
-----------------------------------------------------------------------------
hardware(硬件层):
LED、鼠标、键盘、LCD(帧缓存)、camera、声卡
emmc、U盘、硬盘、dm9000、TRL8211
-----------------------------------------------------------------------------------------------

4、驱动的种类

1)字符设备驱动:

按照字节流来访问,并且只能顺序访问,不能无序访问的设备。

2)块设备驱动:

按照block(块 = 512字节)来访问,可以顺序访问,也可以无序访问的设备。

3)网卡设备驱动:

和网络通讯相关的设备驱动,没有设备文件,只能通过socket接口来访问的设备驱动

5、Linux内核模块

Linux内核模块的三要素:

1)入口: 驱动资源的申请,驱动对象的注册

2)出口: 驱动资源的释放,驱动资源的注销

3)许可证: 遵循 GPL 协议

GNU:GNU IS NOT UNIX 一个提倡软件自由的组织--->理查德·斯托曼提出的

GPL:GNU通用公共许可证 一种协议

C语言为面向过程的语言,C++为面向对象的语言

驱动使用的是C语言编程,但要有面向对象的思想和概念

模块的编写:!!!

 1 #include <linux/init.h>
2 #include <linux/module.h>
3
4 //入口
5 static int __init mycdev_init(void)
6 {
7 //__init作用:告诉编译器将mycdev_init这个函数放到.init.text这个段中
8 return 0;
9 }
10
11 //出口
12 static void __exit mycdev_exit(void)
13 {
14 //__exit作用:告诉编译器将mycdev_exit这个函数放到.exit.text这个段中
16 }
17
18 module_init(mycdev_init);
19 //告诉内核入口函数的地址是mycdev_init
20 module_exit(mycdev_exit);
21 //告诉内核出口函数的地址是mycdev_exit
22 MODULE_LICENSE("GPL");
23 //许可证
24

系统关键字

1、vi -t __ini
vim ./include/linux/init.h +44
44 #define __init __section(.init.text) __cold notr 驱动模块入口段 2、vi -t __exit
vim ./include/linux/init.h +83
83 #define __exit __section(.exit.text) __exitused __cold notrace 驱动模块出口段 以"__"开头的内容,是给编译器使用的,不需要太过理解,
如 __init、__exit、__FILE__、__func__、__LINE__

static 关键字

在模块的入口函数和出口函数中使用了 static 关键字进行了修饰

  作用:是为了避免,自己自定义的模块入口出口函数名,与未知的函数名重名,而带来的重新定义的问题, 函数可以加上 static 关键字修饰,经过 static 关键字修饰过的函数的链接属性为内部,从而解决了该问题

6、测试:

安装 insmod xxx.ko

查看 lsmod

卸载 rmmod xxx

7、Makefile编写

  KERNELDIR = /lib/modules/$(shell uname -r)/build/
#ubuntu内核的路径 #KERNELDIR = /home/liu/Linux/kernel-3.4.39/
#开发板内核的路径 PWD=$(shell pwd)
#当前路径 NAME ?= demo.c
#需要编译的模块名字 NAMES := $(patsubst %.c,%,$(NAME))
#截取字符串 xx.c 里的 .c 之前的内容 obj-m:=$(NAMES).o
#需要的依赖文件 all:
make -C $(KERNELDIR) M=$(PWD) modules @# mkae -C $(KERNELDIR)
@# 进入内核顶层目录下,读取目录下的Makefile文件,并执行这个Makefile文件
@# M=$(PWD) 指定编译模块的路径
@# modules 编译模块的选项
@# 如:
@# 1、cd $(KERNELDIR)
@# 2、mkae M=$(PWD) modules
clean:
make -C $(KERNELDIR) M=$(PWD) clean @# mkae -C $(KERNELDIR)
@# 进入内核顶层目录下,读取目录下的Makefile文件,并执行这个Makefile文件
@# M=$(PWD) 指定编译模块的路径
@# clean 清除的选项
@# 如:
@# 1、cd $(KERNELDIR)
@# 2、make M=$(PWD) clean
cp:
cp $(NAMES).ko ~/nfs/rootfs/

Linux驱动模块00的更多相关文章

  1. 【转】Linux驱动模块编译进内核中

    原文网址:http://blog.chinaunix.net/uid-29287950-id-4573481.html BQ27501驱动编译进内核 一.       驱动程序编译进内核的步骤 在 l ...

  2. linux驱动模块编译(初学者)

    inux 模块编译步骤(转) 本文将直接了当的带你进入linux的模块编译.当然在介绍的过程当中,我也会添加一些必要的注释,以便初学者能够看懂.之所以要写这篇文章,主要是因为从书本上学的话,可能要花更 ...

  3. linux 驱动模块 内核编译环境

    目录(?)[+] Linux设备驱动Hello World程序介绍 如何编写一个简单的linux内核模块和设备驱动程序.我将学习到如何在内核模式下以三种不同的方式来打印hello world,这三种方 ...

  4. Linux驱动模块编译模板

    hello.c文件: #include <linux/module.h> #include <linux/kernel.h> static int hello_init(voi ...

  5. Linux驱动模块的Makefile分析【转】

    本文转载自:http://blog.chinaunix.net/uid-29307109-id-3993784.html 1. 获取内核版本 当设备驱动需要同时支持不同版本内核时,在编译阶段,内核模块 ...

  6. tac命令的实现 分类: linux 2014-06-02 00:08 344人阅读 评论(0) 收藏

    此程序实现简化的linux中的tac命令.即对文件按行倒序输出. 首先将文件指针置于文件尾,从后向前移动指针, 将两个换行符'\n'间的内容作为一行输出. #include<stdio.h> ...

  7. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  8. 第六章 第一个Linux驱动程序:统计单词个数

    现在进入了实战阶段,使用统计单词个数的实例让我们了解开发和测试Linux驱动程序的完整过程.第一个Linux驱动程序是统计单词个数. 这个Linux驱动程序没有访问硬件,而是利用设备文件作为介质与应用 ...

  9. Linux代码的重用与强行卸载Linux驱动

    (一)Linux代码的重用 重用=静态重用(将要重用的代码放到其他的文件的头文件中声明)+动态重用(使用另外一个Linux驱动中的资源,例如函数.变量.宏等) 1.编译是由多个文件组成的Linux驱动 ...

随机推荐

  1. Round 4

    最近再次经历动荡期 博客只在小白时期记录过 已经沉寂许久 之前的工作在黄区 加班超多  阻隔了一切与外网交流的可能 只能凭记忆补一点最近一年来积累到的知识 不管怎么样 不能放弃自己啊老铁!

  2. C++ 数据结构 1:线性表

    1 数据结构 1.1 数据结构中基本概念 数据:程序的操作对象,用于描述客观事物. 数据的特点: 可以输入到计算机 可以被计算机程序处理 数据是一个抽象的概念,将其进行分类后得到程序设计语言中的类型. ...

  3. 高清DEM最高立减1500元!

    选购攻略: 活动一:选购12.5米DEM(地形)数据.30米 DEM(地形)数据,满500元立减100元.满1000元立减200元.满2000立减500元.满5000元立减1500元:每位用户仅可享受 ...

  4. 01MySQL数据库介绍

    一.数据库基本介绍 目标:了解数据库的功能和常见数据库分类.数据库产品 数据库基本知识 数据库分类 SQL简介 MySQL访问 1.数据库基本知识 目标:了解数据库的概念和数据库的作用 概念 数据库: ...

  5. rgw实现nfs的首测

    功能介绍 关于rgw实现nfs接口这个,刚接触的人可能并不清楚这个是个什么样的服务架构,rgw是ceph里面的对象存储接口,而nfs则是纯正的网络文件系统接口,这二者如何结合在一起,关于这个,有几个相 ...

  6. Struts2漏洞渗透笔记

    虽然这是一次失败的渗透,但是也学到不少新姿势. 目标机环境:①外网②win2012③360全家桶 一,利用Struts2终极利用工具上传一句话 jsp的一句话,有时候会出现兼容问题.比如Cknife的 ...

  7. ESP定律脱壳——NsPack3.x脱壳

    首先进行查壳,NsPack 将程序拖入x64dbg 程序入口处标志性的push F8单步,发现仅有esp寄存器有变化 在esp上右键,在内存窗口查看,下硬件断点 F9运行程序,程序断在pop之后. 使 ...

  8. zabbix、Cacti、Nagios、open-falcon、Ganglia、Prometheus开源监控比较

    Zabbix 一个基与WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案(普遍) 能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速定位/解决存在的 ...

  9. 在FL Studio编曲软件中查找采样的音高

    相信玩音乐的小伙伴们都遇到过这种情况,在用FL Studio编曲时,想添加一段音频采样,由于采样的调式与我们正在编曲的调式不同,音频之间的衔接就是一个非常头疼的问题,要解决采样的调式,我们就得先确认这 ...

  10. 能否安装 CrossOver 上没有的软件

    系统兼容软件CrossOver可以像虚拟机一下帮助我们在Mac或者Linux上运行Windows应用程序,快速实现跨平台文件互通,所以我们也称它为类虚拟机. 不需要安装Windows操作系统的Cros ...