第11章 内存与IO访问之I/O内存静态映射

11.5 I/O内存静态映射

    在将Linux移植到目标电路板的过程中,有得会建立外围设备I/O内存物理地址到虚拟地址的静态映射,这个映射通过在与电路板对应的map_desc结构体数组中添加新的成员来完成,map_desc结构体的定义:

arch/arm/include/asm/mach/map.h

struct map_desc {
        unsigned long virtual;    /* 虚拟地址 */
        unsigned long pfn;    /* __phys_to_pfn(phy_addr) */
        unsigned long length;     /* 大小 */
        unsigned int type;     /* 类型 */
};

代码清单11.11 在电路板文件中增加物理地址到虚拟地址的静态映射

 static struct map_desc ixdp2x01_io_desc _ _initdata = {
        .virtual        = IXDP2X01_VIRT_CPLD_BASE,
        .pfn            = _ _phys_to_pfn(IXDP2X01_PHYS_CPLD_BASE), /*把物理地址转换为页帧号*/
        .length         = IXDP2X01_CPLD_REGION_SIZE,
        .type           = MT_DEVICE
 };
 
 static void _ _init ixdp2x01_map_io(void)
 {
       ixp2000_map_io();
       iotable_init(&ixdp2x01_io_desc, 1); //建立页映射

}

将Linux操作系统移植到特定平台上,MACHINE_START(或者DT_MACHINE_START)、MACHINE_END宏之间的定义针对特定电路板而设计,其中的map_io()成员函数完成I/O内存的静态映射

备注:

在一个已经移植好操作系统的内核中,驱动工程师可以对非常规内存区域的I/O内存(外设控制器寄存器、MCU内部集成的外设控制器寄存器等)依照电路板的资源使用情况添加到map_desc数组中,但目前该方法不值得推荐。

Linux驱动程序开发核心知识体系 第一:Linux驱动程序概述 驱动程序的作用和特点 操作系统硬件之间的桥梁 控制硬件设备并提供统一接口 驱动程序的开发基础 开发环境搭建 内核模块编写、编译加载流程 Linux内核重要头文件目录 <linux/module.h>:模块初始化退出 <linux/fs.h>:文件系统接口定义 其他常用头文件支持驱动功能实现 Linux内核设备类型 字符设备:逐字节访问,如串口、蜂鸣器 块设备:以块为单位读写,如硬盘 网络设备:处理网络数据包收发 Linux内存管理机制 kmalloc:分配小块物理连续内存 vmalloc:分配虚拟连续大内存 内存释放函数:kfree、vfree 字符设备驱动实例:BEEP驱动 蜂鸣器控制原理 完整开发流程演示:注册、操作结构体实现、设备访问 第二:字符设备驱动程序 字符设备驱动基本结构 设备号申请(静态/动态) cdev结构体初始化注册 file_operations结构体实现常见操作接口 gfree、page相关函数 get_zeroed_page:获取清零的内存页 __get_free_pages / __free_pages:多页内存管理 页大小内存对齐概念 vmalloc及其辅助函数 分配非连续物理但连续虚拟内存 应用于大内存缓冲区场景 vfree释放vmalloc分配的内存 虚拟地址物理地址关系 地址映射机制:页表管理 ioremap用于I/O内存映射 内核空间中的地址转换函数 第三:并发和竞态控制 并发竞态问题 多任务环境下共享资源冲突 数据不一致风险 原子操作 整数原子操作:atomic_t类型 位原子操作:set_bit、clear_bit等 不可中断的单一指令操作 自旋锁(Spinlock) 忙等待机制,适用于短临界区 中断上下文可用 注意避免死锁和长时间持有 信号量互斥体 信号量(semaphore):允许多个并发访问 互斥体(mutex):仅允许一个持有者 用户态内核态同步机制差异 完成量(completion) 实现线程间事件通知 wait_for_completion complete 配对使用 适用于主线程等待工作完成场景 第四:阻塞和非阻塞 I/O 阻塞方式 read/write调用挂起直到条件满足 使用等待队列实现睡眠唤醒机制 非阻塞方式 即时返回错误码 -EAGAIN 或 -EWOULDBLOCK 用户程序轮询处理 Poll、Select机制 支持多文件描述符监听 驱动需实现poll函数指针 返回POLLIN/POLLOUT等事件状态 第五:中断和时钟 中断处理程序结构 request_irq注册中断处理函数 中断服务例程(ISR)快速响应 中断顶半部和底半部 顶半部:禁中断执行,响应快 底半部机制: tasklet:软中断基础上的延迟处理 工作队列(workqueue):可在进程上下文运行 中断共享 多设备共用同一IRQ线 中断处理函数中通过硬件状态判断来源 注册时需提供设备标识 内核定时器 struct timer_list定义定时任务 mod_timer设置超时时间 回调函数在软中断上下文中执行 第六内存 I/O I/O端口和I/O内存 I/O端口:x86架构专用IO空间(in/out指令) I/O内存内存映射型寄存器(MMIO) I/O操作函数 端口读写:inb/outb, inw/outw, inl/outl 内存映射寄存器读写:ioread32/iowrite32 访问具有屏障语义的操作函数 申请释放设备I/O资源 request_region / release_region:申请IO端口区间 request_mem_region / release_mem_region:申请内存映射区域 防止资源冲突,提升系统稳定性 生成思维导图
最新发布
11-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值