对ARM access flag和dirty state机制理解
参考文献
官方ARM 架构手册:Arm Architecture Reference Manual for A-profile architectureH.a版本
从D5.4.7小结开始
The Access flag
ARM的access flag和dirty state机制用于进行页表的维护,其中的Access flag其实挺好理解的,就是最后的Page中有个AF域段,如果是0,在被访问以后就更新为1。
但dirty state我一直理解都不太好,Page中只有一个DBM(Dirty Bit Modifier)域段,这个域段的是怎样用的,一直没看明白。
经过一段时间的思考,现在总算是理清楚了。
Access flag指示内存页是否被访问过。
AF域段被设置为0后,首次被访问时会被修改为1。
The dirty state
dirty state指示是否修改了内存页或内存段。
dirty state可以由硬件管理,如 D5-4863 页HTTU所述
dirty state信息使用访问权限位 AP[2] 和 S2AP[1] 以及 DBM 位进行编码。
Page的域段
这里补充一下AF、AP、S2AP、DBM这几个域段的概念。
在page的属性域段中,
AF就是access flag
AP是访问权限
S2AP和AP是一样的
只是S2AP是stage2翻译的时候获得页的域段。
stage2翻译就是IPA->PA的翻译阶段,这里不过多展开描述。
DBM Dirty修改位
这个东西看起来很抽象,后面再展开表述它的使用
软件管理Access flag
Armv8.0 要求软件管理访问标志。这意味着,每当尝试将访问标志的值为 0 的转换表描述符条目读入 TLB 时,都会生成访问标志错误。
访问标志机制期望,当发生访问标志错误时,软件会在导致故障的转换表条目中将访问标志重置为 1。这可以防止下次访问内存位置时发生故障。访问标志设置为 0 的条目永远不会保留在 TLB 中,这意味着软件在设置标志后不必从 TLB 刷新条目。
这里稍微表述了一下,ARM V8.0是只支持通过软件来管理access flag的。
当访问到AF为0的页时,就会产生一个fault错误告诉软件,软件去修改Page的AF为1,然后再次访问就正常了。
显然,这里上报fault,软件再去改写AF,其实是要耗费软件的精力的。这就很麻烦。
硬件管理Access flag 和Dirty state
从ARM V8.1开始,支持硬件管理了,也就是HTTU(Hardware Translation Table Update)。
简单来说,就是硬件可以直接去修改AF域段,这里的硬件指的应该是MMU/SMMU,在PTW获取最后一级Page的时候,如果发现AF是0,那就直接自己完成读写原子操作,将page的AF改为1,而无需上报Fault给软件。
而Dirty state的维护就体现的比较拐弯抹角了。它是同时使用DBM、AP/S2AP这一组域段来表示是否为Dirty的。
首先,软件会把页的访问权限设置为“不可写”。
这里的“不可写”其实区分为“真的不可写”和“为了判断dirty state,暂时不可写”两种情况。
这两种情况体现在DBM这个域段上:
如果为0,那就是“真的不可写”
如果为1,那就是“为了判断dirty state,暂时不可写”
如果DBM为0,那硬件在想要修改AF的时候,会发生权限错误,然后上报fault给软件。
如果DBM为1,那硬件就知道,其实这个是可以写的,直接就将权限AP/S2AP修改为可写的状态。而权限从不可写变为可写这件事情,就表明该页是Dirty的了。