最近在調試TI的DM36x驅動,因爲我們得通過FPGA往記錄盤裏寫數據,因爲數據量比較大,如果每一幀數據都通過write的方式進行,驅動會調用到
copy_from_user函數,這樣對CPU性能以及帶寬都是一個非常大的挑戰!
後來改成內存映射的方式,mmap,看起來很簡單的一個操作卻折騰了好一陣子!
操作是這樣的,首先,內核通過kmalloc操作得到一塊連續的內存,然後通過vma—mmap操作把這塊內心映射給用戶層使用,
用戶層通過一定的方式往這塊內存寫數據,大部分情況下,內核得到的數據是正確的,但是極少數情況,內核的數據和用戶層數據不一致!
後來經過debug,得到是因爲cache的原因,用戶層數據和內核數據不一致!
其實,在內核裏面我是做了pgprot_noncached操作的!
最後上網找到一篇博客:
http://blog.csdn.net/dianhuiren/article/details/6896129
寫得很詳細,得調用
ioremap_nocache,內核讀數據就直接爲內存中的數據,而不是cache中的數據,這樣數據就一致了