Linux ioremap分析

本文详细探讨了Linux内核中的ioremap函数,用于将物理地址转换为虚拟地址,以便于设备驱动程序访问硬件资源。文章深入分析了ioremap在arm64平台上的实现,包括内存区域的分配、页表的映射等关键步骤,揭示了ioremap工作原理。
摘要由CSDN通过智能技术生成
ioremap()将物理地址转换为虚拟地址 


->ioremap(addr, size) arch/arm64/include/asm/io.h
->__ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
{
#define PROT_DEVICE_nGnRE (PROT_DEFAULT | PTE_PXN | PTE_UXN |
PTE_DIRTY | PTE_WRITE | 
PTE_ATTRINDX(MT_DEVICE_nGnRE))
}
->__ioremap(phys_addr_t phys_addr, size_t size, pgprot_t prot) arch/arm64/mm/ioremap.c
->_ioremap_caller(phys_addr_t phys_addr, size_t size, pgprot_t prot, void *caller)
{
若页表的大小为4K, offset是相对于页表的offsset
unsigned long offset = phys_addr & ~PAGE_MASK;

物理地址的分配以页表对齐,size的大小为PAGE_ALIGN(size + offset)
phys_addr &= PAGE_MASK;
size = PAGE_ALIGN(size + offset);
last_addr = phys_addr + size - 1;

/*如果物理地址在RAM的区间内,则不允许做map操作*/
if (WARN_ON(pfn_valid(__phys_to_pfn(phys_addr))))
return NULL;

在linux虚拟内存中找到一段的mem空间,用vm_struct数据结构进行描述
struct vm_struct *area;
area = get_vm_area_caller(size, VM_IOREMAP, caller); arch/arm64/mm/ioremap.c

VMALLOC_START和VMALLOC_END为VMALLOC的mem空间,定义在arch/arm64/include/asm/pgtable.h中
定义如下:
{
#define VMALLOC_START (MODULES_END)
#define VMALLOC_END   (PAGE_OFFSET - PUD_SIZE - VMEMMAP_SIZE - SZ_64K)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值