欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

在Linux系統用戶空間分配連續(xù)物理內存的方法與流程

文檔序號:12176885閱讀:5022來源:國知局
在Linux系統用戶空間分配連續(xù)物理內存的方法與流程

本發(fā)明涉及網絡應用交付控制領域,特別涉及一種在支持分頁的Linux系統用戶空間分配連續(xù)物理內存的通用方法。



背景技術:

Linux系統是一套免費使用和自由傳播的類Unix操作系統,是一個基于POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的UNIX工具軟件、應用程序和網絡協議。它支持32位和64位硬件。Linux繼承了Unix以網絡為核心的設計思想,是一個性能穩(wěn)定的多用戶網絡操作系統。Linux系統將自身劃分為兩部分,一部分為核心軟件(kernel),也稱作內核空間;另一部分為普通應用程序,這部分稱為用戶空間(Userspace)。用戶空間中的代碼運行在較低的特權級別上,只能看到允許它們使用的部分系統資源,并且不能使用某些特定的系統功能,也不能直接訪問內核空間和硬件設備,以及其他一些具體的使用限制。

TCP/IP協議棧(TCP/IP Protocol Stack)是一個網絡通訊模型,或稱一整個網絡傳輸協議家族,為互聯網的基礎通訊架構。這個協議家族的兩個核心協議,包括TCP(傳輸控制協議)和IP(網際協議),為這個家族中最早通過的標準。由于在網絡通訊協議普遍采用分層的結構,當多個層次的協議共同工作時,類似計算機科學中的堆棧。把TCP/IP協議棧放在Linux系統用戶空間(userspace)來運行是一種技術趨勢,由此帶來的好處有很多,例如:由于不需要修改Linux內核源代碼所以能使整個系統更穩(wěn)定,不會造成整個操作系統(Operating System,簡稱OS)的重啟進而造成系統對外提供的服務中斷。另 外,在Linux系統用戶空間運行TCP/IP協議棧還能避免GPL(General Public License,GNU通用公共授權),從而保護公司自有的軟件知識產權。

如上,若把TCP/IP協議棧放在Linux系統中的用戶空間運行,一個亟待解決的問題是:如何在用戶空間實現網卡的收包(transmit packet)和發(fā)包(receive packet)。已有技術的公開方案主要有二種:Netmap和DPDK(Intel Data Plane Development Kit,Intel數據平面開發(fā)套件)。其一,Netmap方案的設計目標是L2/L3/L4層的快速轉發(fā),當拿來做L4/L7層的負載均衡時很難避免內存拷貝,從而無法實現大流量下的高性能,不在本發(fā)明所考慮的應用環(huán)境;其二,DPDK的測試結果證明要想獲得網絡運行的高性能,就需要在Linux系統的用戶空間對網卡進行DMA(直接內存訪問,Direct Memory Access)操作。。DPDK采用Huge page可以實現在用戶空間分配連續(xù)物理內存,但是,DPDK的方案必須依賴于巨頁(huge page)的支持,處理器必須提供2M或者1G的huge page,目前只能在部分CPU上實現,很多低端CPU是不支持huge page的。

進一步地,通過huge page方法在用戶空間分配連續(xù)物理內存通常采用伙伴算法。Linux的伙伴算法是把用戶空間所有的空閑頁面分為10個塊組,每組中塊的大小是2的冪次方個頁面,例如,第0組中塊的大小都為20(1個頁面),第1組中塊的大小為都為21(2個頁面),第9組中塊的大小都為29(512個頁面)。也就是說,每一組中塊的大小是相同的,且這同樣大小的塊形成一個鏈表?;锇橄到y的宗旨就是用最小的內存塊來滿足內核的對于內存的請求。



技術實現要素:

為克服已有技術中存在的問題,本發(fā)明提出并設計了一種不依賴于huge page的在Linux系統用戶空間上分配連續(xù)物理內存的通用方法,使得任何運行在支持分頁的CPU上的Linux系統都能實現在用戶空間分配連續(xù)物理內存。

為實現上述目的,本發(fā)明特提出以下步驟:一種在Linux系統用戶空間分配 連續(xù)物理內存的方法,包括初始化步驟和分配連續(xù)物理內存步驟,所述的初始化步驟中至少包括2次用戶空間與物理內存的映射分配步驟。

其中所述初始化步驟包括:

步驟1、在用戶空間以頁為單位申請內存,將用戶空間與物理內存進行映射分配;

步驟2、對上述映射分配的頁面空間進行標注,并將所述已標注映射分配頁的物理內存地址加入到伙伴算法中;

步驟3、重復步驟1和2,直到分配的總物理內存地址滿足需求;

步驟4、從上述的伙伴算法中找出物理內存連續(xù)的內存塊地址,用戶空間與所找出物理內存連續(xù)的內存塊地址再次映射分配,生成新的映射分配并替換原映射分配后放入伙伴系統,然后計算出物理內存和新的映射分配的偏移值保存在伙伴系統中。

所述的分配連續(xù)物理內存步驟包括:

步驟1、從上述初始化步驟完成的伙伴系統中得到需要的連續(xù)物理內存的首地址;

步驟2、將上述物理內存的首地址加上所述偏移值得到虛擬地址的首地址,即完成了在用戶空間分配連續(xù)物理內存。

