outb,inb等I/Oport操作函数

功能

如 i386 。在差别 I/O 空间和内存空间的进程的 I/O 空间写入数据。

  • outb()   I/O 上写入 8 位数据 ( 1 字节 )。
  • outw() I/O 上写入 16 位数据 ( 2 字节 );
  • outl () I/O 上写入 32 位数据 ( 4 字节)。

原型

引用

#include <asm/io.h>

void
outb (unsigned
char
data,
unsigned short
port);

void
outw (unsigned
short
data,
unsigned short
port);

void
outl (unsigned
long
data,
unsigned short
port);

变量

  • port  I/O 地址。此处为虚拟地址
  • data 数据

在linux的驱动程序中,都会使用大量的outb、outw、inb、inw等等宏来訪问硬件或寄存器。

这些宏的定义都在对应处理器体系下的include/asm文件夹下的io.h中定义。追究下去。这些宏终于就是一个volatile变量的的赋值:

#define __arch_putb(v,a)      (*(volatile unsigned char *)(a) = (v))

#define __raw_writeb(v,a)     __arch_putb(v,a)

#define outb(v,p)                 __raw_writeb(v,__io(p))

在(*(volatile unsigned char *)(a) = (v))中,a是一个物理地址(实地址,多数是特殊功能寄存器地址)。

(volatile unsigned char *)对a进行类型转换,成为一个指向该地址指针,最后*(volatile unsigned char *)(a)引用该指针对该地址赋值v。这样就能够达到訪问底层硬件的目的了。

当读入数据时使用in(x),类似inb、inw、inl,參数与out(x)函数一致。

in、out都是对I/Oport进行操作。ioreadb、iowriteb等是对I/O内存操作。

(详见博客http://blog.csdn.net/haozhao_blog/article/details/24005323)

时间: 2024-10-10 17:34:02

outb,inb等I/Oport操作函数的相关文章

(二十四)linux新定时器:timefd及相关操作函数

timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景. 一,相关操作函数 #include <sys/timerfd.h> int timerfd_create(int clockid, int flags); int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itim

PHP:数组操作函数array_count_values()的实现

    PHP作为一门弱类型的脚本语言,其变量无需声明,即用即得,其数组更是与其他强类型语言相差巨大,比如PHP数组中的关联键和数值键,其中最有趣的莫过于关联键了,这是在C++或JAVA中无法见到的,而且PHP还提供诸多强大的数组操作函数,比如   array_values()//可以剥离数组中的关联键和数值键,或得有其元素的值所组成的数组 array_keys()//获得所有的关联键和数值键  利用这两个函数就可以非常方便简单的实现  array_count_values()函数  思路就是先

文件操作函数

open函数 原型: int open(const char *pathname,int flags); int open(const char *pathname,int flags,mode_t mode); flags 必需选项,必选其中之一 O_RDONLY(只读),O_WRONLY(只写),O_RDWR(读写) 可选: O_APPEND 使每次对文件进行写操作都追加到文件的尾端 O_CREAT 如果文件不存在,则创建它,要同时使用第三个参数指定新文件的权限 O_EXCL 查看文件是否存

C语言文件操作函数的编写

 编写文件操作的头文件 /************************************************************************** Copyright(C)    :2014-08-5 toto Filename       :file.h Author          :涂作权 Version         :V1.1 Date            :2014-08-05 Description     :文件操作的头文件 Others  

提权操作函数

DWORD AdjustProcessToken(HANDLE hProcess, LPCTSTR lpPrivilegeName) { HANDLE hToken; TOKEN_PRIVILEGES tp; tp.PrivilegeCount =1; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if(!OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES,&hToken)) { retu

Delphi中复制带有String的记录结构时不能使用Move之类的内存操作函数

请看下面的代码: program TestRecord; {$APPTYPE CONSOLE} uses  SysUtils,  Math; type  TRecordA = record    Name: string;  end; procedure RunTestRecord;var  R1, R2: TRecordA;begin  R1.Name := StringOfChar('A', RandomRange(64, 256) * 1024);  Move(R1, R2, SizeOf

PHP:常用PHP数组操作函数

php为我们提供了丰富的数组操作函数,用这些函数可以非常方便的实现我们所想实现的功能. 添加和删除数组元素 添加元素的方法 array_unshift(array array,mixed var [,mixed var...]) 在数组头添加元素,所有的数值键会被相应的修改,但关联键不会受到影响 array_push(array array,mixed var [,mixed var.....]) 在数组尾添加元素 删除数组元素的方法 array_shift(array array) 删除数组头

Oracle集合操作函数:union、intersect、minus

[转]Oracle集合操作函数:union.intersect.minus 集合操作符专门用于合并多条select 语句的结果,包括:UNION, UNION ALL, INTERSECT, MINUS.当使用集合操作符时,必须确保不同查询的列个数和数据类型匹配. 集合操作符具有以下注意事项: 集合操作符不适用于LOB.VARRAY和嵌套表列. UNION.INTERSECT.MINUS操作符不使用于 LONG列. 如果选择列表中包含有表达式或者函数,那么必须为表达式或者函数定义列别名. 1.U

Oracle 11g SQL fundamentals 03 -- 日期操作函数

1.Oracle日期在内部的表示是数值格式,精确度从世纪到秒. 2.默认的日期表示格式为DD-MON-RR  (不是YY) YY 与 RR 的区别: 3.日期操作函数 示例: NEXT_DAY的第二个参数也可以是数字,表示几天后的日期.LAST_DAY是求该日期所在月份的最后一天. ROUND('DD-11-2014','MONTH')是精确到月,‘日’1-15号算这个月的 ('01-11-2014'),超过15号算下个月的 ('01-12-2014'). ROUND('DD-MON-2014'