|
另外这个 iopl / ioperm 之类的操作必须是 x86 系列的 cpu 才行 ...
- iopl.c
- 该程序可以操作所有65536个端口。
- 该程序首先设置0x3FF端口的读写权限,然后读出原先的值,然后将原值的LSB翻转并写回端口,并在此读取端口值。
- 代码如下:
- /*Godbach. Dec 18, 2008
- Description:This function is used to test iopl()*/
- #include
- #include
- #include
-
- #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的用法熟悉一下即可。至于在真正使用中,如果系统的某个端口是可以进行配置的,那么执行这个程序应该是可以得到既定结果的。
复制代码 |
|