Linux IO空间与内存空间

DMA+Timer 生成 PWM 波形错位问题分析与解决 本文深入分析了DMA与Timer协同生成PWM波形时出现的错位问题,揭示了DMA传输启动时机与定时器溢出中断的微妙关系。通过占空比强制清零法和预装载值调校技巧,提供了有效的解决方案,并总结了PWM+DMA配置的最佳实践,帮助开发者避免类似问题。 阅读详情

编址方式

外设都是通过读写设备上的寄存器来进行工作的,外设寄存器也称为“IO端口”,而IO端口的编址方式有两种,独立编址和统一编址。

统一编址:外设接口中的IO寄存器(即IO端口)与主存单元一样看待,每个端口占用一个存储单元的地址,将主存的一部分划出来用作IO地址空间。 统一编址的原理是将IO的端口地址存储器寻址的地址空间范围之内,此方法也成为存储器映像编址。CPU访问一个端口的操作与访问内存的操作相同,也使用访问内存的指令。

独立编址:为端口地址单独开辟一部分地址空间,其访问指令也需要使用单独的指令(不同于内存访问指令)。

根据CPU体系结构的不同,CPU对IO端口的编址方式有两种:

  (1)I/O映射方式(I/O-mapped)
  典型地,如X86处理器为外设专门实现了一个单独的地址空间,称为"I/O地址空间"或者"I/O端口空间",CPU通过专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元。
  (2)内存映射方式(Memory-mapped)
  RISC指令系统的CPU(如ARM、PowerPC等)通常只实现一个物理地址空间,外设I/O端口成为内存的一部分。此时,CPU可以象访问一个内存单元那样访问外设I/O端口,而不需要设立专门的外设I/O指令。
  但是,这两者在硬件实现上的差异对于软件来说是完全透明的,驱动程序开发人员可以将内存映射方式的I/O端口和外设内存统一看作是"I/O内存"资源。
 一般来说,在系统运行时,外设的I/O内存资源的物理地址是已知的,由硬件的设计决定。但是CPU通常并没有为这些已知的外设I/O内存资源的物理地址预定义虚拟地址范围,驱动程序并不能直接通过物理地址访问I/O内存资源,而必须将它们映射到核心虚地址空间内(通过页表),然后才能根据映射所得到的核心虚地址范围,通过访内指令访问这些I/O内存资源。

void * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags) 
入口: phys_addr:要映射的起始的IO地址; 
size:要映射的空间的大小; 
flags:要映射的IO空间的和权限有关的标志; 
功能: 将一个IO地址空间映射到内核的虚拟地址空间上去,便于访问; 
实现:对要映射的IO地址空间进行判断,低PCI/ISA地址不需要重新映射,也不允许用户将IO地址空间映射到正在使用的RAM中,最后申请一 个 vm_area_struct结构,调用remap_area_pages填写页表,若填写过程不成功则释放申请的vm_area_struct空 间;
意义:
比如isa设备和pci设备,或者是fb,硬件的跳线或者是物理连接方式决定了硬件上的内存影射到的cpu物理地址。 
在内核访问这些地址必须分配给这段内存以虚拟地址,这正是__ioremap的意义所在 ,需要注意的是,物理内存已经"存在"了,无需alloc page给这段地址了. 

为了使软件访问I/O内存,必须为设备分配虚拟地址.这就是ioremap的工作.这个函数专门用来为I/O内存区域分配虚拟地址(空间).对于直接映射的I/O地址ioremap不做任何事情。有了ioremap(和iounmap),设备就可以访问任何I/O内存空间,不论它是否直接映射到虚拟地址空间.但是,这些地址永远不能直接使用(指物理地址),而要用readb这种函数。

使用I/O内存首先要申请,然后才能映射,使用I/O端口首先要申请,或者叫请求,对于I/O端口的请求意思是让内核知道你要访问这个端口,这样内核知道了以后它就不会再让别人也访问这个端口了.毕竟这个世界僧多粥少啊.申请I/O端口的函数是request_region, 申请I/O内存的函数是request_mem_region。request_mem_region函数并没有做实际性的映射工作,只是告诉内核要使用一块内存地址,声明占有,也方便内核管理这些资源。重要的还是ioremap函数,ioremap主要是检查传入地址的合法性,建立页表(包括访问权限),完成物理地址到虚拟地址的转换。

