iCache歧義和別名
只要是Cache,就不能不提歧義和別名的問題。歧義問題一直是軟件最難維護的,所以現在的硬件設計一般都采用物理地址作為tag。這就避免了歧義問題。別名問題是否存在呢?在之前的文章中,我們知道VIPT的cache是可能存在別名的情況。但是針對iCache的特殊情況(readonly),又會產生什么特殊的結果呢?其實我們之所以需要考慮別名問題,就是因為需要我們維護別名之間的一致性。因為可能在不同的cacheline看到不同的結果。那么iCache會存在別名,但是不是問題。因為iCache是只讀的,所以即使兩個cacheline緩存一個物理地址上的指令,也不存在問題。因為他的值永遠是一致的,沒有修改的機會。既然選用VIPT iCache即不存在歧義問題,別名也不是問題。那么我們是不是就不用操心了呢?并不是,我們最后需要考慮的問題是iCache和dCache之間的一致性問題。
dentry與inode
(可參照理解為ext2 inode)
inode對應于物理磁盤上的具體對象,
dentry是一個內存實體,其中的d_inode成員指向對應的inode。
也就是說,一個inode可以在運行的時候鏈接多個dentry,而d_count記錄了這個鏈接的數量。
按照d_count的值,dentry分為以下四種狀態:
0、空閑狀態:處于該狀態的目錄項對象不包括有效信息,且沒有被VFS使用。
1、未使用(unused)狀態:該dentry對象的引用計數d_count的值為0,但其d_inode指針仍然指向相關的的索引節點。該目錄項仍然包含有效的信息,只是當前沒有人引用他。這種dentry對象在回收內存時可能會被釋放。
2、正在使用(inuse)狀態:處于該狀態下的dentry對象的引用計數d_count大于0,且其d_inode指向相關的inode對象。這種dentry對象不能被釋放。
3、負(negative)狀態:與目錄項相關的inode對象不復存在(相應的磁盤索引節點可能已經被刪除),dentry對象的d_inode指針為NULL。但這種dentry對象仍然保存在dcache中,以便后續對同一文件名的查找能夠快速完成。這種dentry對象在回收內存時將首先被釋放。