Chinaunix首页 | 论坛 | 博客
  • 博客访问: 137139
  • 博文数量: 36
  • 博客积分: 127
  • 博客等级: 入伍新兵
  • 技术积分: 185
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-05 00:06
文章分类

全部博文(36)

文章存档

2015年(1)

2014年(1)

2013年(3)

2012年(31)

我的朋友

分类: LINUX

2012-08-29 09:54:11

原文地址:LINUX IO CMOS PCI superIO 读写  作者: 追求存在

http://blog.chinaunix.net/u1/53151/showart_1004938.html

LINUX PCI IO内存读写

Linux的内核为我们提供了I/O端口分配的操作接口,但对PCI设备来讲,它的配置地址空间已经为其指定了I/O端口范围,不需要额外的分配操作。Linux内核
提供了如下一些访问I/O端口的内联函数:
    unsigned inb(unsigned port);
    void outb(unsigned char byte, unsigned port);
    unsigned inw(unsigned port);
    void outw(unsigned short word, unsigned port);
    unsigned inl(unsigned port);
    void outl(unsigned longword, unsigned port);

 

Linux下设置端口权限的系统调用有两个:iopermiopl

 

一、iopermiopl介绍。

1.ioperm

该系统调用的介绍参考了以下链接中的内容:

http://blog.chinaunix.net/u2/76419/showart_1404294.html

 

功能描述:

为调用进程设置I/O端口访问权能。ioperm的使用需要具有超级用户的权限,只有低端的[0-0x3ff] I/O端口可被设置,要想指定更多端口的权能,可使用iopl函数。这一调用只可用于i386平台

int ioperm(unsigned long from, unsigned long num, int turn_on);
     

参数:

from:起始端口地址。

num:需要修改权能的端口数。

turn_on:端口的新权能位。1为开启,0为关闭。


返回说明:

成功执行时,返回0。失败返回-1errno被设为以下的某个值

EINVAL:参数无效
EIO
:这一调用不被支持
EPERM
:调用进程权能不足。

 

2. iopl

功能描述:该调用用于修改当前进程的操作端口的权限。可以用于所有65536个端口的权限。因此,ioperm相当于该调用的子集。和ioperm一样,这一调用仅适用于i386平台。

 

用法:

#include

   int iopl(int level);

参数:

level:端口的权限级别。为3时可以读写端口。默认权能级别为0,用户空间不可读写。

返回说明:成功执行时,返回0。失败返回-1errno被设为以下的某个值

EINVALlevel值大于3
ENOSYS
:未实现该调用

EPERM:调用进程权能不足。

 

 

 

这里有一个问题值得注意:在2.4RH9)的内核上,当端口值大于0x3FF时,执行该程序则会报错:ioperm set error: Invalid argument。即IO端口的值设置有问题,超出了限制。但是在2.6内核下并没有报错,而且执行结果也符合程序既定的结果。但是man ioperm中仍然说明了0x3FF的限制。暂且存疑。

 

 

 

 **************************************************/

阅读(2322) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~