使用方法:

内核中的使用,往往是为某个设备预留一块内存,当使用的时候需要在board中定义这个设备的内存resource。通过 platform_get_resource获得设备的起始地址后,可以对其进行request_mem_region和ioremap等操作,以便应用程序对其进行操作

STM32F407中文手册 STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。 立即下载

相关推荐

DIKW模型实战:用Obsidian打造个人知识库的5个关键步骤

本文详细介绍了如何利用DIKW模型在Obsidian中构建高效个人知识库的5个关键步骤,从数据收集到智慧应用的全流程实践。通过标记系统、信息加工引擎和知识结晶方法,帮助知识工作者实现从原始数据到决策智慧的认知跃迁,提升个人知识管理效率。

gamma的博客 578

linux的io空间和内存空间

1   IO空间和内存空间 并不是所有的体系结构都有IO空间这个定义的,我所了解的只有X86体系上有,而ARM 体系结构就没有这种区别,ARM统一编址, 在X86上,IO空间和内存是独立的,他们各自有各自的总线,并且IO空间一般是64K, 即16位,采用IN和OUT指令访问。内存空间为4G。 可见他们的差别是很大。 2  静态映射:

u012590688的专栏 2369

NI USB-8506 LIN通讯配置全攻略:从驱动安装到NI MAX硬件检测

本文详细介绍了NI USB-8506设备的LIN通讯配置全流程,从驱动安装到NI MAX硬件检测。重点讲解了NI-CAN和NI-XNET驱动的安装避坑技巧,以及LIN通讯参数配置的实战经验,帮助用户快速掌握车载LIN总线通讯技术,提升工作效率。

weixin_29171087的博客 600

第11章--内存与IO访问

目前,大多数嵌入式微控制器中并不提供I/O空间,而仅存在内存空间。内存空间可以直接通过地址、指针来访问,程序及在程序运行中使用的变量和其他数据都存在于内存空间中。

qq_38500362的博客 574

完美解决LBP2900打印机安装驱动提示无法识别USB及连接错误等问题(附Win11全新安装支持及卸载方案)

LBP2900打印机虽然经典老旧,但在Win11上依然可以完美使用!许多网上教程都无视安装失败后的问题,在此分享一种全新、100%有效的方法来解决驱动连接错误和无法识别USB设备的问题。无论是新安装还是卸载重装,这个方法都适用。本文整合了通用驱动包,支持Win2000到Win11系统,操作简单,轻松摆脱安装困扰,享受无忧打印体验!

心开始の未来~的博客 2万+

STM32F4+FreeRTOS实战:手把手教你移植LWIP2.1.2(含LAN8720配置避坑指南)

本文提供了一份详尽的实战指南,手把手教你如何在STM32F4平台结合FreeRTOS实时操作系统,成功移植轻量级TCP/IP协议栈LWIP 2.1.2。文章重点剖析了硬件驱动层LAN8720 PHY芯片的配置要点与常见“坑点”,并深入讲解了LWIP与FreeRTOS的深度整合、关键配置及稳定性优化策略,旨在帮助开发者构建稳定可靠的产品级嵌入式网络功能。

ik678901234的博客 1063

Linux 文件IO、虚拟地址空间

文件IO

weixin_43349440的博客 388

基于文件通信的QMT量化交易信号桥接方案设计与实现

在量化交易系统开发中,进程间通信(IPC)是连接不同计算模块、实现策略逻辑与交易执行解耦的关键技术。其核心原理在于允许运行于独立环境或进程的程序安全、可靠地交换数据。文件系统通信作为一种经典的IPC方法,因其实现简单、跨平台兼容性好且数据可持久化,在非高频场景下具有重要技术价值。它尤其适用于需要将外部复杂计算环境(如配备丰富数据科学库的Python环境)与专用交易终端(如迅投QMT)集成的应用场景。通过约定文件路径与数据格式,外部程序可将包含交易指令的JSON信号文件写入特定目录,而交易终端通过轮询或监听机

weixin_28678151的博客 419

Linux驱动开发10 --- 内存和I/O

内存和IO在Linux

