linux 从用户空间的 I/O 存取
刚刚描述的这些函数主要打算被设备驱动使用, 但它们也可从用户空间使用, 至少在 PC- 类 的计算机. GNU C 库在 <sys/io.h> 中定义它们. 下列条件应当应用来对于 inb 及其 友在用户空间代码中使用:
- 程序必须使用 -O 选项编译来强制扩展内联函数.
如果主机平台没有 ioperm 和 iopl 系统调用, 用户空间仍然可以存取 I/O 端口, 通过 使用 /dev/prot 设备文件. 注意, 但是, 这个文件的含义是非常平台特定的, 并且对任 何东西除了 PC 不可能有用.
技术上,
它必须有 CAP_SYS_RAWIO 能力, 但是在大部分当前系统中这是与作为 root 运行是同样的.
例子源码
misc-progs/inp.c 和 misc-progs/outp.c 是一个从命令行读写端口的小工具, 在用户空间. 它们希望被安装在多个名子下(例如,
inb, inw, 和 inl 并且操作字节, 字, 或者长端口依赖于用户调用哪个名子). 它们使用 ioperm 或者 iopl 在 x86 下, 在其他 平台是
/dev/port.
程序可以做成 setuid root, 如果你想过危险生活并且在不要求明确的权限的情况下使用 你的硬件. 但是,
请不要在产品系统上以 set-uid 安装它们; 它们是设计上的安全漏洞.
字串操作
除了单发地输入和输出操作,
一些处理器实现了特殊的指令来传送一系列字节, 字, 或者 长字 到和自一个单个 I/O 端口或者同样大小. 这是所谓的字串指令, 并且它们完成任务 比一个 C
语言循环能做的更快. 下列宏定义实现字串处理的概念或者通过使用一个单个 机器指令或者通过执行一个紧凑的循环, 如果目标处理器没有进行字串 I/O 的指令. 当
编译为 S390 平台时这些宏定义根本不定义. 这应当不是个移植性问题, 因为这个平台通 常不与其他平台共享设备驱动, 因为它的外设总线是不同的.
字串函数的原型是:
void insb(unsigned port, void *addr, unsigned long
count); void outsb(unsigned port, void *addr, unsigned long count);
读或写从内存地址 addr 开始的 count 字节.
数据读自或者写入单个 port 端口. void insw(unsigned port, void *addr, unsigned long count);
void outsw(unsigned port, void *addr, unsigned long
count);
读或写 16-位 值到一个单个
16-位 端口.
void insl(unsigned port, void *addr, unsigned long
count); void outsl(unsigned port, void *addr, unsigned long count);
读或写 32-位 值到一个单个
32-位 端口.
有件事要记住, 当使用字串函数时: 它们移动一个整齐的字节流到或自端口. 当端口和主 系统有不同的字节对齐规则,
结果可能是令人惊讶的. 使用 inw 读取一个端口交换这些 字节, 如果需要, 来使读取的值匹配主机字节序. 字串函数, 相反, 不进行这个交换.
暂停 I/O
一些平台
- 最有名的 i386 - 可能有问题当处理器试图太快传送数据到或自总线. 当处 理器对于外设总线被过度锁定时可能引起问题( 想一下 ISA )并且可能当设备单板太慢时
表现出来. 解决方法是插入一个小的延时在每个 I/O 指令后面, 如果跟随着另一个指令. 在 x86 上, 这个暂停是通过进行一个 outb 指令到端口
0x80 ( 正常地不是常常用到 ) 实现的, 或者通过忙等待. 细节见你的平台的 asm 子目录的 io.h 文件.
如果你的设备丢失一些数据,
或者如果你担心它可能丢失一些, 你可以使用暂停函数代替 正常的那些. 暂停函数正如前面列出的, 但是它们的名子以 _p 结尾; 它们称为 inb_p,
outb_p, 等等. 这些函数定义给大部分被支持的体系, 尽管它们常常扩展为与非暂停 I/O 同样的代码, 因为没有必要额外暂停, 如果体系使用一个合理的现代外设总线.
linux 从用户空间的 I/O 存取的更多相关文章
- 如何看待Linux操作系统的用户空间和内核空间
作为中央核心处理单元的CPU,除了生产工艺的不断革新进步外,在处理数据和响应速度方面也需要有权衡.稍有微机原理基础的人都知道Intel X86体系的CPU提供了四种特权模式ring0~ring3,其中 ...
- [转]五个Linux下用户空间的调试工具
有几个Linux下的用户空间调试工具和技术,它们用来分析用户空间的问题相当有用.它们是: 'print' 语句 查询 (/proc, /sys 等) 跟踪 (strace/ltrace) Valgri ...
- 在linux的用户空间操作gpio
1. 使能linux内核选项CONFIG_GPIO_SYSFS CONFIG_GPIO_SYSFS=y 2. 测试方法 2.1 关注/sys/class/gpio下的文件 --export/unexp ...
- Linux启动用户空间-init初始化进程
- linux 用户空间获得纳秒级时间ns
一.引言 我们在测试程序的性能的时候往往需要获得ns级的精确时间去衡量一个程序的性能,下面介绍下linux中用户空间获得ns级时间的方法 二.用户空间获得ns级时间 使用clock_gettime函数 ...
- linux 用户空间获得纳秒级时间ns【转】
转自:https://www.cnblogs.com/kekukele/p/3662816.html 一.引言 我们在测试程序的性能的时候往往需要获得ns级的精确时间去衡量一个程序的性能,下面介绍下l ...
- linux系统下,在用户空间应用程序中模拟发送系统键盘事件
Linux 有自己的 input 子系统,可以统一管理鼠标和键盘事件. 如果想模拟键盘事件,但是系统没有键盘设备该如何是好? 基于输入子系统实现的 input 可以方便的在用户空间模拟鼠标和键盘事件. ...
- linux 用户态和内核态以及进程上下文、中断上下文 内核空间用户空间理解
1.特权级 Intel x86架构的cpu一共有0-4四个特权级,0级最高,3级最低,ARM架构也有不同的特权级,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查.硬件已经提 ...
- 在Linux用户空间做内核空间做的事情
导读 我相信,Linux 最好也是最坏的事情,就是内核空间(kernel space)和用户空间(user space)之间的巨大差别.如果没有这个区别,Linux 可能也不会成为世界上影响力最大的操 ...
随机推荐
- Deserializing/Serializing SOAP Messages in C#
/// <summary> /// Converts a SOAP string to an object /// </summary> /// <typep ...
- 一键制作启动elasticsearch和kibana启动的脚本可执行程序
1.测试环境 测试环境: . windows10专业版 . elasticsearch6.5.4 . kibana6.5.4 2.启动的脚本run.py import os import time i ...
- [转] javascript核心
原文:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/ 对象 原型链 构造函数 执行上下文栈 执行上下文 变量对象 活动对象 作用域 ...
- js中小知识点
JavaScript 中 typeof 和 instanceof 常用来判断一个变量是否为空,或者是什么类型的.但它们之间还是有区别的: typeof typeof 是一个一元运算,放在一个运算数之前 ...
- Ubuntu里node命令无效解决方法
在ubuntu里用sudo apt-get install nodejs安装Node.js后, 会发现terminals里运行node命令(比如node –-version)时候会有No such f ...
- CoreData遇见iCloud的那些坑
尽管苹果把iCloud与CoreData之间的完美配合吹的天花乱坠,但在iOS7之前,想用iCloud同步CoreData数据简直就是噩梦,苹果自己也承认了之前的诸多bug和不稳定性,这让苹果不得不重 ...
- Python 3.x版本中的字符串
- 【git基本操作】总结
"git fetch GitLab: Your account has been blocked.fatal: Could not read from remote repository. ...
- nodeJs学习-06 模块化、系统模块、自定义模块、express框架
系统模块:http://nodejs.cn/api/events.html 自定义模块: require 请求:引入模块 module 模块:批量输出 exports 输出:单独输出 ...
- IO流实现文件及文件夹的复制
TestCopyDocuments.java package com.sxt.parc; /* * 复制文件夹 包含文本 视频 音频 用字节流 */ import java.io.BufferedIn ...