- 浏览: 865973 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (280)
- java相关 (29)
- linux系统 (55)
- ipsec (0)
- ssl (3)
- 信息安全 (13)
- web相关 (35)
- windows (9)
- c,c++ (14)
- log4j (3)
- hibernate (8)
- sqlite (1)
- 程序人生 (2)
- js (2)
- 生活点滴 (3)
- 网络相关 (14)
- 问题积累 (15)
- 数据库相关 (27)
- 软件测试 (2)
- PKI相关 (2)
- 程序设计 (7)
- 犄角旮旯 (0)
- 杂七杂八 (0)
- 硬件相关 (14)
- 防火墙 (2)
- 电子商务 (2)
- 多媒体相关 (1)
- 内存管理 (4)
- 面向对象 (1)
- csp (1)
- 驱动开发 (3)
- 移动开发 (2)
- openssl多线程实例 (1)
最新评论
-
xiaoyao3857:
博主很有探索精神嘛,学习了
Linux主机名Hostname详解 -
hiskyrisa:
言简意赅,好文章。
Flex是什么 -
layznet:
犯了类似错误。使用的是derby数据库。driverClass ...
java.sql.SQLException: No suitable driver -
idision:
你好,文章有一句createSubjectKeyId(keyT ...
bouncycastle 产生证书 -
zheng12tian:
代码有全的不?只贴一部分,,,,
在LOG4J中把日志写入远程数据库
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 <unistd.h> /* for libc5 */
#include <sys/io.h> /* 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 <sys/io.h>
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 <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 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 <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 的用法熟悉一下即可。至于在真正使用中,如果系统的某个端口是可以进行配置的,那么执行这个程序应该是可以得到既定结果的。
区别:
必须用ioperm或iopl来获取对端口进行I/O操作的权限。ioperm用来获取对指定端口的
操作权限,而iopl用来获取对整个I/O空间的操作权限。这两个函数都是Intel平台提供的。
发表评论
-
Linux c的多线程编程实例
2011-07-19 17:28 1974通过创建两个线程来实现对一个数的递加。或许这个实例没有实际运用 ... -
linux下进程的最大线程数、进程最大数、进程打开的文件数
2011-06-22 17:35 1948linux 系统中单个进程的 ... -
Linux中dos2unix的批量转换命令
2011-01-05 10:31 6992在Linux中将DOS 格式转换为Unix格式的文件可以使用d ... -
linux双网关双线路网络设置
2010-08-03 19:10 2012由于电信和网通之间互联互通 的问题,很多 ... -
syslog-ng学习心得之二
2010-07-06 08:58 2444在[url]http://coolerfeng.blog.51 ... -
syslog-ng学习心得之一
2010-07-06 08:58 2746转载一篇syslog-ng的文章的,本来是想打算自己写一篇 ... -
Linux用户进程是如何释放内存
2009-12-25 17:16 2062Linux进程使用内存的基本流程: 见图1 从 ... -
Linux内存使用详解
2009-12-25 16:56 2378一提到内存管理,我们 ... -
linux下查看内存使用情况
2009-12-25 14:56 1994在Linux下查看内存我们 ... -
Linux编程C++内存管理之内存分配详解
2009-12-21 21:33 1762程序员们经常编写内存 ... -
内核模块调试方法
2009-11-17 11:23 2596对 于任何一位内核代 ... -
Linux操作系统下以太网卡的安装及配置
2009-11-11 17:18 1684Linux操作系统以其 独有的开放性、稳定性、高 ... -
跟我一起写 Makefile(3)
2009-11-03 14:38 638“-s” “--silent” “--quiet” 在命 ... -
跟我一起写 Makefile(2)
2009-11-03 14:35 961书写命令 ———— 每 ... -
跟我一起写 Makefile(1)
2009-11-03 14:32 984陈皓 (CSDN) 概述 — ... -
CC与GCC的区别概括介绍
2009-11-03 14:29 1462从名字上看,老的unix系统 的CC程序叫做C Comp ... -
linux内核模块管理命令
2009-10-30 10:54 17151. lsmod 列出已经加载的内核模块 lsmo ... -
分区修复软件Testdisk 安装使用
2009-08-26 14:23 4931linux下超帅的分区表修复软件.以前用过n多的window ... -
Linux下的分区修复软件Testdisk
2009-08-26 10:40 1863好了,这个软件叫testdisk.很帅的。。 如果你是使 ... -
Linux分区数据恢复
2009-08-26 10:18 1447公司的一台redhat机器启动不了了,是由于多次非正常关机造成 ...
相关推荐
总结而言,Linux下I/O端口编程的核心在于理解并正确应用内核提供的API,同时遵循必要的权限管理和延迟优化策略。通过上述步骤,开发者能够在保证系统稳定性的前提下,高效地控制和访问外部硬件资源。
在软件层面上,Linux提供了一种更加安全和灵活的I/O端口管理方式,即通过I/O端口映射和权限控制。内核会维护一个I/O端口权限表,限制哪些进程可以访问特定的端口。进程必须具有CAP_SYS_RAWIO权限才能执行I/O端口操作...
- **ioperm()**/**iopl()**:管理端口I/O权限。 - **quotactl()**:控制磁盘配额。 这些系统调用构成了Linux操作系统的核心功能,允许开发者直接与硬件交互,管理进程,控制文件系统,以及执行各种系统级别的任务...
`uselib()`选择使用哪个库,`ioperm()`和`iopl()`管理I/O端口权限,`outb()`等低级I/O函数用于直接硬件交互。 这个系统调用列表不仅涵盖了基础操作,还包括了一些高级特性,对于深入理解和优化Linux应用程序的性能...
### Linux I/O端口编程深度解析 ...总之,Linux下的I/O端口编程涉及权限管理、宏和函数的正确使用,以及对硬件特性的深入了解。熟练掌握这些技能,对于开发高性能和高可靠性的Linux应用程序至关重要。
- **参数**: 需要指定端口号范围和权限等级。 **8. outb 低级端口操作** - **功能**: `outb` 用于进行低级别的I/O端口操作。 - **参数**: 需要提供端口号和要发送的数据。 **9. reboot 重新启动** - **功能**:...
但是,通过特定的内核功能和权限设置,可以实现对I/O端口的精细控制。 首先,要获得I/O端口的访问权限,程序必须以超级用户(root)权限运行。这是因为Linux内核默认不允许用户程序直接操作I/O端口,以保护系统安全...
Linux I/O 端口编程主要涉及在C语言环境下如何与硬件进行低级别的通信,包括读写I/O端口、管理权限以及处理中断等。在Linux系统中,这些操作通常是用在驱动程序开发或者需要直接控制硬件的特殊应用中。 在C语言下...
《I-O端口编程》章节主要讲解了在Linux环境下如何使用C语言进行I/O端口编程,涵盖了硬件中断、内存访问以及I/O端口的存取等关键概念。以下是详细的知识点解析: 1. **I/O端口存取**: - 存取I/O端口的函数和宏定义...
- **`ioperm` 设置端口I/O权限**: 设置端口权限。 - **`iopl` 改变进程I/O权限级别**: 改变端口权限。 - **`outb` 低级端口操作**: 进行低级别的I/O端口操作。 - **`reboot` 重新启动**: 重启系统。 - **`swapon` ...