Linux 下IO端口编程访问

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

Linux 下IO端口编程访问

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

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

ioperm()

在 unistd.h 中声明。用来打开对IO端口的访问权限,要求程序执行时必须有root 权限。只可以打开0x00到0x3ff 这一地址段的IO端口。

ioperm( from, num, turn_on)

比如:

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

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

iopl()

如果需要访问比0x3ff更高的地址段,需要用iopl() 函数。

iopl(3) 表示打开对全部IO端口的访问权限。

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);

这四个函数和上面四个函数的功能基本类似,但是在访问完IO端口后会增加一个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() 函数,因为IO端口不支持这些功能。

开关 中断

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

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

Linux 下IO端口编程访问,布布扣,bubuko.com

时间: 2024-10-17 16:02:26

Linux 下IO端口编程访问的相关文章

linux 系统对IO端口和IO内存的管理

一.I/O端口       端口(port)是接口电路中能被CPU直接访问的寄存器的地址.几乎每一种外设都是通过读写设备上的寄存器来进行的.CPU通过这些地址即端口向接口电路中的寄存器发送命令,读取状态和传送数据.外设寄存器也称为“I/O端口”,通常包括:控制寄存器.状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址. 二.IO内存        例如,在PC上可以插上一块图形卡,有2MB的存储空间,甚至可能还带有ROM,其中装有可执行代码. 三.IO端口和IO内存的区分及联系 

Linux下的C编程实战

Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来, Linux操作系统在嵌入式系统领域的延伸也可谓是如日中天,许多版本的嵌入式Linux系统被开发出来,如ucLinux.RTLinux.ARM-Linux等等. 在嵌入式操作系统方面,Linux的地位是不容怀疑的,它开源.它包含TCP/IP协议栈.它易集成GUI. 鉴于Linux操作系统在服务器和嵌入式系统领

Linux下TCP网络编程与基于Windows下C#socket编程间通信

一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使socket处于被动的监听模式,并为该  socket  建立一个输入数据队列,将到达的服务器, 请求保存在此队列中,直到程序处理他们. Accept():让服务器接收客户的连接请求. Connect():客户端使用connect函数来配置 socket并与远端服务器建立一个 TCP 连接. Clos

Linux下TCP网络编程与基于Windows下C#socket编程之间通信

一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使socket处于被动的监听模式,并为该  socket  建立一个输入 数据队列,将到达的服务器, 请求保存在此队列中,直到程序处理他们. Accept():让服务器接收客户的连接请求. Connect():客户端使用connect函数来配置 socket并与远端服务器建立一个 TCP 连接. Clo

Linux 下的 UDP 编程

2019-10-14 关键字:C 语言的 UDP 编程与实例 UDP 连接是一种无连接的网络连接协议. Linux 下的 UDP 编程的函数接口与 TCP 差不了多远.在 UDP 通信模型中,也是以 C/S 模型来通信的. 服务端的函数调用流程主要有以下几个: 1.socket() 2.bind() 3.recvfrom() / sendto() 4.close() 客户端的函数调用流程主要有以下几个: 1.socket() 2.sendto() / recvfrom() 3.close() s

Linux下C++的编程——开偏介绍

C++是一个功能强大而又应用广泛的计算机语言,就应用领域而言,几乎无所不在,因为有操作系统的地方就会有C++的存在,热门程序而言,也就仅次于C和Java.而C与C++又有天然的血缘关系. 从事C++开发近两年,虽然开发的产品都是跨平台的,但个人直接接触到的编程工程还是更偏重于Windows平台(至少开发环境更多的是在Windows平台,还写过"带你玩转Visual Studio"系列的博文),而现在要自己独立地带领一个项目的开发,还是一个跨平台的项目,也就有必要到Linux下C++的编

Linux下C++的编程——开发环境搭建与第一个程序

上一篇文章Linux下C++的编程--开偏介绍中我们已经介绍了GUN.GCC.G++等一些重要的概念,现在应该开始动手实践了! 开发工具的安装 环境 Distributions版本:CentOS 6.7 Linux内核片:2.6.32-573.3.1.el6.i686 一般Linux安装完之后默认就已经安装了GCC(GNU Compiler Collection),你可以查看一下gcc和g++的版本号检查gcc和g++是否已经安装. [luowf@luoweifu ~]$ gcc -v gcc

LINUX下C语言编程基础

实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用gdb调试技术 6. 熟悉makefile基本原理及语法规范 7. 掌握静态库和动态库的生成 二.实验步骤 1. 快捷键 Ubuntu中: 2. vim VIM是一个非常好的文本编辑器,很多专业程序员使用VIM编辑代码,即使以后你不编写程序,只要跟文本打交道,都应该学学VIM,可以浏览参考一下普通人

Linux下C++的编程——GDB进行程序调试

GDB简介 我们在Linux下C++的编程--开偏介绍一文中已经简单介绍了GDB的功能,是类Unix系统的主要调试工具,可进行断点调试,跟踪程序,动态改变执行环境等功能. 从一个程序开始调试 下面我们就从一个程序开始讲解一下GDB的简单用法.假设我们有如下的程序: GDBTest1.cpp #include <iostream> int Accumulation(int n) { int result = 0; for(int i = 0; i < n; i ++) { result +