转载地址:http://blog.csdn.net/hulihong/archive/2010/02/04/5283647.aspx
转载请注明原著作者地址!
一:设备驱动程序简介
1 :机制与策略的区别:机制:“需要完成什么样的功能”,策略:“如何使用这些功能”。
2 :原语:指的是由若干条机器指令构成的一段程序。该程序在执行的时候不能被中断,直到改程序执行完毕。
3 :内核的功能:
1> :进程管理功能:负责进程创建和撤销以及他们之间和外部设备的通讯。不同进程间的通讯方式:信号、管道、进程间通讯原语。进程间的通讯时整个内核的基本功能。另外控制进程如何共享 CPU 的调度程序也是进程管理的一部分。
2> :内存管理:内存是计算机重要的资源之一。管理内存的策略师决定系统性能的一个关键因素。内核的不同部分在和内存管理子系统交互式使用一套相同的系统调用 。
3> :文件系统: linux 中的每个对象都可以被看做为文件
4> :设备控制:所有的设备控制操作都是由与被控制设备相关的代码来完成的。这段代码就叫做设备驱动程序。
5> :网络功能,网络功能也必须有操作系统来管理,因为大部分网络功能与具体的进程无关。
4 : linux 的优良特性之一:能够在运行时动态的扩展内核,即,我们可以在系统运行时给系统添加新的功能。
5 :模块 :运行时向内核添加的代码被称为模块 (module) ,每个模块有目标代码 ( 为链接的 ) 构成。
6 :设备模块分类: Unix 系统设备分为:字符设备、块设备和网络接口。
1> :字符设备是设备发送和接受数据都是以字符的形式进行的 ,由字符设备驱动程序来实现这特性。而块设备是以整个缓冲区形式进行的。
2> : linux 允许像字符设备那样读写块设备,可以一次传递多个字节的数据。
3> :网络接口:任何网络事务都要经过一个网络接口,即,一个能和其他主机交换数据的设备。通常这个接口是个硬件设备,也有可能是个纯软件设备,比如回环 (lookback) 接口
注: SCSI : small computer system interface (小型计算机系统接口)
7 :文件系统是除驱动程序之外 linux 系统中最重要的模块类型,它决定了如何在块设备上组织信息以表示目录和文件树。文件系统是个软件驱动程序,它将底层数据结构映射到高层数据结构,决定文件名的长度以及在目录项存储文件的那些信息。
二:构建和运行模块
1 :内核项:包括函数、变量、头文件、宏。
2 : module.h 文件中包含了加载模块所需的大量的函数和符号定义。 init.h 初始化和清理函数
3 :模块初始化函数:注册模块提供的任何功能,该函数应该声明为静态的,因为他们不会在特定文件之外可见。
4 :如果一个模块没有定义一个清理函数 ,内核不会允许它被卸载。
5 :模块参数的说明见驱动程序开发第三版46页
三:字符设备驱动程序
1:scull(simple character utility for loadding localities)作用-操作一些从内核分配的内存
2:主次编号:主编号标识与设备相连的驱动,该设备有该驱动来管理
3:大部分基础性驱动操作包含3个重要的内核参数:file_operatoins file(文件结构) inode
4:系统中每个打开的文件都有一个与之关联的struct file(文件结构,在内核空间),有open时创建。
5:在内核源码中,fle称之为文件结构, 而,filp称之为结构指针
6:inode结构:内核在内部用来表示文件的。
7:使用register_chrdev(unsigned int major, const char *name, struct file_operations *fops) 函数来注册字符设备
8:当前被加载的模块的目录是:/sys/module
9:模块参数,驱动需要的几个参数因不同的系统而不同,如果一个驱动程序控制老的硬件,那么还应该被明确告知去哪里找硬件的I/O端口或 I/O内存 地址。此时在加载模块时就需要用模块参数了。
10:系统调用是用户级程序访问内核的最基本方法 。同样驱动程序也是用户空间和内核信息交互的一种重要的方式。
11:内存映像:把内核中特定部分的内存映射到用户级程序的内存空间中去。也就是说内核空间和用户空间共享一段相同的内存空间
12:每个进程都有一个堆空间,malloc动态分配的内存实际上是从进程的堆空间中获取 的。
13:/sys/module 包含当前加载的模块
14:主设备号标识与之相连的驱动,该设备有该驱动来管理。次编号被内核用来决定引用那个设备。
15:/usr/include/linux/kdev_t.中的宏定义,已知设备号可以得到主次设备号,还可以有主次设备号得到设备号。
16:设备的主编号应该采用动态分配的方式 1
17:内核内存操作函数:void *kmalloc(size_t size, inf flags) flags:参数用来描述内存该如何分配。 void kfree(void *ptr)
18:内核空间和用户空间数据交互的函数:unsigned long copy_to_user(void __user *to, const void * from, unsigned long count)
unsigned long copy_from_user(void *to, void __user *from, unsigned long count)
19:至于实际的设备方法:read方法是从设备拷贝数据到用户空间
第四章:内核调试技术
1:printk_ratelimit()这个函数应当在你认为可能打印重复的消息之前被调用,如果该函数返回值非0,那么继续打印,否则将消息被扔掉,不会 打印。
2:vmstat 命令,实时查看内存使用情况的
3:/proc文件系统一个特殊的软件创建的文件系统,内核用来输出消息到外界。/proc文件下的每个文件都绑定到一个内核参数上。该文件系统在linux上应用非常广泛。如ps top等命令都是从该文件系统下提取的信息。
4:/proc文件系统的本来目的是:提供关于系统中运行的进程的信息
5:strace命令是一个有利的工具,显示所有的用户空间程序发出的系统调用。不仅显示系统调用,还以符号形式显示调用的参数和返回值。
6:strace命令(跟踪调试程序)从内核自身获取信息,跟踪信息常常用来作为应用程序开发者的故障报告。对内核程序员来说也是很重要的。
7:read系统调用一次最多只能获取4000字节
8:strace对于查明系统调用的错误时非常有用的,并且能够确切的说出那个系统调用的那个参数出发了错误。常常是应用程序中的perror调用不足够详细。
9:oops:内核崩溃是产生的消息(system panic) dereference:废弃的
10:sysrq魔术组合键,用来了解系统目前运行情况的.如果系统挂起或者在诊断一些和内核相关比较怪异的问题时,使用sysrq键时一个很重要的方式。
11:内核调试器和调试工具
1>:使用gdb来调试 2>:kdb内核调试器 3>:
文章评论(0条评论)
登录后参与讨论