熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Linux 動態函式庫解析(四)

2022-06-13   來源: Oracle 

  摘要我想各位讀者應該對於 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_filesso
  bc /lib/libnss_filesso
  cf /lib/libcso
  ffb /lib/libcso
  fbff
  ff /lib/ldso
   /lib/ldso
  b /lib/libnss_nisplusso ┅(more)
  
    若我們程序透過 malloc 配置動態的記憶體則會配置在標示為 Free Space的記憶體空間中程序所用到的堆疊(Stack) 是由 xbfffffff 開始往下延伸
  
    而在記憶體位置 xc 以上則是屬於 Kernel Mode 的部分這部份包含了Linux Kernel 的 Image 以及我們之後所動態載入的模組
  
    文章到此正式結束了讀者若有任何的問題或是這篇文章有任何疏漏的部份歡迎各位可以來信指教謝謝各位^_^My EMail: 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 明顯表現的相當有效率像最後測試的記憶體區塊大小為 bytesmmap 相較於 memcpy所花的時間少了約 秒鐘
  
    由此我們可以了解到如果在 Linux 上我們所撰寫的系統需要使用較大的記憶體區塊拷貝時透過 mmap 來作或許是一個不錯的選擇
  

From:http://tw.wingwit.com/Article/program/Oracle/201311/16613.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.