weixin_43604927的博客 1949

宇树科技嵌入式面试题及参考答案(春晚机器人的公司)

内存对齐是指在内存中为数据对象分配存储空间时,按照一定的规则将数据存储在特定的地址上,以提高内存访问效率。不同的数据类型在内存中都有其特定的对齐要求,例如,int类型通常要求 4 字节对齐,double类型通常要求 8 字节对齐。这意味着数据的存储地址必须是其对齐字节数的整数倍。如果不进行内存对齐,处理器在访问数据时可能需要进行多次内存访问,从而降低了访问效率。指令可以用于控制结构体内存布局,它允许程序员指定结构体成员的对齐方式。其基本用法是在结构体定义之前使用来指定对齐字节数n,其中n。

大模型大数据攻城狮的专栏 3226

手把手教你学Simulink——基于全桥 LLC 谐振变换器的双向 DC-DC 建模与仿真

本文详细介绍了基于Simulink的双向全桥LLC谐振变换器建模与仿真方法。内容涵盖:1)LLC谐振变换器背景与双向化挑战;2)系统架构设计及关键数学推导(FHA增益分析、双向控制逻辑);3)Simulink建模步骤(功率级搭建、PWM生成、同步整流实现);4)仿真结果分析(正向/反向工作验证、ZVS特性);5)工程实践建议(增益微调、代码生成与HIL测试)。通过手把手教学,帮助读者掌握950V↔48V双向LLC变换器的完整设计流程,实现高效率能量双向流动的同时保持软开关特性,适用于储能系统、车载充电等应用

MHD0815的博客 179

Linux中的文件IO和虚拟地址空间模型 [Linux高并发服务器开发]

Linux文件IO 与 虚拟地址空间的概念

Appleeatingboy的博客 1504

用 SAP Fiori Launchpad Content Manager 做目录传输:把 Catalog 变更稳稳送到目标系统

摘要:SAP Fiori项目中,目录传输是确保应用一致交付的关键环节。开发团队常遇到目录在不同系统/客户端间不一致的问题,核心在于理解Launchpad内容管理的两种作用域:系统级(/UI2/FLPCM_CONF)使用workbench请求跨系统传输,客户端级(/UI2/FLPCM_CUST)通过customizing请求按SCC4设置传输。混淆作用域会导致目录分叉,如系统级目录被客户端本地修改后形成独立副本。官方推荐使用Content Manager而非过时的Launchpad Designer,并强调手

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 105

linux驱动学习笔记(五)内存空间与IO映射

前言 一般高性能处理器都会提供一个叫MMU(内存管理单元),MMU帮助操作系统进行内存管理,虚拟地址和物理地址的映射。 对于包含MMU的处理器来说,linux提供了一种复杂的存储管理系统,可以让进程访问可以访问的空间达到4GB,这4GB分别表示用户空间(0 ~ 3GB) ,内核空间(3 ~ 4GB)。用户空间通常只能访问用户空间的虚拟地址,不能访问内核空间的虚拟地址,用户空间只能通过系统调用才能访问内核空间 内存申请 用户空间的内存申请 用户空间中动态申请内存的函数为malloc,申请的内存的释放函数为fr

weixin_35429431的博客 816

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

区分:内存空间、物理内存、IO空间、IO端口、IO内存

内存空间: 内存地址寻址范围,32位操作系统内存空间为2的32次幂,即4G。 物理内存: 实实在在的物理设备,一般 IO空间: X86特有的一个空间,与内存空间彼此独立的地址空间,32位X86有64K的IO空间。 IO端口: 当一个寄存器或内存位于IO空间时,称

SdustLiYang的专栏 3238

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

linux驱动静态分配内存,Linux驱动设计——内存与IO访问

名词解释内存空间与IO空间内存空间是计算机系统里面非系统内存区域的地址空间,现在的通用X86体系提供32位地址,寻址4G字节的内存空间,但一般的计算机只安装256M字节或者更少的内存,剩下的高位内存就被用于PCI或者AGP及系统桥设备的使用上面,主机可以像访问系统内存一样访问这些高端内存,这样对于扩展的设备有更大的空间。IO空间是X86系统上面的专用空间,现在的IO空间大小是64K字节,从0x00...

