歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

一步一步學Linux C:讓系統更安全之鎖定內存

Linux 實現了請求頁面調度,頁面調度是說頁面從硬盤按需交換進來,當不再需要的時候交換出去。這樣做允許系統中每個進程的虛擬地址空間和實際物理內存的總量再沒有直接的聯系,因為在硬盤上的交換空間能給進程一個物理內存幾乎無限大的錯覺。

交換對進程來說是透明的,應用程序一般都不需要關心(甚至不需要知道)內核頁面調度的行為。然而,在下面兩種情況下,應用程序可能像影響系統的頁面調度:

確定性(Determinism)

時間約束嚴格的應用程序需要確定的行為。如果一些內存操作引起了頁錯誤,導致昂貴的磁盤操作,應用程序的速度便不能達到要求,不能按時做計劃中的操作。如果能確保需要的頁面總在內存中且從不被交換進磁盤,應用程序就能保證內存操作不會導致頁錯誤,提供一致的,可確定的程序行為,從而提供了效能。

安全性(Security)

如果內存中含有私人秘密,這秘密可能最終被頁面調度以不加密的方式儲存到硬盤上。

例如,如果一個用戶的私人密鑰正常情況下是以加密的方式保存在磁盤上的,一個在內存中為加密的密鑰備份最後保存在了交換文件中。在一個高度注重安全的環境中,這樣做可能是不能被接受的。這樣的應用程序可以請求將密鑰一直保留在物理內存上。當然,改變內核的行為會導致系統整體性能的負面影響。當頁面被鎖定在內存中,一個應用程序的安全性可能提高了,但這能使得另外一個應用程序的頁面被交換出去。www.linuxidc.com 如果內核的設計是值得信任的,它總是最優地將頁面交換出去(看上去將來最不會被使用的頁面)。

如果用戶不希望某塊內存在暫時不用時置換到磁盤上,可以對該內存進行內存鎖定。

相關函數如下:

  1. #include <sys/types.h>   
  2.   
  3. int mlock(const void *addr,size_t length)  
  4.   
  5. int munlock(void *addr,size_t length)  
  6.   
  7. int mlockall(int flag)  
  8.   
  9. int munlockall(void  )

函數:mlock鎖定一片內存區域,addr為內存地址,length要鎖定的長度。

munlock接觸已鎖定的內存

mlockall一次鎖定多個內存頁。flag取值有兩個MCL_CURRENT鎖定所用內存頁,MCL_FUTURE鎖定為進程分配的地址空間內存頁。munlockall用於解除鎖定的內存。

注:只有超級用戶才能進行鎖定和解除內存操作。

Copyright © Linux教程網 All Rights Reserved