linux系统中IORESOURCE与select函数的解决方案

简介: linux系统中IORESOURCE与select函数的解决方案

33b55192614a499eab883056204acab3.png


第一:IORESOURCE_IO和IORESOURCE_MEM


内核中有很多资源,但属于IO资源的有:

#define IORESOURCE_IO             0x00000100      /* Resource type */

#define IORESOURCE_MEM        0x00000200

#define IORESOURCE_IRQ          0x00000400

#define IORESOURCE_DMA         0x00000800

1、本文我主要研究IORESOURCE_IO IORESOURCE_MEM,及地址空间的管理,涉及的文件只有kernel/resource.c.

这两种资源本质上都是一段地址空间. 只是类型不一样

IORESOURCE_IO 指的是IO地址空间,这个空间从kernel编程上来看,只能通过专门的接口函数才能访问.硬件层面上,cpu需要用特殊指令才能访问或需要用特殊访问方式才能访问,不能直接用指针来寻址.在PC机上,其指的就是PCI/CPU IO address space.在嵌入式中,基本上没有io address space.

2、IORESOURCE_MEM 指的是属于外设或者用于和设备通讯的支持直接寻址的地址空间.PC机上,主板上北桥上连的内存都是交给kernel直接管理,或者都是用于软件执行,所以这部分内存不属于IORESOURCE_MEM, IORESOURCE_MEM主要是指PCI设备的 memory address space. 但在嵌入式上, 主板上的sdram一般是设备与cpu共享的. 故交给kernel直接管理的内存只是一部分.余下的内存以及寄存器空间都作为IORESOURCE_MEM来管理.

3、 只所以需要管理,是因为像PCI总路线设备的这些地址空间是设备向系统申请的,故是可配置的,并且设备并身可能热插拨或更换,故其变成一种可分配的资源. 故内核用算法来管理分配与释放操作,防止冲突和便于查询维护.但实际PC中,BIOS一般会做分配操作,内核需要是把分配结果添加进来,故提供了注册(或者叫做添加)接口. 在嵌入式系统中,外设的地址也通常是固定的,只需要添加即可.

这两种资源,内核采用同样的管理算法--二叉树.相当于内核维护两个独立的二叉树. 按地址基地址与地址长度范围作为管理数据.可以添加,分配,释放节点.分配过程中可以避 免空间冲突,添加时可以识别空间冲突.根节点在kernel/resource.c中以全局变量方式定义.根节点用于限制地址空间的范围.


第二:select函数使用方法问题


函数原型:int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);

参数解释:

maxfdp——传入参数,集合中所有文件描述符的范围,即最大文件描述符值+1

readfds——传入传出参数,select调用时传入要监听的可读文件描述符集合,select返回时传出发生可读事件的文件描述符集合

writefds——传入传出参数,select调用时传入要监听的可写文件描述符集合,select返回时传出发生可写事件的文件描述符集合

errorfds——传出参数,select返回时传出发生事件(包括可读和可写)中异常事件的文件描述符集合

timeout——传入参数,设置select阻塞的时间。若设置为NULL,则select一直阻塞直到有事件发生;

若设置为0,则select为非阻塞模式,执行后立即返回;

若设置为一个大于0的数,即select的阻塞时间,若阻塞时间内有事件发生就返回,否则时间到了立即返回

fd_set是自定义的一个数据结构,可看作一个集合,存放可读、可写或异常事件的文件描述符。fd_set集合通常有以下四个宏来操作:

void FD_ZERO(fd_set *fdset);  //清空fdset中所有文件描述符

void FD_SET(int fd,fd_set *fdset);  //添加文件描述符fd到集合fdset中

void FD_CLR(int fd,fd_set *fdset); //将文件描述符fd从集合fdset中去除

int FD_ISSET(int fd,fd_set *fdset);  //判断文件描述符fd是否在集合fdset中

select工作原理:传入要监听的文件描述符集合(可读、可写或异常)开始监听,select处于阻塞状态,当有事件发生或设置的等待时间timeout到了就会返回,返回之前自动去除集合中无事件发生的文件描述符,返回时传出有事件发生的文件描述符集合。但select传出的集合并没有告诉用户集合中包括哪几个就绪的文件描述符,需要用户后续进行遍历操作。


select的优点:

(1)select的可移植性较好,可以跨平台。

(2)select可设置的监听事件timeout精度更好,可精确到微秒,而poll为毫秒


select的缺点:

(1)select支持的文件描述符数量上限为1024,不能根据用户需求进行更改;

(2)select每次调用时都要将文件描述符集合从用户态拷贝到内核态,开销较大;

(3)select返回的就绪文件描述符集合,需要用户循环遍历所监听的所有文件描述符是否在该集合中,当监听描述符数量很大时效率较低。

目录
相关文章
|
1天前
|
设计模式 Unix Linux
Linux系统命令技巧
Linux系统命令技巧
12 3
|
1天前
|
Linux Shell
Linux系统
是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与之前的DOS命令类似。linux命令在系统中有两种类型:内置Shell命令和Linux命令。
|
2天前
|
Linux Shell
Linux系统文件默认权限
Linux系统文件默认权限
13 2
|
1天前
|
监控 Linux 测试技术
Linux系统命令与网络,磁盘和日志监控总结
Linux系统命令与网络,磁盘和日志监控总结
11 0
|
1天前
|
监控 Linux 测试技术
Linux系统命令与网络,磁盘和日志监控三
Linux系统命令与网络,磁盘和日志监控三
8 0
|
2月前
|
Linux
Linux0.11 文件打开open函数(五)
Linux0.11 文件打开open函数(五)
40 0
|
5月前
|
Linux 开发者
Linux文件编程(open read write close函数)
通过这些函数,开发者可以在Linux环境下进行文件的读取、写入和管理。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
157 4
|
5月前
|
存储 Linux
Linux文件编程(open read write close函数)
Linux文件编程(open read write close函数)
205 0
|
Linux
Linux系统调用二、open()函数与close()函数介绍
Linux系统调用二、open()函数与close()函数介绍
355 0
Linux系统调用二、open()函数与close()函数介绍
|
Linux
Linux系统中利用open函数多次打开同一个文件操作方法
大家好。 今天的话主要和大家聊一聊,在Linux系统中如果一个文件被打开多次会出现什么情况。
641 0
Linux系统中利用open函数多次打开同一个文件操作方法