本發(fā)明在Linux系統用戶空間實現了物理內存分配的伙伴算法,不改動Linux內核而盡可能的實現連續(xù)物理內存分配和管理,在支持分頁平臺上運行的Linux系統都能實現,通用性強,且不需要依賴于特定的硬件。

附圖說明

圖1是本發(fā)明LINUX系統中用戶空間結構示意圖;

圖2是本發(fā)明方法流程圖;

圖3是本發(fā)明初始化步驟的一種較佳實施例流程圖。

具體實施方式

在以下的敘述中,為了使讀者更好地理解本申請而提出了許多技術細節(jié)。但是,本領域的普通技術人員可以理解,即使沒有這些技術細節(jié)和基于以下各實施方式的種種變化和修改,也是本申請各權利要求所要求保護的技術方案。

為使本發(fā)明的目的、技術方案和優(yōu)點更加清楚,下面將結合附圖對本發(fā)明的實施方式作進一步地詳細描述。

如圖1所示,本發(fā)明系統包括支持分頁的硬件設備、LINUX操作系統內核、LINUX系統調用接口及用戶空間,其中在用戶空間至少包括網絡協議棧(例如:TCP/IP、HTTP等)、系統函數庫、連續(xù)的物理內存分配頁模塊以及用戶層伙伴算法模塊等。

根據圖1所示系統,再如圖2,本發(fā)明方法具體步驟如下:

初始化的步驟:

步驟1、在用戶空間以頁為單位申請內存,將用戶空間與物理內存進行映射分配,例如,在用戶空間以頁為單位建立虛擬地址與物理地址的映射分配頁;

步驟2、對上述映射分配的頁面空間進行標注,并將所述已標注映射分配頁的物理內存地址加入到伙伴算法中;

步驟3、重復步驟1和2,直到分配的總物理內存地址滿足需求;

步驟4、從上述的伙伴算法中找出物理內存連續(xù)的內存塊地址,用戶空間與所找出物理內存連續(xù)的內存塊地址再次映射分配,生成新的映射分配并替換原映射分配后放入伙伴系統,然后計算出物理內存和新的映射分配的偏移值保存在伙伴系統中。

所述的分配連續(xù)物理內存步驟包括:

步驟1、從上述初始化步驟完成的伙伴系統中得到需要的連續(xù)物理內存的首地址;

步驟2、將上述物理內存的首地址加上所述偏移值得到虛擬地址的首地址,即完成了在用戶空間分配連續(xù)物理內存。

圖3為本發(fā)明初始化步驟的一較佳實施例,在本發(fā)明Linux系統中的用戶空間分配連續(xù)物理內存的初始化步驟如下:

步驟1、調用mmap從/dev/mem分配出一個4k的映射分配頁;對所述映射分配頁進行寫入操作,例如對該頁的第一個字節(jié)寫入1,從而確保該頁已經被分配;

步驟2、根據/proc/self/memmap映射分配得到所述映射分配頁的物理內存,并把所述物理內存加入到伙伴算法中;為了防止swapout,需要調用mlock(加密鎖)對該頁進行加鎖保護;

步驟3、判斷映射分配頁是否已滿足總物理內存的需求,如不滿足則重復步驟1-2,直到映射分配的總物理內存滿足需求;

步驟4、如映射分配的總物理內存已滿足需求,則從步驟3所述的伙伴算法 中找出物理內存連續(xù)的內存塊,進而對所述物理內存連續(xù)的內存塊通過mmap再次映射分配到新的虛擬地址,所述新的虛擬地址替換上述映射分配頁后再次傳遞給伙伴系統,然后計算出物理內存和新虛擬地址的偏移值保存在伙伴系統中。

需要說明的是,本發(fā)明各設備實施方式中提到的各單元都是邏輯單元,在物理上,一個邏輯單元可以是一個物理單元,也可以是一個物理單元的一部分,還可以以多個物理單元的組合實現,這些邏輯單元本身的物理實現方式并不是最重要的,這些邏輯單元所實現的功能的組合才是解決本發(fā)明所提出的技術問題的關鍵。此外,為了突出本發(fā)明的創(chuàng)新部分,本發(fā)明沒有引入上述各設備實施方式以及與解決本發(fā)明所提出的技術問題關系不太密切的單元,但這并不表明不存在上述設備實施方式以及其它有關實施單元。

雖然通過參照本發(fā)明的某些優(yōu)選實施方式,已經對本發(fā)明進行了圖示和描述,但本領域的普通技術人員應該明白,可以在形式上和細節(jié)上對其作各種改變,而不偏離本發(fā)明的精神和范圍。

當前第1頁1 2 3 
網友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
罗田县| 明溪县| 皋兰县| 花莲市| 文水县| 永康市| 天水市| 玛曲县| 无为县| 涿鹿县| 偏关县| 醴陵市| 湖口县| 晋宁县| 兴山县| 九龙坡区| 互助| 防城港市| 资源县| 襄汾县| 祁门县| 陵水| 芜湖市| 江陵县| 滦平县| 固镇县| 晋州市| 颍上县| 西城区| 南宫市| 远安县| 本溪| 株洲县| 张家口市| 略阳县| 常山县| 榆林市| 修水县| 双鸭山市| 开平市| 绥滨县|