Linux 下设置端口权限的系统调用有两个: ioperm 和 iopl 。

一、 ioperm 和 iopl 介绍。

1.ioperm

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

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

功能描述:

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

用法:

#include /* for libc5 */

#include /* for glibc */

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

参数:

from :起始端口地址。

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

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

返回说明:

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

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

2. iopl

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

用法:

#include

int iopl(int level);

参数:

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

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

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

EPERM :调用进程权能不足。

二、程序示例

1. ioperm.c

操作低于 0x3FF 的端口

该程序首先设置 0x3FF 端口的读写权限,然后读出原先的值,然后将原值的 LSB 翻转并写回端口,并在此读取端口值。

/*Godbach. Dec 18, 2008

Description:This function is used to test ioperm()*/

#include

#include

#include

#define PORT_ADDR 0x3FF

int main(void)

{

int ret;

char port_val;

/*set r/w permission of port_addr on, only one port*/

ret = ioperm(PORT_ADDR, 1, 1);

if(ret < 0){

perror("ioperm 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 PORT_ADDR off, only one port*/

ret = ioperm(PORT_ADDR, 1, 0);

if(ret < 0){

perror("ioperm set error");

return 0;

}

return 0;

}

程序执行的结果是:

[root@localhost misc-progs]# ./a.out

Original value of port 0x3ff is : 00

Current value of port 0x3ff is : 01

[root@localhost misc-progs]# ./a.out

Original value of port 0x3ff is : 01

Current value of port 0x3ff is : 00

该程序执行几次,将进行几次的 LSB 翻转。

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

2. 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 ofall 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 的用法熟悉一下即可。至于在真正使用中,如果系统的某个端口是可以进行配置的,那么执行这个程序应该是可以得到既定结果的。

区别:

必须用ioperm或iopl来获取对端口进行I/O操作的权限。ioperm用来获取对指定端口的

操作权限,而iopl用来获取对整个I/O空间的操作权限。这两个函数都是Intel平台提供的。

linux 开启端口 权限,Linux 下设置端口权限相关推荐

  1. 怎么设置linux端口权限,Linux下设置端口权限的系统调用—ioperm和iopl

    Linux 下设置端口权限的系统调用有两个: ioperm 和 iopl . 一. ioperm 和 iopl 介绍. 1.ioperm 该系统调用的介绍参考了以下链接中的内容: http://blo ...

  2. 远程连接linux的mysql_【Linux开启mysql远程连接的设置步骤】 mysql开启远程连接

    相关热词搜索:Linux开启mysql远程连接的设置步骤,linux mysql 远程连接,linux连接mysql数据库, MySQL默认root用户只能本地访问,不能远程连接管理mysql数据库, ...

  3. gulp修改服务器端口,在gulp-nodemon中设置端口有什么用处?

    我使用gulp-nodemon,因为它最明显的实用程序.在gulp-nodemon中设置端口有什么用处? Nodemon是一个实用程序,它将监视源中的所有更改 并自动重新启动服务器. 但是我不理解一种 ...

  4. Win11如何设置用户权限?Win11设置用户权限的方法

    我们有时候在使用电脑的时候,是需要一些权限才能进行操作的,因为不同的用户权限可以做到不同的操作,不过很多升级到Win11系统的小伙伴并不清楚用户权限要如何设置,那么应该如何操作呢?下面就和小编一起来看 ...

  5. linux开启80服务器,Linux服务器之IPTABLES开启80端口

    在服务器部署不同的程序时,总会遇到各种各样的问题,其中本文介绍的iptables开放80端口也是在服务器部署常见的问题之一.常见情况有以下两种: 情况一:在linux服务器部署好web运行环境和程序时 ...

  6. Linux下设置文件权限

    文件权限示意图: 第一步:在终端创建用户 增加用户 useradd 用户名 设置密码 passwd 用户名 通过上述两条命令创建a1,a2两个用户. 第二步:在根目录使用管理员账号创建一个文件 在使用 ...

  7. 红帽子linux开启telnet,RedHat linux 9下配置telnet服务 | 技术部落

    一.安装telnet软件包(通常要两个) 1. telnet-client (或 telnet),这个软件包提供的是 telnet 客户端程序: 2. telnet-server ,这个软件包提供的是 ...

  8. suse linux 开启telnet,SuSE Telnet的设置

    Telnet服务是每个管理员都需要学习的内容.那么前面我们对Ubuntu Linux telnet的安装设置过程进行了详述.这里我们再来介绍一下SuSE Telnet服务的安装和配置.希望对大家有所帮 ...

  9. vbox 设置linux共享文件夹,Windows 7下设置VirtualBox中Linux共享文件夹

    我自己的环境是: 在Windows 7上安装了VirtualBox,然后在VirtualBox中虚拟了一个Ubuntu. 为了实现在ubuntu中访问winows中的一些目录,而且还起到一种交换文件的 ...

最新文章

  1. WaitForSingleObject和WaitForMultipleObjects用法
  2. TinyMind邀你写诗!100小时GPU,等你来领取!
  3. Coing-二叉树(bibary Tree)
  4. 13.PHP中循环结构之foreach循环语句(任务一)
  5. unity3d 游戏对象消失三种方法的区别(enabled/Destroy/active)
  6. python模糊查询_python实现字符串模糊匹配
  7. VK Cup 2017 - Round 2
  8. 2.1 linux C 进程与多线程入门--(1)进程和程序的区别
  9. python绘制组织结构图_二、Python的程序组织结构
  10. 重磅开源!新型VOLO打破多项记录!
  11. Linux安装MYSQL5.7教程(一次成功)
  12. 湖南省中职学业水平考试复习试题(计算机三)
  13. MobileNet-SSD网络解析
  14. TP5+阿里云OSS上传文件第三节,实现淘宝上传商品图片
  15. Bootstrap 栅栏系统
  16. element-UI设置背景色和边框色
  17. python判断手机号运营商_基于python的-使用正则表达式验证手机号并匹配运营商和所述地域...
  18. android 中存储文件所在位置
  19. IT人生之猎人和猎狗
  20. 微信api调用限制,45009 reach max api daily quota limit 解决方法

热门文章

  1. 【蓝桥杯嵌入式】应赛技巧①多屏切换
  2. 学习phthon的第三天
  3. 中关村示范区两项人才特区政策落地
  4. SQL注入之sqlmap入门教程
  5. 2. 感知机 Perceptron
  6. 2022年06月数据库排行榜
  7. ROS:Dynamic Reconfigure 动态参数调节
  8. dumping计算机英语,计算机与网络英语词汇(T3)
  9. 程序员、架构师、技术经理、技术总监和CTO都是干什么的?
  10. 【基于物联网的智能草莓种植系统的设计与实现系列教程】8.项目整体验证(课程设计、毕设项目、树莓派、yolov5、物联网)