Linux map type uncache 和 write combine区别

文章目录

  • 前言
  • 一、定义
  • 二、隐含区别
  • 总结


前言

这段时间被Map Cache Type坑了一次。
GPU的PCI bar地址map成uncache 的还是 write combine?


一、定义

uncache(uc) : map后,CPU读写不经过Cache
write combine(wb): map后,CPU读写同样不经过Cache,但是和Cache之间有一块buffer,以便于将多次连续小读写合成一次大读写

这是互联网上能查到的定义,但是实际应用并没有给出结论,什么情况下用什么,无脑用uc肯定是不会出错的。

二、隐含区别

如果我要往外设的寄存器进行读写,如果是uncache的,这是正确的做法,不会有什么潜在的问题。
那如果是write combine的会发生什么?
寄存器我们知道有FIFO,我们读写设备的FIFO(例如串口),我们每读写一次,串口会弹出/记录数据 同时改变FIFO寄存器的值,此时读写次数会影响到设备行为/寄存器的值。
而write combine会将多次连续小读写合成一次大读写,甚至是读写重排,改变了读写的次数/行为,对于类似读写敏感的寄存器会出现不可预知的错误。

如果我要在vram中进行读写
那如果是write combine的会发生问题吗?
首先给出结论:不会
vram并不会像寄存器对读写敏感,像frame buffer以及gart table都没问题。

(有些人可能以为gart table必须得用uncache,实际上write combine就行了。)


总结

寄存器部分 map成uncache,而类似vram对读写顺序以及次数不敏感的map成write combine用于提升读写性能。

小问题,如果我的寄存器也对读写不敏感怎么办,例如配置寄存器,这种情况该用什么?

你可能感兴趣的:(linux,嵌入式硬件)