21,597
社区成员
发帖
与我相关
我的任务
分享
iopl.c
该程序可以操作所有65536个端口。
该程序首先设置0x3FF端口的读写权限,然后读出原先的值,然后将原值的LSB翻转并写回端口,并在此读取端口值。
代码如下:
/*Godbach. Dec 18, 2008
Description:This function is used to test iopl()*/
#include <stdio.h>
#include <unistd.h>
#include <sys/io.h>
#define PORT_ADDR 0x3FF
int main(void)
{
int ret;
char port_val;
/*set r/w permission of all 65536 ports*/
ret = iopl(3);
if(ret < 0){
perror("iopl set error");
return 0;
}
port_val = inb(PORT_ADDR);
printf("Original value of port 0x%x is : %.2x\n", PORT_ADDR, port_val);
/*reverse the least significant bit */
outb(port_val^0x01, PORT_ADDR);
port_val = inb(PORT_ADDR);
printf("Current value of port 0x%x is : %.2x\n", PORT_ADDR, port_val);
/*set r/w permission of all 65536 ports*/
ret = iopl(0);
if(ret < 0){
perror("iopl set error");
return 0;
}
return 0;
}
程序执行结果:
[root@linux misc-progs]# ./a.out
Original value of port 0x3ff is : 01
Current value of port 0x3ff is : 00
[root@linux misc-progs]# ./a.out
Original value of port 0x3ff is : 00
Current value of port 0x3ff is : 01
该程序执行几次,将进行几次的LSB翻转。
注:这里再次使用0x3FF端口,主要个人对端口的理解还不很深入,其他高于0x3FF的端口进行测试的时候,没有得到既定的结果。这里权且还使用这个端口,借此对iopl的用法熟悉一下即可。至于在真正使用中,如果系统的某个端口是可以进行配置的,那么执行这个程序应该是可以得到既定结果的。