针对令人苦恼的iopl和outb做解答

这两天在研究看门狗时,总遇到这两个系统函数,所以自己下决心要写下来,一方面加深记忆,另一方面也是为了以后方便查看。

首先说一下iopl函数:
iopl
是linux系统函数,调用的头文件为 #include <sys/io.h>
函数主要功能介绍:
int iopl(int level);
iopl()更改调用进程的I/O特权级别,由级别中两个最不重要的位指定。
为了允许兼容8514的X服务器在Linux下运行,这个调用是必要的。由于这些X服务器需要访问所有65536 I/O端口,因此ioperm(2)调用是不够的。

除了授予不受限制的I/O端口访问权之外,在更高的I/O特权级别上运行还允许进程禁用中断。这很可能会导致系统崩溃,并且无法修复。
权限由fork(2)和execve(2)继承
正常进程的I/O特权级别为0。

这个调用主要针对i386架构。在许多其他体系结构上,它不存在,或者总是返回一个错误。

值得注意的是**: i386是32位版,x86-64是64位版,PPC是苹果电脑版**

返回值类型说明:

成功时,返回零。错误时,返回-1。

EINVAL 水平大于3
ENOSYS 此调用未实现
EPERM 调用进程没有足够的权限调用iopl();需要CAP_SYS_RAWIO功能将I/O特权级别提升到当前值之上。

注意:
iopl()是特定于linux的,不能移植到其他程序中去使用。

Libc5将其视为一个系统调用,并在<unistd.h>中有一个原型。Glibc1没有原型。Glibc2在<sys/io中有一个原型。和<sys/perm.h>。只能在i386上使用。

outb函数介绍
outb
系统调用中罗列函数有一下信息。
outb, outw, outl, outsb, outsw, outsl, inb, inw, inl, insb, insw, insl, outb_p, outw_p, outl_p, inb_p, inw_p, inl_p - port I/O
调用的函数头文件和参数信息如下:

void outb(unsigned char value, unsigned short int port);

*void insb(unsigned short int port, void addr, unsigned long int count);
insb主要是对称查看一下。

主要说明这一函数。

描述信息:
在申请了I/O端口区域之后,就可以放心地访问,Linux使用inb(p)、inw§、insb(p,d,l)、insw(p,d,l)、outb(v,p)、outw(v,p)、outl(v,p)、outsb(p,d,l)、outsl(p,d,l)等宏来访问I/O端口,他们在include/asm/io.h中进行定义。

宏中in表示从端口输入,out表示从输出到端口。

b表示访问字节,w表示访问字,l表示访问长整数,s表示流数据,如outw表示输出一个字。

参数p表示要访问的I/O端口号,v表示要输出的数值,d表示内存缓存起始地址,l表示输出输入的量。

它们主要是为内核使用而设计的,但是可以从用户空间使用。

你必须使用-O或-O2或类似的语言进行编译。这些函数被定义为内联宏,在没有启用优化的情况下不会被替换,这会在链接时导致未解析的引用。

你可以使用ioperm(2)或iopl(2)告诉内核允许用户空间应用程序访问相关的I/O端口。如果不这样做,应用程序将收到一个 seg‐mentation 的错。

outb()和friends是特定于硬件的。首先传递value参数,然后传递port参数,这与大多数DOS实现的顺序相反。

示例:
intb(p)表示从端口p输入一个字节。
outsw(p,d,l)表示输出从内存地址d开始的l个字到端口p

说明

这里获取的信息是linux 下,通过man outb 获取到的,是Linux man-pages项目3.53版本的一部分。有关信息的描述,以及关于报告bug的信息,可以在http://www.kernel.org/doc/man-pages/找到。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值