• 沒有找到結果。

緩衝區的組織與配置

第二章 設計與實作

2.1 緩衝區的組織與配置

text initialized data uninitialized data (bss)

unallocated region

kernel space

high address low address

initialized to zero by exec read from program file by exec

normally allocated with brk or sbrk

normally allocated with mmap

heap heap

stack

stack automatically grown

up by kernel

圖2-1 一個 FreeBSD 程序對虛擬記憶體空間的使用狀況

時下的作業系統提供每個程序(process)分別獨立的虛擬位址空間 (virtual address space)。以 FreeBSD 為例,如圖 2-1 所示,在這虛擬位址空 間中,堆疊區存在於使用者程序位址空間的高位址區域;而堆積區存在於 本文區與靜態資料區(包含已被初始化與未初始化的資料)之後。在堆疊 區與堆積區中間為未配置實體記憶體的區域,這塊區域被存取時因為無法 對應到實際的記憶體,故會產生區段違反存取訊號(segment violation signal, SIGSEGV)。堆積區一般透過系統函式brksbrk向高位址增長;堆疊區

則由作業系統內部自動配置並向低位址增長。這些增長通常是連續的,即 是說,新配置的記憶體區塊將與之前配置的記憶體區塊相鄰。

除此原來的堆積區與堆疊區增長方式外,還可利用系統函式mmap直接 在未配置實體記憶體區段進行配置。原來的用法是為了映射裝置或檔案到 配置的記憶體位址空間中,方便利用記憶體直接對裝置或檔案進行存取。

除此之外,mmap亦被用在建構共享記憶體與跨程序通訊機制。

另一方面mmap也可用來配置位址空間給實體記憶體。相比於透過 brk/sbrk的只能連續配置記憶體的運作方式,mmap可以指定記憶體區塊 配置的起始位址,即是說允許新區塊不需要與任何舊區塊相鄰。因此得以 進行非連續地配置記憶體空間的動作。BODAR 利用了這個能力,使緩衝區 與緩衝區之間都保有一段未配置實體記憶體的區段,用來阻斷溢位存取到 下一個緩衝區。

forbidden page 1st page

...

(several pages) (N+1)th page

spare region (several pages)

buffer

low address

high address

guard region allocated region

allocated region

guard region

allocated region

guard region low address

high address

圖2-2 BODAR 緩衝區的組織方式

為了能正確偵測溢位,緩衝區起始位址須小心調整。假設要配置的緩 衝區大小等於N 個分頁,則起始位址恰好為第一個分頁開頭;若大於 N 個 分頁並小於N+1 個分頁,則起始位址將被往後位移,使得緩衝區的末端能

夠恰好對齊第N+1 個分頁的末端,見圖 2-2。如此可見超出緩衝區的存取

The K-th allocation

S S

guard region:

(M-N)/2 unallocated pages

F F

guard region:

(M-N)/2 unallocated pages buffer C

buffer A

N pages

The (K+1)-th allocation

S S buffer B

S F

buffer A S buffer B

guard region: M unallocated pages guard region:

M unallocated pages

guard region:

M unallocated pages high address

guard region:

M unallocated pages guard region:

M unallocated pages high

續配置模式的區域,用來當找不到空間時的配置之用,在這區域中仍提供 BODAR 的恢復與保護的機制,但緩衝區的備用區域被固定為只有一個分頁 的大小。

原先作業系統管理堆疊區機制是透過建表(table),表中的項目(entry)存 放一個指向資料結構指標,資料結構維護該項目所對應的分頁的資訊,由 於是以分頁起始端的位址作為項目索引,故其為相當有效率的一個實作方 式。但在BODAR 設計概念上,因為緩衝區與緩衝區間相隔相當大的未配 置區域,若仍套用原先的管理方法,未配置區域中的分頁仍會佔用表中的 一個項目,造成表的大小暴增。這種情況可預見在64 位元的電腦上會更嚴 重。我們估計在64 位元電腦上的位址空間約為 131035 GB,若採用原先方 法,則第一次配置於位址空間的中間就會花掉17175019520 個項目,一個 項目需要8 位元組存放指標,會佔用約 128 GB 的實體記憶體空間。所以 BODAR 改採 AVL 樹來管理緩衝區記憶體配置。以緩衝區為單位取代原先 以分頁為單位,每個樹節點存放一個緩衝區資訊,並以該緩衝區起始位址 為節點鍵值,如此將能大幅減少管理所佔用的記憶體並有不錯的效能。

相關文件