曾经写的一篇笔记。偶尔翻出来了,放在这里做个纪念

Linux 下IOport编程訪问

这里记录的方法是在用户态訪问IOport,不涉及驱动程序的编写。

首先要包括头文件 /usr/include/asm/io.h

ioperm()

在 unistd.h 中声明。

用来打开对IOport的訪问权限,要求程序运行时必须有root 权限。仅仅能够打开0x00到0x3ff 这一地址段的IOport。

ioperm( from, num, turn_on)

比方:

#include<asm/io.h>
#include<unistd.h>
ioperm( 0x300, 5, 1);

表示从0x300 地址起的连续5个IO地址的訪问权限被打开。

iopl()

假设须要訪问比0x3ff更高的地址段。须要用iopl() 函数。

iopl(3) 表示打开对所有IOport的訪问权限。

IO 读写操作

inb(port);
inw(port);
outb(value, port);
outw(value, port);

对IO端口的读写大约用时1us。须要注意的是outb 函数与 turbo C 中的 outportb 函数的參数的顺序是反的,不要搞错。

inb_p(port);
inw_p(port);
outb_p(value, port);
outw_p(value, port);

这四个函数和上面四个函数的功能基本类似,可是在訪问完IOport后会添加一个1us左右的延时。

假设定义了REALLY_SLOW_IO这个宏。则延时约4us。

#define REALLY_SLOW_IO 1
#include<asm/io.h>
inb_p(port);

/dev/port

第二种訪问IO端口的方法是通过对/dev/port 设备文件来訪问。

这样的方法不须要有root 权限,仅仅有有对/dev/port的訪问权限即可。

訪问起来就像普通的文件訪问一样。 先 lseek(), 然后read()、 write() 函数。

可是不能使用 select() 函数和 poll() 函数。由于IOport不支持这些功能。

开关 中断

iopl(3) 打开訪问权限后能够通过插入汇编语句的方式开关中断。

asm(“cli”); //关中断
asm(“sti”); //开中断

Linux 下IOport编程訪问的更多相关文章

  1. linux 下 poll 编程

    poll 与 select 很类似,都是对描述符进行遍历,查看是否有描述符就绪.如果有就返回就绪文件描述符的个数将.poll 函数如下: #include <poll.h> int pol ...

  2. Linux下Socket编程的端口问题( Bind error: Address already in use )

    Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误 ...

  3. linux下socket编程实例

    linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...

  4. Linux 下shell 编程学习脚手架

    linux body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-t ...

  5. linux下libnet编程 亲自测试可用

    linux下libnet编程 亲自测试可用 亲自测试  如果build包的时候 只要把类型改了 就能改成相应的协议. 0x0800 ip 0x0806 arp 0x86DD    IPv6 0x86e ...

  6. Linux下socket编程基本知识

    本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数. 本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观. Linu ...

  7. Linux下的编程实战【转】

    一篇比较不错的文章, 降到了 makefile make , gcc编译器,GDB调试器, Linux文件系统,Linux文件API,.C语言库函数(C库函数的文件操作实际上是独立于具体的操作系统平台 ...

  8. linux下socket编程

    相关结构 //下边这两个结构定义在<sys/types.h>里 //一般的地址结构,只能用于覆盖(把其他地址转换为此类型),且只能引用该地址的sa_family字段 struct sock ...

  9. Linux下串口编程【转】

    本文转载自:http://blog.csdn.net/w282529350/article/details/7378388 /************声明:本人只是见到这篇文章对我帮助很大才转载的,但 ...

随机推荐

  1. 基于Visual C++2013拆解世界五百强面试题--题17-程序结果分析1

    分析程序结果,分析过程我们就写在程序注释里面. 写出下列代码的输出内容 #include <stdio.h> int inc(int a) { return (++a); } int mu ...

  2. BZOJ 2761 不重复数字 (Hash)

    题解:直接使用STL中的hash去重即可 #include <cstdio> #include <map> using namespace std; int ans[50010 ...

  3. C++模板:读入优化

    int scan(int &x){ while(c=getchar(),c<'0'||c>'9');x=c-'0'; while(c=getchar(),c>='0'& ...

  4. hpu校赛--雪人的高度(离散化线段树)

    1721: 感恩节KK专场——雪人的高度 时间限制: 1 Sec  内存限制: 128 MB 提交: 81  解决: 35 [提交][状态][讨论版] 题目描述 大雪过后,KK决定在春秋大道的某些区间 ...

  5. openstack之cinder

    一.cinder概述: 1.F版之前,并没有cinder,对应的组件为nova-volume:以Rest API的形式提供服务 2.cinder目标: 减少nova的复杂性,降低nova的负载,支持多 ...

  6. 初始Android-配置环境

    最近闲来无事自学了一下Android,今天没事想整理一下思绪,简单的介绍一下我自己对环境配置的认识,仅供参考,欢迎提出意见. 1.首先打开Eclipse,然后安装ADT,准备好ADTjar包或者zip ...

  7. setInterval(code, time)中code传递参数办法

    1.使用setInterval的场景 有时我们需要隔一定的时间执行一个方法,这时就会用到setInterval,但是由于这个方法是浏览器模拟出的Timer线程,在调用我们方法时不能为其传递参数. 2. ...

  8. python3基本框架

  9. Java疯狂讲义(四)

  10. 转: 让html5标签在ie8及以下的被正确解析的解决方案

    最近仿的几个主题中,有几个是采用html5语法制作的,html5嘛,以后必然大势所趋,但是现有的很多浏览器并不支持这种新的标准. 而我制作网站习惯用的是chrome浏览器的,当然不存在不兼容问题了. ...