2014年12月26日 星期五

[慣C] Share memory memo

IPC 共享技巧之一

慣C必備的工具書裡面就有說明,網路牽狗來跑一跑也很多資料
像:
https://www.google.com.tw/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=shared+memory&lr=lang_zh-TW
http://lazyflai.blogspot.tw/2007/08/linux-shared-memory.html
http://fecbob.pixnet.net/blog/post/42774184-linux-ipc%E2%80%94%E2%80%94shared-memory

打完收工!!!




ㄜ! 這樣好像太敷衍,多說一點好了...

首先不管書上還是網路上的範例都是用 fork 來當作一個範例講解,事實上只要我們能取得shared memory 的 ID
就算A 程式已經結束,B程式還是可以在記憶體尚未被釋放的前提下取得共享的內容,甚至進行修改。

簡單寫一下,程式碼就不放blog,github 方便些。(迷之音:是因為不會貼漂漂亮亮的程式碼吧)
https://github.com/BejoTW/for_blog/tree/master/share_memory


程式 A init 執行並結束
# ./init
shmID = 5636108

--
(天荒地老時間通過.....泡茶聊天沒關係,資料都還在記憶體裡)
--

程式B 輸入記憶體ID
# ./get 5636108
get share ID = 5636108
wrote by Bejo
second line

拿到資料。

怎麼會這麼無聊寫這個? 其實是因為一個 nvram issue,

nvram 是什麼?
嵌入式工程師其實會常常看到的關鍵字,不管是滿滿open 的 Linux embedded 還是愛恨交加的Cisco IOS router, 都可以看到他的名字

就是一塊重開機還會存在的記憶體 - non-volatile memory

通常會在flash 切割一塊MTD空間,裡面作一塊文字檔空間,要不要加密看RD了,存放裝置的設定值,像device name, config ... 三小的

結合MTD 的讀寫function 就可以作出一塊嵌入式必備的功能,開機時把設定讀出來,有修改就回存進去。

這邊不大方便把案子的source code 搬上來筆記,那編寫的就是個簡單的神似範例好了。是的...超簡單。

把一個檔案讀出來(自行想像接到MTD source, X86 示範表示無奈...),映射到記憶體,放到share 空間,
B檔案進行讀取操作。

這樣帶來一些好處:

1. 實作簡單 - MTD 讀取寫入API接完幾乎就結束了,大概半天coding 時間就可以擁有一個nvram 完整功能。
2. 放在記憶體空間操作速度快,應該沒有人會作MTD 瘋狂讀寫操作吧 (mount 起來的RW不算...)
3. 取用方便,包成.so 檔,不需要常駐daemon

缺點:
1. detach attach 要確實,這次issue 噴在這裡,有人黑手腳,可惡。
2. MTD 寫入時間過長,寫回MTD時斷電,那下次開機就是毀損狀態 ->解: 另外寫 MTD heath 照顧程式

總之,減少硬體操作機會,放到記憶體空間是一個較佳的選擇。

後記:
嘿!!! 阿笨,這筆記給你的,乖乖看喔。