arm与arm-linux中的 ioport 和 iomem

2023-05-16

  • 这里讲述了,但是描述的不太清晰,本文分几个概念来讲述

arm & x86

x86 有 I/O端口(有load store 指令)与I/O内存(没有inb outb 指令) 的概念
	x86 可以只有 IO内存
	x86 可以 有 两个 : IO内存 和 IO端口
arm 只有 IO内存(有load store 指令)的概念,没有I/O端口(没有inb outb 指令) 的概念

arm-linux & x86-linux

------------------------------
x86-linux 有 I/O端口与I/O内存的概念
	iowrite32(xx,xx)  函数 中调用了store 指令
	outl(xx,xx) 函数中调用了 iol 指令
arm-linux 有 IO端口的概念,有I/O内存的概念
	iowrite32(xx,xx)  函数 中调用了 store 指令
	outl(xx,xx) 函数中调用了 iowrite32(xx,xx),最终还是调用了 store 指令 // 可以这么理解,实际上直接调用了 store 指令

为什么arm-linux 要 有 ioports
	因为 arm 要用 PCIe

PCIe 设备中有的 BAR 支持 ioport ,所以我们就要支持
支持PCIe 其实也不需要构造ioport , 但是为了易于分辨,我们就构造出了 ioport
实际上这个还是一块内存,还是用load,store 访问,但是到了pcie总线的时候,会转换为iord 和 iowr

在arm中,只有pcie控制器驱动会添加ioport资源
devm_of_pci_get_host_bridge_resources 的时候,会注册
	1. iomem 资源
	2. ioports 资源
	3. bus 资源

linux ioport & linux iomem 的本质

#define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name), 0)
#define request_region(start,n,name)     __request_region(&ioport_resource, (start), (n), (name), 0)


struct resource ioport_resource = {                                              
    .name   = "PCI IO",                                                          
    .start  = 0,                                                                 
    .end    = IO_SPACE_LIMIT,                                                    
    .flags  = IORESOURCE_IO,                                                     
};                                                                               
EXPORT_SYMBOL(ioport_resource);                                                  
                                                                                 
struct resource iomem_resource = {                                               
    .name   = "PCI mem",               // It's meant for all types of memory mapped I/O.                                           
    .start  = 0,                                                                 
    .end    = -1,                                                                
    .flags  = IORESOURCE_MEM,                                                    
};                                                                               
EXPORT_SYMBOL(iomem_resource);

static const struct seq_operations resource_op = {                               
    .start  = r_start,                                                               
    .next   = r_next,                                                                
    .stop   = r_stop,                                                                
    .show   = r_show,                                                                
};

__initcall(ioresources_init);
ioresources_init
  proc_create_seq_data("ioports", 0, NULL, &resource_op, &ioport_resource);     /proc/ioports
  proc_create_seq_data("iomem", 0, NULL, &resource_op, &iomem_resource);  /proc/iomem

cat /proc/ioports 的时候, 会利用 r_next 遍历 ioport_resource 下的 resource , 调用 r_show 打印出 resource 信息
cat /proc/iomem 同理

不同层级的request_region API

  • 参考
  • iomem
level 1 :request_mem_region
level 2 :devm_request_mem_region
  • ioport
level 1 : request_region
level 2 : devm_request_region

其他API

  • ioremap
level 1 : ioremap
level 2 : devm_ioremap
  • iomem access
#include <asm/io.h>
unsigned int ioread8(void *addr);
unsigned int ioread16(void *addr);
unsigned int ioread32(void *addr);
void iowrite8(u8 value, void *addr);
void iowrite16(u16 value, void *addr);
void iowrite32(u32 value, void *addr);

void ioread8_rep(void *addr, void *buf, unsigned long count);
void ioread16_rep(void *addr, void *buf, unsigned long count);
void ioread32_rep(void *addr, void *buf, unsigned long count);
void iowrite8_rep(void *addr, const void *buf, unsigned long count);
void iowrite16_rep(void *addr, const void *buf, unsigned long count);
void iowrite32_rep(void *addr, const void *buf, unsigned long count);
  • Why iomem_resource 's name is “PCI mem”?
https://linux-kernel.vger.kernel.narkive.com/vM03AIpm/request-mem-region-for-nopci-devices
Q: just want to check with you usage of request_mem_region for noPCI devices.
	kernel/resource.c suggests that it should be used just for PCI iomem
	(iomem_resource uses name PCI mem).
	
	If I grep architectures I see several usage for noPCI devices.
	
	Does it mean that request_mem_region should be used for all devices
	which request io memory? Or just for PCI iomem?
A:
	It's meant for all types of memory mapped I/O.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

