日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

FreeBSD VM內(nèi)核內(nèi)存管理

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 下一頁
本文涉及到的源碼是FreeBSD5.0Release , 參考4.4BSD設(shè)計(jì)與實(shí)現(xiàn)相關(guān)章節(jié) , Matt Dillon的文章 。
VM系統(tǒng)涉及的主要數(shù)據(jù)結(jié)構(gòu)描述
1. vmspace
該結(jié)構(gòu)用于描述一個(gè)進(jìn)程的虛擬地址空間 , 其包含了平臺(tái)無關(guān)性的vm_map結(jié)構(gòu)和平臺(tái)相關(guān)性的pmap結(jié)構(gòu) , 以及該進(jìn)程內(nèi)存使用的一些統(tǒng)計(jì)計(jì)量 。
2. vm_map
該結(jié)構(gòu)是描述與平臺(tái)無關(guān)性的虛擬地址空間的最高層數(shù)據(jù)結(jié)構(gòu) , 其包含了一系列虛擬地址有效地址映射實(shí)體和這些映射的屬性 。
3. vm_map_entry
該結(jié)構(gòu)描述了一段虛擬地址空間(start – end) , 以及該段地址空間代表的是一種VM對(duì)象、另一個(gè)地址映射還是一個(gè)地址子映射 , 及其相應(yīng)的共享保護(hù)和繼承等屬性 。
4. vm_object
【FreeBSD VM內(nèi)核內(nèi)存管理】該結(jié)構(gòu)描述了一段虛擬地址空間的數(shù)據(jù)來源 , 它可以描述一個(gè)文件、一段為零的內(nèi)存和一個(gè)設(shè)備等等 。
5. vm_page
該結(jié)構(gòu)描述了一頁物理內(nèi)存 , 是VM用于表述物理內(nèi)存的低層數(shù)據(jù)結(jié)構(gòu) 。頁尺寸是在系統(tǒng)啟動(dòng)時(shí) , 由平臺(tái)決定的 。
6. pagerops (vm_pager)
該結(jié)構(gòu)描述了VM對(duì)象的后臺(tái)存儲(chǔ)如何訪問 , 在FreeBSD中 , 是通過pagerops結(jié)構(gòu)描述函數(shù)指針 , 實(shí)現(xiàn)不同類型的對(duì)象的具體操作 , 在vm_object結(jié)構(gòu)中 , 通過handle成員指定具體類型對(duì)象對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu) , 比如設(shè)備類型對(duì)應(yīng)dev_t (cdev結(jié)構(gòu)指針) 。在一般OS描述中 , 采用vm_pager描述該目的的數(shù)據(jù)結(jié)構(gòu) 。
本文集中討論FreeBSD內(nèi)核虛擬地址空間的管理 , 涉及到內(nèi)核地址空間分配和內(nèi)核地址空間動(dòng)態(tài)分配 。FreeBSD的內(nèi)核空間總是被映射到每一個(gè)進(jìn)程的地址空間的最高部分 。和任何其它進(jìn)程一樣 , 內(nèi)核也是通過包含一系列的vm_map_entry結(jié)構(gòu)實(shí)體的vm_map結(jié)構(gòu)來管理一段地址空間的使用 。子映射是內(nèi)核映射特有的 , 用于隔離、限制一段地址空間以提供給內(nèi)核子系統(tǒng)使用 , 比如mbuf操作 。本文主要討論與平臺(tái)無關(guān)性的內(nèi)容 , 涉及到平臺(tái)相關(guān)性時(shí) , 以i386為例簡要說明 。
1. SI_SUB_VM初始化
在系統(tǒng)啟動(dòng)時(shí) , mi_startup()函數(shù)會(huì)調(diào)用SI_SUB_VM初始化與平臺(tái)無關(guān)的VM系統(tǒng) , 其定義是:“SYSINIT(vm_mem, SI_SUB_VM, SI_ORDER_FIRST, vm_mem_init, NULL) 。在vm_mem_init函數(shù)初始化之后 , 我們就只使用虛擬內(nèi)存了 , 現(xiàn)在分析該函數(shù)的實(shí)現(xiàn):
vm_set_page_size();
該函數(shù)設(shè)置頁面尺寸 , i386是PAGE_SIZE(4K) , 記錄在系統(tǒng)統(tǒng)計(jì)vmmeter結(jié)構(gòu)類型的全局變量cnt的v_page_size成員中 。
virtual_avail = vm_page_startup(avail_start, avail_end, virtual_avail);

    推薦閱讀