这两个函数有什么区别:`ioremap_uc()` 和 `set_memory_uc`?

Ale*_*lex 6 c linux caching posix virtual-address-space

当我想通过设置 PAT(页面属性表 - PTE 中的 7 位)将内存区域标记为写入组合(禁用可缓存并使用 BIU)或不可缓存时,那么我必须使用什么,这两个函数之间有什么区别?

摘自: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)

Ale*_*_JP 0

lwm 文章的注释:

-- 上表中的意思是“不建议使用该 API”。其中一些 -- 是由内核严格执行的。其他一些目前尚未真正执行,但将来可能会执行。

很明显,除了 RAM 之外,您不应该将它们用于任何其他用途。

使用ioremap*()也是错误的,因为 PCI 有一个特定的 API,即pci_iomap*(). 维护人员只会确保正确的 API 能够实现正确的意图。