《LINUX设备驱动程序》学习札记(一)

简介:

总结章节:第一章 设备驱动程序简介

          第二章 构造和运行模块

提到驱动程序就不得不先说下两个名词:内核空间和用户空间。用户空间即用户应用所运行的空间,内核空间值得是操作系统内核运行的空间。用户空间不能直接引用或者操作内核空间的数据,内核空间也不能直接引用用户空间的数据。操作系统内核对整个系统资源进行管理,这些资源中也包括硬件资源。所以用户空间也不能直接访问硬件资源。驱动为用户访问特定的硬件资源提供接口。用户空间要访问硬件资源则只需要调用驱动所提供的接口。驱动完全屏蔽了内部操作。从而,用户空间通过驱动这层特殊的内核间接的访问硬件资源。

驱动的作用在于提供机制,机制即:需要提供什么功能,而不是提供策略,策略即:如何使用这些功能。提供机制是驱动程序的任务,而策略则是应用程序所要完成的任务。由于不同的环境会有不同的方式来访问硬件,作为驱动程序的编写者,应该尽量做到使驱动不到策略,在编写驱动的时候,程序员还应该特别注意,编写访问硬件的内核代码,不要给用户强加任何特定策略。因为不同的用户会有不同的需求。

内核的功能分为:进程管理,内存管理,文件系统,设备控制,网络功能。所有设备控制操作都由与被控制设备相关代码来完成,这段代码就叫驱动程序,充分说明驱动程序是内核的一部分。

既然驱动程序是内核的一部分,那么驱动程序的编写就需要用到内核的头文件,对于Linux 2.6版本的内核驱动程序还需要依赖内核源码树。所以在编写驱动之前,要弄清楚,自己编写的驱动实际就是在编写内核,那么程序中所有用到的头文件都是内核的。

内核源码树的路径可以用一下命令查看:

# cd /lib/modules/$(uname -r)/build/ # pwd

现在编写一个简单的 HelloWorld 程序来说明

#include <linux/init.h> #include <linux/module.h> MODULE_LICENSE(“Dual MPL/GPL”); static int hello_init(void) { printk(KERN_ALERT “Hello, world/n”); return 0; } static void hello_exit(void) { printk(KERN_ALERT “Goodbye cruel world/n”); } module_init(hello_init); module_exit(hello_exit);

下面是 Makefile 文件内容

obj-m = hello.o KERNELDIR ?= /lib/modules/$(uname -r)/build


Makefile 代码解释:

obj-m 是内核要求的。驱动最终 hello.ko 依赖于 hello.o 文件

下面的一句就是制定内核树。如果驱动目标平台不是当前平台,只需要更改 KERNELDIR 的路径就可以了。

另外需要提的是驱动一旦在内核中注册了,那么其他的程序就可以使用该设备了,所以,千万不要再驱动内部初始化完成之前就在内核中注册该驱动。当驱动程序出错了,我们应该向内核注销该驱动程序。

 

 


版权申明:
转载文章请注明原文出处http://blog.csdn.net/feiyinzilgd/archive/2010/02/07/5297188.aspx

并请联系谭海燕本人或者前往谭海燕个人主页留言

目录
相关文章
|
21天前
|
存储 Linux
Linux的学习之路:16、文件(3)
Linux的学习之路:16、文件(3)
28 0
|
21天前
|
Linux C语言 C++
Linux的学习之路:14、文件(1)
Linux的学习之路:14、文件(1)
25 0
|
21天前
|
Linux 开发工具 C语言
Linux的学习之路:7、yum与git
Linux的学习之路:7、yum与git
14 0
|
21天前
|
Linux 开发工具
Linux的学习之路:5、粘滞位与vim
Linux的学习之路:5、粘滞位与vim
44 0
|
3天前
|
网络协议 Shell Linux
LabVIEW 在NI Linux实时设备上访问Shell
LabVIEW 在NI Linux实时设备上访问Shell
|
5天前
|
自然语言处理 Java Linux
【Linux】开始学习进程替换吧!
通过学习进程替换,我们可以体会到多语言混搭的快乐,可以从C语言直接蹦到python ,也可以从c++里运行java代码。是不是很厉害!这是通过调度多个进程的效果,联系我们之前学习的进程,进程控制等概念。我们可以想要运行其他代码可以通过创建子进程来实现,但是这样也肯定是同一种语言,如果想要运行其他语言,那是不是有种方法可以调度一个进程来当做子进程呢??? 我们开始今天的学习吧!
10 0
|
13天前
|
Ubuntu 算法 Linux
嵌入式Linux的学习误区
该文指出了学习嵌入式Linux开发的两个常见误区。一是过分专注于学习桌面或服务器版Linux,而非关注嵌入式开发本身,实际上只需熟悉基本操作即可。二是试图在没有基础的情况下直接阅读Linux内核源代码,这是不切实际的,应先建立基础知识再进行源码学习。文章还提到了在嵌入式系统中获取和处理屏幕数据的示例,包括使用gsnap工具将framebuffer数据转为图像,以及涉及的交叉编译过程。
11 0
|
14天前
|
编解码 Linux 数据安全/隐私保护
【Linux学习】​​学习Linux的准备工作和Linux的基本指令
【Linux学习】​​学习Linux的准备工作和Linux的基本指令
|
14天前
|
Linux Shell 虚拟化
【Linux学习】Linux 的虚拟化和容器化技术
【Linux学习】Linux 的虚拟化和容器化技术
|
15天前
|
运维 监控 安全
【专栏】11 个 Linux 网络命令学习和熟练运用这些命令是提升网络管理能力的基础
【4月更文挑战第28天】本文介绍了11个必备的Linux网络命令,包括ifconfig、ip、ping、traceroute、netstat、tcpdump、ss、telnet、ftp、ssh和nmap,这些命令在网络配置、故障排查和性能监控中发挥关键作用。通过实例分析,强调了它们在实际工作中的综合应用,帮助运维工程师提升效率和应对网络挑战。学习和熟练运用这些命令是提升网络管理能力的基础。