自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 资源 (1)
  • 收藏
  • 关注

原创 谁有SMI-S Provider的一些源码,能参考一下吗

我要用OpenPegasus根据SMI-S规范来写provider,不知道如何下手啊,求高手指点

2013-07-22 13:51:32 1427

原创 内核的数据类型

在讨论更高级的话题前,我们需要讨论一下可移植问题。现代版本的Linux内核的可移植性是非常好的,可以运行在许多不同的体系架构上。由于Linux的多平台特性,任何一个重要的驱动程序都应该是可移植的。与内核代码相关的核心问题是这些代码应该能够同时访问已知长度的数据项,并充分利用不同的处理器的能力。坚持使用严格的数据类型,并且使用-Wall -Wstrict-prototypes选项编译可以防止

2013-01-31 19:56:35 3575

原创 中断处理

尽管有些设备仅通过它们的I/O寄存器就可以得到控制,但现实中的大部分设备却要比这复杂一些。设备需要同外界打交道,但设备又总是比处理器慢,让处理器等等待外部事件的情况总是不能令人满意的,所以我们需要找一种方法可以让设备在产生某个事件时通知处理器。这种方法就是中断。一个“中断”仅仅是一个信号,当硬件需要处理器关注它时,就发送这个信号。Linux处理中断的方式很大程度上与它在用户空间处理信号是一

2013-01-31 15:53:49 1588

原创 与硬件通信

设备驱动程序是软件概念和硬件电路之间的一个抽象层,因此两方面都要讨论。到目前为止,我们已经讨论详细讨论了软件概念上的一些细节,现在讨论另一方面,介绍驱动程序在Linux上如何在保持可移植性的前提下访问I/O端口和I/O内存。我们在需要示例的场合会使用简单的数字I/O端口来讲解I/O指令,并使用普通的帧缓冲区显存来讲解内存映射I/O。I/O端口和I/O内存计算机对每种外设都是通过读写

2013-01-26 17:33:10 2108

原创 内存分配

到目前为止,我们已经使用过kmalloc和kfree来分配秋释放内存,但Linux内核为我们提供了更加丰富的内存分配原语集。本章我们将介绍设备驱动程序中使用内存的一些其他方法。kmalloc函数内幕除非被阻塞,否则这个函数可运行得很快不对所获取的内存空间清零,也就是分配给它的区域仍然保持着原有的数据它分配的区域在物理内存中也是连续的flags参数记住kmalloc的

2013-01-24 10:58:25 2275

原创 tasklet和工作队列

tasklet和定时器相关的另一个内核设施是taskled(小任务)机制。中断管理中大量使用了这种机制。task在很多方面类似内核定时器:它们始终在中断期间运行,始终会在调度它们的同一CPU上运行,而且都接收一个unsigned long参数,tasklet也会在“软件中断”上下文以原子模式执行。和内核同时器不同的是,我们不能要求tasklet在某个给定时间执行。软件中断是指打硬件

2013-01-22 16:00:37 1734

原创 内核定时器

内核定时器如果我们需要在将来的某个时间点调试执行某个动作,同时在该时间点到达之前不会阻塞当前里程,则可以使用内核定时器。内核定时器可以在未来的某个时间点(基于时间滴答)调度执行某个函数。如硬件无法产和中断,则可以周期性的轮询设备状态。一个内核定时器是一个数据结构struct timer_list,它告诉内核在用户定义的时间点使用用户定义的参数来执行一个用户定义的函数。其实现位于和ker

2013-01-21 20:57:56 1392

原创 时间、延迟及延缓操作

现实中的设备驱动程序除了必需的操作之外还要做更多工作,如定时、内存管理、硬件访问等,现在来看看内核是如何对时间进行处理的。关于时钟的一些说明:一台装有操作系统的计算机里一般有两个时间:硬件时钟和软件时钟。硬件时钟硬件时钟就是CMOS时钟,由小型电池供电,并且有精确的高频晶振来来提供节拍。当计算机断电时CMOS可以继续运行,这就是计计算机总知道正确的时期和时间的原因。硬件时钟的第

2013-01-20 17:05:47 2111

原创 其它高级字符驱动程序操作

异步通知尽管大多数时候阻塞和非阻塞型操作的组合及select方法可以有效地查询设备,但某些时候用这种技术处理效率就不高了。为了启用异步通知,用户程序必须执行两个步骤。首先,它们必须为文件指定一个“属主”进程,使用系统调用fcntl执行F_SETOWN时,属主进程的ID号就被保存到filp->f_owner中,这上步目的是为了让内核知道应该通知哪个进程。然后为了真正启用异步通知机制,用户程序

2013-01-18 18:38:41 725

原创 高级字符驱动程序操作——poll和select

