Ale*_*lex 6 c linux caching posix virtual-address-space
当我想通过设置 PAT(页面属性表 - PTE 中的 7 位)将内存区域标记为写入组合(禁用可缓存并使用 BIU)或不可缓存时,那么我必须使用什么,这两个函数之间有什么区别?
ioremap_[uc|wc][uc|wc] 访问类型来访问 PCI BAR:void __iomem *ioremap_wc(resource_size_t phys_addr, unsigned long size)set_memory_[uc|wc]设置 RAM 范围的访问类型:int set_memory_uc(unsigned long addr, int numpages)摘自:http : //lwn.net/Articles/278994/
为什么我不能对 PCI BAR 和 RAM 范围使用相同的单一功能?
澄清:ioremap_uc()获取物理地址并返回虚拟地址
是否设置为 Uncacheable,而set_memory_uc()哪个获取虚拟地址并为这些页面设置 Uncacheable?
这些代码相等吗?
void* virt_ptr = ioremap_uc(phys_ptr, size);
Run Code Online (Sandbox Code Playgroud)
和
void* virt_ptr = ioremap(phys_ptr, size);
const int page_size = 4096;
set_memory_uc(virt_ptr, size/page_size);
Run Code Online (Sandbox Code Playgroud)
lwm 文章的注释:
-- 上表中的意思是“不建议使用该 API”。其中一些 -- 是由内核严格执行的。其他一些目前尚未真正执行,但将来可能会执行。
很明显,除了 RAM 之外,您不应该将它们用于任何其他用途。
使用ioremap*()也是错误的,因为 PCI 有一个特定的 API,即pci_iomap*(). 维护人员只会确保正确的 API 能够实现正确的意图。