weixin_36028342的博客 388

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

{博学谷学习记录} 超强总结,用心分享|狂野架构师-网络IO(同步阻塞IO)

我们的应用程序是不能直接操作计算机的需要通过内核来进行中转由内核向上提供api,我们应用程序调用从而达到中转的效果我们的应用程序刚开始启动的时候就是一个进程,进程的话操作系统就会为我们的进程分配空间和相应的资源以内存资源为例,操作系统为我们分配的内存空间,内存空间分为两部分一个是内核缓冲区空间,一个是用户空间,内核缓冲区空间用于存储内核给我们处理任务所产生的任务数据,用户空间就是应用程序占用的空间,比如我们启动一个jvm,就会在用户空间中开辟相应的堆栈信息。

zhixin0067的博客 306

Linux I/O 端口和 I/O 内存

http://huzoy.blog.163.com/blog/static/560963152010263747121/ 在Arm ,Linux里面,全部都会做phy->virt的映射。映射方式中的一种是静态映射,ioremap是动态映射。在静态映射之后,仍然可以通过ioremap动态映射,也就是一个IO物理地址可以映射到多个虚拟地址。 (1)关于IO与内存空间:      在X

kklvsports的专栏 548

Linux驱动设计——内存与IO访问

名词解释 内存空间与IO空间 内存空间是计算机系统里面非系统内存区域的地址空间,现在的通用X86体系提供32位地址,寻址4G字节的内存空间,但一般的计算机只安装256M字节或者更少的内存,剩下的高位内存就被用于PCI或者AGP及系统桥设备的使用上面,主机可以像访问系统内存一样访问这些高端内存,这样对于扩展的设备有更大的空间。 Linux用户空间与内核空间 IO空间是X86系统上面的专用空间...

weixin_30662011的博客 214

PCIe配置空间和PCI设备中的寄存器

1、访问PCI配置空间,PCI基本配置空间的读写使用下列函数: 原型定义在 int pci_read_config_byte(struct pci_dev *pdev, int where, u8 *val); int pci_read_config_word(struct pci_dev *pdev, int where, u8 *val); int pci_read_config_d

chengch512的专栏 1万+

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

Linux系统对IO端口和IO内存的管理 一、I/O端口       端口(port)是接口电路中能被CPU直接访问的寄存器的地址。几乎每一种外设都是通过读写设备上的寄存器来进行的。CPU通过这些地址即端口向接口电路中的寄存器发送命令,读取状态和传送数据。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。 二、IO内存

Eric的专栏 603

内存和IO访问

内存和IO访问

qiaogua的专栏 4152

排查 Linux 系统运行速度慢

排查 Linux 系统运行速度慢一、检查CPU信息二、使用top检查cpu负载三、iotop进行检查四、检查启动的服务五、free检查闲置内存空间 一、检查CPU信息 在 Linux 系统中,提供了 proc 文件系统显示系统的软硬件信息。那么可以执行命令 cat /proc/cpuinfo文件系统中查看 CPU 的提供商和相关详细配置信息; cat /proc/cpuinfo lscpu ...

爱是与世界平行 1456

linux常用命令

查看根目录inode编号 root@vm:~# ls -i -d / 2 / 1 表示虚拟文件系统。 其他目录的inode编号 root@vm:~# ls -i 79953929 Desktop 79953933 Documents 79953930 Downloads 79954396 gocode 79953934 Music 79953935 Pictures 79953932...

Geek猫的专栏 194

io端口

io端口 ***********************************************************   io端口设备访问流程为 ----------------------------------------------------------- 1 request_region() 1 request_region()  2 ioport_map()...

weixin_34406086的博客 254

驱动中的IO访问

1,内存空间与IO空间   1)I/O 映射方式(I/O-mapped) 典型地,如X86处理器为外设专门实现了一个单独的地址空间,称为"I/O地址空间"或者"I/O端口空间",CPU通过专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元。   2)内存映射方式(Memory-mapped)  RISC指令系统的CPU(如ARM、PowerPC等)通常只实现一个物理地址...

weixin_30813225的博客 319
上一篇: gdb stdout重定向
下一篇: ubuntu软件安装常用命令
dataowner
博客等级 码龄19年 1粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值