1. 程式人生 > >虛擬存儲器摘總

虛擬存儲器摘總

after 關系 層次結構 sdn file tlb inux 一個 權限

虛擬內存

http://www.cnblogs.com/feng9exe/p/6379686.html

來理解一下虛擬地址映射的過程:拿到一個虛擬地址,根據已有的vm_area_struct看這個虛擬地址是否屬於某個vm_area_struct

  • 如果沒有匹配到,就報段錯誤,訪問了一個沒有分配的虛擬地址。
  • 如果匹配到了vm_area_struct,根據虛擬地址和頁表的映射關系,找到對應的頁表項PTE,如果PTE沒有分配,就報一個缺頁異常,去加載相應的文件數據到物理內存,如果PTE分配,就去相應的物理頁的偏移位置讀取數據

所以虛擬頁的三種狀態的實際含義如下:

  • 未分配虛擬頁,指的是沒有使用mmap建立vm_area_struct,所以也就沒有對應到具體的頁表項
  • 已分配虛擬頁,未映射到物理頁,指的是已經使用了mmap建立的vm_area_struct,可以映射到對應的頁表項,但是頁表項沒有指向具體的物理頁
  • 已分配虛擬頁,已映射到物理頁,指的是已經使用了mmap建立的vm_area_struct,可以映射到對應的頁表項,並且頁表項指向具體的物理頁

mmap要麽映射到一個後備文件,要麽映射到一個匿名文件。操作系統分配物理內存時實際用到了匿名文件的mmap。

2. vm_page_prot 表示這個區域的頁的訪問權限

http://blog.csdn.net/xu3737284/article/details/12710217

linux操作系統是通過sys_exec對可執行文件進行映射以及讀取的,有如下幾步:

  1.創建一組vm_area_struct

  2.圈定一個虛擬用戶空間,將其起始結束地址(elf段中已設置好)保存到vm_start和vm_end中。

  3.將磁盤file句柄保存在vm_file中

  4.將對應段在磁盤file中的偏移值(elf段中已設置好)保存在vm_pgoff中;

  5.將操作該磁盤file的磁盤操作函數保存在vm_ops中

http://blog.csdn.net/al_xin/article/details/38590931

一個具體區域結構包含下面的字段:

  • vm_start:指向這個區域的起始處。
  • vm_end:指向這個區域的結束處。
  • vm_prot:描述這個區域的內包含的所有頁的讀寫許可權限。
  • vm_flags:描述這個區域內頁面是與其他進程共享的,還是這個進程私有的(還描述了其他一些信息)。
  • vm_next:指向鏈表中下一個區域結構。

http://blog.csdn.net/chen98765432101/article/details/54881652

縮寫解釋:

VA:虛擬地址

VPN:虛擬頁號

PTE:頁表項

PTEA:頁表項地址

PA:物理地址

DATA:數據

MMU:內存管理單元

TLB:地址翻譯緩沖器

設置存儲器層次結構主要是為了緩存低速的存儲器。主存是對磁盤等設備的緩存,cache是對主存的緩存,tlb是對主存頁表的緩存。

http://www.cnblogs.com/feng9exe/p/6379650.html

struct mm_struct
{
struct vm_area_struct *mmap; /* list of VMAs */
struct rb_root mm_rb;
struct vm_area_struct *mmap_cache; /* last find_vma result */
...
unsigned long start_code, end_code, start_data, end_data;
unsigned long start_brk, brk, start_stack;
...
};

struct vm_area_struct
{
struct mm_struct *vm_mm; /* The address space we belong to. */
unsigned long vm_start; /* Our start address within vm_mm. */
unsigned long vm_end; /* The first byte after our end address
within vm_mm. */
....
/* linked list of VM areas per task, sorted by address */
struct vm_area_struct *vm_next;
....
/* describe the permissable operation */
unsigned long vm_flags;
/* operations on this area */
struct vm_operations_struct * vm_ops;

struct file * vm_file; /* File we map to (can be NULL). */
} ;

虛擬存儲器摘總