鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 操作系统维护 > Ubuntu > >

学习Unix操作系统参数的大行动

来源:互联网 作者:佚名 时间:2013-09-07 09:59
我们在使用Unix操作系统的时候,我们会经常用到一些符号,也许你还是对Unix操作系统不是很熟悉,这些就是Unix操作系统的参数,今天,我们就来学习下这方面的知识
  

我们在使用Unix操作系统的时候,我们会经常用到一些符号,也许你还是对Unix操作系统不是很熟悉,这些就是Unix操作系统的参数,今天,我们就来学习下这方面的知识。参数irq表示所要申请的硬件中断号。handler为向Unix操作系统登记的中断处理子 程序,中断产生时由Unix操作系统来调用,调用时所带参数irq为中断号,dev_id为申请时告诉系统的设备标识,regs为中断发生时寄存器内容。

device为设备名, 将会出现在/proc/interrupts文件里。flag是申请时的选项,它决定中断处理程序的一些特性,其中最重要的是中断处理程序是快速处理程序(flag里设置了SA_INTERRUPT)还是慢速处理程序(不设置SA_INTERRUPT),快速处理程序运行时,所有中断都被屏蔽,而慢速处理程序运行时,除了正在处理的中断外, 其它中断都没有被屏蔽。

在LINUX系统中,中断可以被不同的中断处理程序共享, 这要求每一个共享此中断的处理程序在申请中断时在flags里设置SA_SHIRQ, 这些处理程序之间以dev_id来区分。如果中断由某个处理程序独占,则dev_id 可以为NULL。request_irq返回0表示成功,返回-INVAL表示irq 15或 handler==NULL,返回-EBUSY表示中断已经被占用且不能共享。

作为Unix操作系统核心的一部分,设备驱动程序在申请和释放内存时不是调用malloc 和free,而代之以调用kmalloc和kfree,它们被定义为:参数len为希望申请的字节数,obj为要释放的内存指针。priority为分配内存操作的优先级,即在没有足够空闲内存时如何操作,一般用GFP_KERNEL。

与中断和内存不同,,使用一个没有申请的I/O端口不会使CPU产生异常,也就不会导致诸如“segmentation fault"一类的错误发生。任何进程都可以访问 任何一个I/O端口。此时系统无法保证对I/O端口的操作不会发生冲突,甚至会 因此而使Unix操作系统崩溃。因此,在使用I/O端口前,也应该检查此I/O端口是否已有 别的程序在使用,若没有,再把此端口标记为正在使用,在使用完以后释放它。

这样需要用到如下几个函数:

调用这些函数时的参数为:from表示所申请的I/O端口的起始地址; extent为所要申请的从from开始的端口数;name为设备名,将会出现在/proc/ioports文件里。check_region返回0表示I/O端口空闲,否则为正在被使用。

在申请了I/O端口之后,就可以如下几个函数来访问I/O端口:

其中inb_p和outb_p插入了一定的延时以适应某些慢的I/O端口。 在设备驱动程序里,一般都需要用到计时机制。在LINUX系统中,时钟是由 系统接管,设备驱动程序可以向系统申请时钟。与时钟有关的系统调用有:#include asm/param.h

struct timer_list的定义为:其中expires是要执行function的时间。Unix操作系统核心有一个全局变量JIFFS 表示当前时间,一般在调用add_timerjiffies=JIFFIES+num,表示在num个 系统最小时间间隔后执行function。Unix操作系统最小时间间隔与所用的硬件平台有关, 在核心里定义了常数HZ表示一秒内最小时间间隔的数目,则num*HZ表示num 秒。

Unix操作系统计时到预定时间就调用function,并把此子程序从定时队列里删除, 因此如果想要每隔一定时间间隔执行一次的话,就必须在function里再一次调 用add_timer。function的参数d即为timer里面的data项。

在设备驱动程序里,还可能会用到如下的一些Unix操作系统函数:这两个函数负责打开和关闭中断允许。

在用户程序调用read 、write时,因为进程的运行状态由用户态变为核心 态,地址空间也变为核心地址空间。而read、write中参数buf是指向用户程 序的私有地址空间的,所以不能直接访问,必须通过上述两个Unix操作系统函数来访问用 户程序的私有地址空间。memcpy_fromfs由用户程序地址空间往核心地址空间 复制,memcpy_tofs则反之。参数to为复制的目的指针,from为源指针,n 为要复制的字节数。

在Unix操作系统设备驱动程序里,可以调用printk来打印一些调试信息,用法与printf 类似。printk打印的信息不仅出现在屏幕上,同时还记录在文件syslog里。

网友评论
<