博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内核ACPI函数API之acpi_os_read_memory
阅读量:4216 次
发布时间:2019-05-26

本文共 1199 字,大约阅读时间需要 3 分钟。

acpi_os_read_memory(acpi_physical_address phys_addr, u64 *value, u32 width) 这个函数用于读取一个物理io memory里面的值其源码分析如下:acpi_statusacpi_os_read_memory(acpi_physical_address phys_addr, u64 *value, u32 width){	void __iomem *virt_addr;	unsigned int size = width / 8;	bool unmap = false;	u64 dummy;	int error;	rcu_read_lock();	#首先查找这个物理地址对应的虚拟地址	virt_addr = acpi_map_vaddr_lookup(phys_addr, size);	if (!virt_addr) {	#如果虚拟地址为null,说明这个物理地址还没有映射,这里会临时映射		rcu_read_unlock();		#映射这个物理地址到虚拟地址		virt_addr = acpi_os_ioremap(phys_addr, size);		if (!virt_addr)			return AE_BAD_ADDRESS;		unmap = true;	}	if (!value)		value = &dummy;	#开始读虚拟地址里面的值	error = acpi_os_read_iomem(virt_addr, value, width);	BUG_ON(error);	#如果在这个函数中映射了虚拟地址,则这里取消映射	if (unmap)		iounmap(virt_addr);	else		rcu_read_unlock();	return AE_OK;}其中读虚拟地址值的函数如下:int acpi_os_read_iomem(void __iomem *virt_addr, u64 *value, u32 width){	switch (width) {	case 8:		*(u8 *) value = readb(virt_addr);		break;	case 16:		*(u16 *) value = readw(virt_addr);		break;	case 32:		*(u32 *) value = readl(virt_addr);		break;	case 64:		*(u64 *) value = readq(virt_addr);		break;	default:		return -EINVAL;	}	return 0;}从这里可以知道acpi_os_read_memory 可以读取物理io memory里面的值,不管这个物理io地址之前释放映射。

转载地址:http://mdnmi.baihongyu.com/

你可能感兴趣的文章
cocos2dx lua Node节点 私有数据存取
查看>>
lua math.ceil math.ceil
查看>>
cocos2dx CCNode计算node的大小
查看>>
cocos2dx 布局记录(1)
查看>>
lua 多行注释和取消多行注释
查看>>
缩放系数计算
查看>>
cocos2dx --- 按钮点击居中放大
查看>>
cocos2dx menu位置计算
查看>>
cocos2dx资源加载机制(同步/异步)
查看>>
cocos2dx C++调用java -- 字符串传递
查看>>
git学习网站
查看>>
JavaScript 学习网站
查看>>
cocos2dx java调用c++ -- 字符串传递
查看>>
CCScaleTo与CCScaleBy比较
查看>>
cocos2dx CCObject引用计数,内存释放分析(1)
查看>>
cocos2dx2.X 编译时,传递编译选项
查看>>
ccCArray.cpp 文件
查看>>
cocos2dx 屏幕大小
查看>>
libgdx: 2D Particle Editor工具使用
查看>>
eclipse 给jar库添加源码
查看>>