arm与arm-linux中的 ioport 和 iomem 的相关文章

  • 构建 makefile 依赖/继承树

    如果我解释得不好或者问了一些明显的问题 我很抱歉 但我是 Linux 内核的新手 而且有点深入 我们有一个嵌入式 Linux 系统 它附带一个 文档非常糟糕的 SDK 其中包含数百个文件夹stuff 大多数文件夹包含rules make m
  • 为什么在 Linux 上字符串文字的内存地址与其他字符串文字的内存地址如此不同?

    我注意到字符串文字在内存中的地址与其他常量和变量 Linux 操作系统 非常不同 它们有许多前导零 未打印 Example const char h Hi int i 1 printf p n void h printf p n void
  • 在Linux中断上下文中运行用户线程

    我正在编写一些定制的应用程序 并允许更改 Linux 内核中的中断处理程序代码 我有一个用户线程正在等待中断发生 如果发生中断 那么我要做的第一件事就是执行该用户线程 有什么办法让它发挥作用吗 Thanks 创建一个字符设备 这就是内核所做
  • 如何以编程方式从Linux中的进程名称获取进程ID

    在我的项目中 我们使用 ACE 自适应通信环境 中间件来编写可在 Windows 和 Linux 上运行的独立于操作系统的代码 要求是从进程名称中获取进程 ID 由于 ACE 不支持这一点 因此我们必须使用特定于平台的宏来分离 Window
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • Bash 方法的返回值总是模 256

    我有一个 bash 脚本方法 它返回输入值 然而 返回值始终是模 256 的值 我用 google 搜索了一段时间 发现this http www tldp org LDP abs html exitcodes html文章说它总是以 25
  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • 如何在特定 systemd 服务重新启动时触发自定义脚本运行

    我想知道如何安排自定义脚本在重新启动服务时运行 我的用例是 每当重新启动 Tomcat 服务时 我都必须运行多个命令 我想知道是否有一种方法可以编写脚本并安排它在重新启动 Tomcat 服务时运行 我已将 tomcat 脚本设置为 syst
  • 使用 NEON 内在函数除以浮点数

    我当时正在处理四个像素的图像 这是在armv7对于 Android 应用程序 我想分一个float32x4 t向量由另一个向量组成 但其中的数字与大约不同0 7 to 3 85 在我看来 除法的唯一方法是使用右移 但这是针对一个数字2 n
  • SONAR - 使用 Cobertura 测量代码覆盖率

    我正在使用声纳来测量代码质量 我不知道的一件事是使用 Cobertura 测量代码覆盖率的步骤 我按照以下步骤操作http cobertura sourceforge net anttaskreference html http cober
  • 并行运行 make 时出错

    考虑以下制作 all a b a echo a exit 1 b echo b start sleep 1 echo b end 当运行它时make j2我收到以下输出 echo a echo b start a exit 1 b star
  • 在 Linux 中禁用历史记录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 要在 Linux 环境中禁用历史记录 我执行了以下命令 export HISTFILESIZE 0 export HISTSIZE 0 u
  • ARM Chromebook 上的 Android 开发环境?

    我尝试了多次安装和使用安卓工作室 https developer android com studio index html on an ARM Chromebook C100P https archlinuxarm org platfor
  • Godaddy 托管上的 CakePHP 控制台

    我一直在努力让我的 CakePHP 网站在 Godaddy 网格托管 帐户上运行 我的蛋糕应用程序设置是从帐户的子目录托管的 并且可以通过子域访问 我必须调整我的 htaccess 文件才能使其正常工作 现在我需要让 CakePHP 控制台
  • 在 Mac OS X 上构建 Linux 内核

    我正在做一个修改Linux内核的项目 我有一台桌面 Linux 机器 在上面构建内核没有问题 不过 我要去旅行 我想在途中工作 我只有一台 MacBook 当我尝试构建 Linux 内核时 它抱怨说elf h was not found 我
  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • Unix 命令列出包含字符串但*不*包含另一个字符串的文件

    如何递归查看包含一个字符串且不包含另一个字符串的文件列表 另外 我的意思是评估文件的文本 而不是文件名 结论 根据评论 我最终使用了 find name html exec grep lR base maps xargs grep L ba
  • 修改linux下的路径

    虽然我认为我已经接近 Linux 专业人士 但显然我仍然是一个初学者 当我登录服务器时 我需要使用最新版本的R 统计软件 R 安装在 2 个地方 当我运行以下命令时 which R I get usr bin R 进而 R version
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • 无法加载 JavaHL 库。- linux/eclipse

    在尝试安装 Subversion 插件时 当 Eclipse 启动时出现此错误 Failed to load JavaHL Library These are the errors that were encountered no libs

随机推荐