linux内核 访问外设-Linux驱动中访问外设端口的outb为什么不是访问内存空间

问题描述

Linux驱动中访问外设端口的outb为什么不是访问内存空间

原文如下面,其中第一个宏的意思不是把值v赋给了内存地址为a的内存空间吗,为什么是访问outb是往外设端口写数据的?

在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。这样就可以达到访问底层硬件的目的了。
时间: 2024-10-31 13:28:11

linux内核 访问外设-Linux驱动中访问外设端口的outb为什么不是访问内存空间的相关文章

Linux内核剖析 之 Linux源代码组成

Linux内核剖析 之 Linux源代码组成   ++++Linux:           ++COPYING:有关公共许可证制度GPL的具体说明.           ++README:Linux内核安装和使用的简要说明.           ++Makefile:重构Linux内核可执行代码的make文件.用来组织内核的各模块,记录了个模块间的联系和依托关系,编译时使用:仔细阅读各子目录下的Makefile文件对弄清各个文件这间的联系和依托关系很有帮助.           ++CREDIT

Linux内核3.12的驱动更新和改进

Linus Torvalds宣布3.12稳定版内核,带来很多驱动更新和改进,比如Radeon显卡,AMD APU,高通枭龙/Adreno,NVIDIA Optimus,各种文件系统和其他驱动等更新. Linus在邮件列表中说:"我本来在犹豫要不要来个RC8,不过下周要出去旅游,网络不好,还是不延迟了".并表示3.19后就会进入4.0时代,不过那是一年后的事情了. 该版新特性: The Radeon open-source kernel graphics driver has impro

Linux内核中断和异常分析(中)

在linux内核中,每一个能够发出中断请求的硬件设备控制器都有一条名为IRQ的输出线.所有现在存在的IRQ线都与一个名为可编程中断控制器的硬件电路的输入引脚相连,上次讲到单片机的时候,我就讲到了单片机中断的一些概念.我们现在来看一幅图,更好说明一个问题:      这下面的这幅图是51单片机的一个关于矩阵键盘的学习的一个proteus的仿真电路图. 其中P3.2和P3.3为外部中断引脚,当可编程控制器(51MCU)收到外部中断响应的时候,会执行一些特定的操作,当然这需要开发者去编写一个中断初始化

Linux 内核通知链随笔【中】【转】

转自:http://blog.chinaunix.net/uid-23069658-id-4364171.html 关于内核通知链不像Netlink那样,既可以用于内核与用户空间的通信,还能用于内核不同子系统之间的通信,通知链只能用于内核不同子系统之间的通信.那么内核通知链到底是怎么工作的?我们如何才能用好通知链?内核源代码里随处可见的通知链身影,我们到底该如何理解呢?本片博文过后,您的这些疑问和顾虑将统统消除.    以前有个女神,超凡脱俗.出水芙蓉,不过在怎么滴也是人,是人就会有各种各样的需

linux 内核 指针-请教linux内核模块指针的问题

问题描述 请教linux内核模块指针的问题 我在一个内核模块中写了下面一段代码,编译没问题,执行时报错(oops)好像是指针的问题,只要不在while循环中给j赋值就没问题,不知何故,第一次做内核模块,不知道内核态指针是不是还有什么特殊用法,求教 i = *hash_number + 1;j = 0;while ((i % HASH_MAX_REGIONS) != hash_number) { if (dmc->access_stats[i].region_number != region_nu

如何使用linux内核自己制作linux

学习过linux的同学都只知道linux是开源免费的,也只是非常棒的,.但是既然开源,那我们是否自己也可以动手打造一个简单的linux呢?今天我们来实验一下 1.在虚拟机里添加一块新的硬盘

Linux内核中常见内存分配函数(三)

ioremap void * ioremap (unsigned long offset, unsigned long size) ioremap是一种更直接的内存"分配"方式,使用时直接指定物理起始地址和需要分配内存的大小,然后将该段 物理地址映射到内核地址空间.ioremap用到的物理地址空间都是事先确定的,和上面的几种内存 分配方式并不太一样,并不是分配一段新的物理内存. ioremap多用于设备驱动,可以让CPU直接访问外部设备的IO空间.ioremap能映射的内存由原有的物理

Ubuntu中为Android系统上实现内置C可执行程序测试Linux内核驱动程序_Android

在前一篇文章中,我们介绍了如何在Ubuntu上为Android系统编写Linux内核驱动程序.在这个名为hello的Linux内核驱动程序中,创建三个不同的文件节点来供用户空间访问,分别是传统的设备文件/dev/hello.proc系统文件/proc/hello和devfs系统属性文件/sys/class/hello/hello/val.进一步,还通过cat命令来直接访问/proc/hello和/sys/class/hello/hello/val文件来,以验证驱动程序的正确性.在这一篇文章里,我

Linux内核中常见内存分配函数【转】

 转自:http://blog.csdn.net/wzhwho/article/details/4996510 1.      原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示.四级页表分别为: l         页全局目录(Page Global Directory) l         页上级目录(Page Upper Directory) l         页中间