/proc/iomem和/proc/ioports

本文深入解析Linux系统中用于管理I/O资源的iomem和ioports文件,阐述了I/O映射方式和内存映射方式的区别,并通过实例展示了如何在X86平台上获取和使用这些资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



  转自 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29631743&id=4505778

      

  在proc目录下有iomem和ioports文件,其主要描述了系统的io内存和io端口资源分布。
        先来点基础知识点普及:对于外设的访问,最终都是通过读写设备上的寄存器实现的,寄存器不外乎:控制寄存器、状态寄存器和数据寄存器,
这些外设寄存器也称为“IO端口”,并且一个外设的寄存器通常是连续编址的。
        不同的CPU体系对外设IO端口物理地址的编址方式也不同,分为I/O映射方式(I/O-mapped)和内存映射方式(Memory-mapped)。
        对X86熟悉点,以它为例:X86为外设专门实现有单独的地址空间,可以称为“I/O地址空间”或“I/O端口空间”,这个是独立与CPU和RAM物理地址空间,它将所有外设的IO端口均在这一空间进行编址。CPU通过设立专门的IN和OUT指令来访问这一空间中的地址单元(即I/O端口),这就是所谓的“I/O映射方式”(I/O-mapped)。和RAM物理地址空间相比,I/O地址空间通常都比较小,如x86 CPU的I/O空间就只有64KB(0-0xffff)。这是“I/O映射方式”的一个主要缺点,你可以通过cat /proc/ioports去查看,IO port空间的地址资源分配情况是以树状结构显示。这个源于x86平台的设计思想,目前基本不用了,获取这些资源的函数接口如request_region和ioremap。
        Linux设计了一个通用的数据结构resource来描述各种I/O资源(如:I/O端口、外设内存、DMA和IRQ等)。该结构定义在include/linux/ioport.h头文件中。Linux是以一种倒置的树形结构来管理每一类I/O资源。每一类I/O资源都对应有一颗倒置的资源树,树中的每一个节点都是个resource结构。基于上述这个思想,Linux将基于I/O映射方式的I/O端口和基于内存映射方式的I/O端口资源统称为“I/O区域”(I/O Region)。
        /proc/iomem这个文件记录的是物理地址的分配情况,也是以树状结构显示,对其使用也是request_mem_region和ioremap,空间大小为16EB,远大于io port的64K。
        ioport和iomem地址空间分别编制,均是从地址0开始,如果硬件支持MMIO,port地址也可以映射到memory空间去。
        这里以pci设备为例,硬件的拓扑结构就决定了硬件在内存映射到CPU的物理地址,由于内存访问都是虚拟地址,所有就需要ioremap,此时物理内存是存在的,所以不用再分配内存,只需要做映射即可
        应用总结:使用I/O内存首先要申请,然后才能映射,使用I/O端口首先要申请,对I/O端口的请求是让内核知道你要访问该端口,内核并让你独占该端口.
        申请I/O端口的函数是request_region, 申请I/O内存的函数是request_mem_region。request_mem_region函数并没有做实际性的映射工作,只是告诉内核要使用一块内存地址,声明占有,也方便内核管理这些资源。重要的还是ioremap函数,ioremap主要是检查传入地址的合法性,建立页表(包括访问权限),完成物理地址到虚拟地址的转换。
        在intel的X86平台,GPIO资源也是类似应用,如果IO配置为SCI或者SMI中断,SCI可以产生GPE,然后经历acpi子系统,不过GPE中断号默认是0x10+GPIO端口号。

<think>好的,我现在需要帮助用户在Linux系统中通过/proc目录查看设备号。首先,我得回忆一下/proc文件系统的相关知识。根据用户提供的引用,/proc包含了很多系统进程的信息,比如引用2提到每个进程的PID目录,引用3提到设备驱动程序的信息。但用户具体要找的是设备号,可能涉及到设备驱动相关的部分。设备号在Linux中通常由主设备号次设备号组成,用来标识设备类型具体实例。常见的查看设备号的方法是通过`ls -l /dev`命令,但用户希望使用/proc目录。那/proc下有哪些文件或目录与设备号相关呢? 我记得在/proc/devices文件中记录了系统当前已注册的设备,包括字符设备块设备的主设备号及设备名称。引用3中提到/proc的信息包括设备驱动程序,这可能对应到/proc/devices。此外,引用4提到的/proc/iomem/proc/ioports是关于内存端口的信息,可能不直接相关,但需要确认。另外,/sys目录下有更详细的设备信息,但用户明确要求使用/proc。所以重点应放在/proc/devices。用户可能需要查看该文件的内容,使用`cat /proc/devices`命令,这样可以看到主设备号对应的设备类型名称。但这样只能得到主设备号,次设备号可能需要其他途径,比如通过设备节点或/sys中的信息。不过用户的问题可能只需要主设备号,或者如何通过/proc找到特定设备的主设备号。比如,如果用户知道设备名称,可以在/proc/devices中查找对应的主设备号。此外,是否有其他文件或目录?比如每个设备的子目录中是否有设备号信息?比如引用2提到的进程目录中的文件,但设备号通常与驱动程序相关,可能不在进程目录里。 总结步骤:首先检查/proc/devices文件,解释其内容,然后可能结合其他命令或文件来获取次设备号。同时提醒用户,如果需要更详细信息可能需要结合/sys目录。需要确保回答正确,并且引用相关参考资料,如引用3提到的设备驱动程序部分。</think>在Linux系统中,可以通过`/proc/devices`文件查看已注册的设备号,具体方法如下: --- ### 步骤说明 1. **查看字符设备块设备的主设备号** 执行命令: ```bash cat /proc/devices ``` 输出示例: ``` Character devices: 1 mem 4 /dev/vc/0 5 /dev/tty Block devices: 7 loop 8 sd ``` - **字符设备**(如串口、终端)**块设备**(如磁盘)的主设备号会分别列出[^3][^4]。 2. **结合设备节点获取次设备号** `/proc/devices`仅提供主设备号,若需获取次设备号,需查看设备节点: ```bash ls -l /dev/sda ``` 输出示例: ``` brw-rw---- 1 root disk 8, 0 Jun 10 10:00 /dev/sda ``` - `8, 0`表示主设备号为8,次设备号为0。 3. **通过设备名称反向查找主设备号** 若已知设备名称(如`ttyS0`),可通过以下命令确认主设备号: ```bash grep ttyS /proc/devices ``` --- ### 注意事项 - `/proc/devices`仅显示**已加载驱动**对应的设备号,未加载的设备不会显示[^3]。 - 更详细的设备信息(如厂商、型号)可通过`/sys/class`或`lspci`命令获取。 --- ### 相关问题 1. 如何通过`/sys`目录查看设备的详细属性? 2. 主设备号次设备号在Linux内核中的作用是什么? 3. 如何动态加载或卸载设备驱动模块? --- 通过以上方法,可以快速定位设备号信息,并结合其他工具深入分析设备特性[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值