poll和select使用非阻塞I/O的应用程序也经常使用poll、select和epoll系统调用。poll、select和epoll的功能本质上是一样的:都允许进程决定是否对一个或多个打开的文件做非阻塞的读取或写入(换句话说就是,确定是否可以在该文件描述符上做非阻塞的操作)。这些调用也会阻塞进程,直到给定的文件描述符集合中的任何一个可读取或可写入。因此,它们常常用于那些要使用多个输入或

2013-01-17 19:08:33 774

原创 高级字符驱动程序操作——阻塞型I/O

阻塞型I/O前面已经介绍了驱动程序的read和write方法。现在讨论另一个问题:如果驱动程序无法立即满足请求,该如何响应?当数据不可用时,用户可能调用read;或者进程试图写入数据,但因为输出缓冲区已满,设备还未准备好接受数据。调用进程通常不会关心这类问题,它们只会简单的调用read和write。因此在这种情况下,我们的驱动程序应该(默认)阻塞该进程,将其置入休眠状态直到请求可继续。

2013-01-17 10:34:27 664

原创 高级字符驱动程序操作——ioctl

ioctl除了读取和写入设备之外,大部分驱动程序还需要另外一种能力,即通过设备驱动程序执行各种类型的硬件控制。如:用户空间经常会请求设备锁门,弹出介质,改变波特率或者执行自破坏等。这些操作通常可通过ioctl方法支持,该方法实现了同名的系统调用。在用户空间,ioctl系统调用具有如下原型:int ioctl(int fd, unsigned long cmd, ...);原型中

2013-01-15 09:39:20 1666

原创 并发和竞态

由于现在的内核已经发展到同时处理更多事情的时代,支持对称多处理(symmetric multiprocessing, SMP),这极大的提高了内核编程的复杂性,因此设备驱动程序在开始设计时就要考虑并发因素,并对内核提供的并发管理设施要有坚实的理解。scull的缺陷if(!dptr->data[s_pos]){ dptr->data[s_pos] = kmalloc(quant

2013-01-13 14:40:36 2184

原创 内核编程调试技术(2)

调试系统故障即使采用了所有的监视和调试技术,有时驱动程序依然会有错误,这样的驱动程序在执行时就会产生故障。注意,“故障”并不意味着“崩溃”,故障通常会导致当前进程崩溃,而系统仍会继续运行,如果在进程上下文之外发生了故障,或是系统的关键部分被损害时,系统才有可能panic驱动程序有问题通常会导致正在使用驱动程序的那个进程突然终止。唯一不能恢复的就是在进程上下文分配的一些内存可能会丢失

2013-01-11 16:47:17 913

原创 内核编程调试技术(1)

通过打印调试(printk)printk和printf不差别之一就是它通过日志级别,可以让printk根据消息的严重程度对消息进行分类printk(KERN_DEBUG "here i am: %s:%i\n", __FILE__, __LINE__);printk(KERN_CRIT "I'M TRASHED; giving up on %p\n", ptr);在头文件中定义

2013-01-10 10:34:43 738

原创 scull字符设备

scull通过struct scull_dev的结构来表示每个设备,该结构的定义如下:struct scull_dev {    struct scull_qset *data;    //指向第一个量子集的指针    int quantum;                //当前的量子大小    int qset;                   //当前的数组大小

2013-01-04 23:39:15 435

原创 字符设备

主设备号和次设备号对字符设备的访问是通过文件系统内的设备名称(设备文件)进行的,位于/dev目录下一个设备包含主设备号和次设备号,主设备号标识设备对应的驱动程序,次设备号确定设备文件所指的设备个人理解:一个能正常工作的设备包含设备这个硬件和能使设备工作的驱动程序,次设备号就是标识这个硬件的, 而主设备号是标识这个驱动程序的,主设备号和次设备号唯一确定这个能正常工作的设备。访问/de

2013-01-04 23:33:45 494

原创 如何建立内核树

系统为CentOS Linux release 6.0,内核版本为2.6.32-71.el6.i686。 1、下载源代码2、解压解压后进入linux-2.6.323、配置内核第一次编译的话,有必要将内核源代码树置于一种完整和一致的状态,因此我们使用命令make mrproper它将清除目录下所有配置文件和先前生成核心时产生的.o文件make menu

2012-12-13 18:52:31 692

转载 字符驱动

#include #include #include #include #include #include #include #include #include #include #include //设备驱动应该包含的头文件#define MYMODE_SIZE 0x1000#define MYMODE_MAJOR 240#define M

2012-02-09 22:39:27 488

计算机组成原理第二版

此课件有十章,系统全面的介绍了计算机组成原理这一门课程!

2009-09-09

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除