摘要
我想各位讀者應該對於 Linux 上的動態函式庫的架構有了進一步的了解
筆者根據自己電腦 Linux 的記憶體配置畫了下面的架構圖
相信會讓有心了解整個運作的人
有了更清楚的一個印象
結束語
最後
我想各位讀者應該對於 Linux 上的動態函式庫的架構有了進一步的了解
筆者根據自己電腦 Linux 的記憶體配置畫了下面的架構圖
相信會讓有心了解整個運作的人
有了更清楚的一個印象
在這張圖中
我們所執行的程序是由記憶體
x
開始載入的
而所用到的動態函式庫則是在記憶體位置
x
開始載入
以筆者的電腦為例
動態函式庫載入的記憶體映射情況大略為
/usr/share/locale/en_US/LC_MESSAGES/SYS_LC_MESSAGES
/usr/share/locale/en_US/LC_MONETARY
/usr/share/locale/en_US/LC_TIME
b
/lib/libnss_files
so
b
c
/lib/libnss_files
so
c
f
/lib/libc
so
f
fb
/lib/libc
so
fb
ff
ff
/lib/ld
so
/lib/ld
so
b
/lib/libnss_nisplus
so
┅(more)
若我們程序透過 malloc 配置動態的記憶體
則會配置在標示為
Free Space
的記憶體空間中
程序所用到的堆疊(Stack) 是由
xbfffffff 開始
往下延伸
而在記憶體位置
xc
以上
則是屬於 Kernel Mode 的部分
這部份包含了Linux Kernel 的 Image 以及我們之後所動態載入的模組
文章到此正式結束了
讀者若有任何的問題或是這篇文章有任何疏漏的部份
歡迎各位可以來信指教
謝謝各位
^_^My E
Mail:
tw
注一:(~mcculley/mapself/)筆者在寫這篇文章時
在一個網頁上看到一個很有意思的記憶體區塊拷貝效率比較
我們知道在Linux下面如果要把記憶體區塊由 A 拷貝到 B
我們除了可以使用memcpy來完成以外
還可以透過mmap來開啟檔案/proc/self/mem
來完成拷貝記憶體區塊的目的
舉個例子來說
如果我們要把記憶體區塊由A拷貝到B共 chunksize 個bytes
可以透過如下的寫法
memcpy(B
A
chunksize);
透過 mmap 來做的話
可以藉由以下的寫法
int self;
self = open(
/proc/self/mem
O_RDONLY);
B = mmap(B
chunksize
PROT_READ | PROT_WRITE
MAP_PRIVATE | MAP_FIXED
self
(off_t)A);
也就是透過 Linux 提供給每個 Process 的記憶體裝置檔案 mem
來完成記憶體的拷貝動作
不過
雖然我們可以有這兩種方法可以選擇
可是遇到要拷貝記憶體時
卻不免會遇到要選擇何種方式來實做的問題
因此該網頁的作者寫了一個小程序來測試這兩種方式的優缺點
首先在 Linux 上每個記憶體的 Page 大小為
bytes
因此測試時就是利用
bytes為單位來逐漸增加測試的記憶體區塊大小
每個階段都有一個固定的記憶體區塊大小
與兩個內容不同的記憶體區塊作為拷貝時的來源端
每一個循環都會先拷貝一個來源端到目的的記憶體區塊中
再比較內容
若相同
則拷貝另一個來源端的資料到目的的記憶體區塊中
再比較內容
如此重復
次(表示共拷貝了
次到目的記憶體區塊中)
藉此來比較 memcpy 與 mmap 在執行記憶體區塊拷貝時的效率
如下表(筆者電腦配備: PII
MB RAM)
memcpy mmap
我們不難發現當記憶體區塊為
時
memcpy 都勝過mmap
不過當拷貝的記憶體區塊越來越大時
mmap 明顯表現的相當有效率
像最後測試的記憶體區塊大小為
bytes
mmap 相較於 memcpy所花的時間少了約
秒鐘
由此我們可以了解到
如果在 Linux 上我們所撰寫的系統需要使用較大的記憶體區塊拷貝時
透過 mmap 來作或許是一個不錯的選擇
From:http://tw.wingwit.com/Article/program/Oracle/201311/16613.html