公司做网站能抵扣进项税吗,网站设计机构文档,wordpress 清空文章,wordpress国人模板上面我们说了如何去在系统中自己实现一个设置系统寄存器的一个方法#xff0c;上面归根到底要进行物理地址到虚拟地址的映射 现在我们就说说IO_ADDRESS()的实现 #define __REG32ALI#xff08;addr) (*((volatile unsigned long *)((addr) - ALI_REGS_PHYS_BASE ALI_REGS_V…上面我们说了如何去在系统中自己实现一个设置系统寄存器的一个方法上面归根到底要进行物理地址到虚拟地址的映射 现在我们就说说IO_ADDRESS()的实现 #define __REG32ALIaddr) (*((volatile unsigned long *)((addr) - ALI_REGS_PHYS_BASE ALI_REGS_VIRT_BASE))
#define readl(IO_ADDRESS(addr)) (*(volatile unsigned int *)(addr)) 两个宏的功能都是一样的所以对比可得 IO_ADDRESS(addr) (addr) - ALI_REGS_PHYS_BASE ALI_REGS_VIRT_BASE 其中的addr都是物理地址ALI_REGS_PHYS_BASE是System IO基地址(addr) - ALI_REGS_PHYS_BASE 就能得到偏移的地址ALI_REGS_VIRT_BASE是虚拟地址的基地址这里的虚拟地址其实是DRAM里面的地址即我们要操作他映射到DRAM里面的地址我们看看ALI_REGS_VIRT_BASE的定义 #define ALI_REGS_PHYS_BASE PHYS_SYSTEM
#define ALI_REGS_VIRT_BASE VIRT_SYSTEM
#define VMALLOC_END 0xfffffffff
#define SIZE_ALIIO 0x60000
#define VIRT_SYSTEM (VMALLOC_END - SIZE_ALIIO) 可以看出虚拟地址的基地址是人为划分出的是VMALLOC_END - SIZE_ALIIO得到的 VMALLOC_END是cpu address mapping中给虚拟地址的内核空间划分出的地址区间的末端地址这个末端地址根据不同cpu的不同而有所不同SIZE_ALIIO为可以使用的空间大小 这个宏只是一个工具是操作静态映射后的宏的一种做法在使用该宏前必须已经对该IO地址所在的地址范围做了静态映射即machine中对函数map_io中注册一下静态映射表让系统可以知道这种映射关系否则系统根据算出的虚拟地址是访问不到物理地址的会出现异常。 转载于:https://www.cnblogs.com/linhaostudy/p/10772813.html