《深入Linux內核架構》第3章 內存管理(6)

目錄

3.5.7 內核中不連續頁的分配

3.5.8 內核映射


本專欄文章將有70篇左右,歡迎+關注,訂閱后續文章。

本節講解vmalloc, vmap,kmap原理。

3.5.7 內核中不連續頁的分配

kmalloc函數:分配物理地址和虛擬地址都連續的內存。

????????kmalloc基于slab,而slab基于伙伴系統。

void *vmalloc(unsigned long size);

? ? ? ? 介紹:

????????????????分配一大片連續虛擬內存,但其物理地址不一定連續。

????????使用場景:

????????????????需要分配很大一塊內存。如模塊加載時。

????????優點:

????????????????更有效利用內存,減少內存分配失敗。

????????缺點:

????????????????但TLB表項增多,TLB cache miss增加。

????????應用進程使用的內存:通常不要求物理連續。

vmalloc分配的虛擬內存如下圖:

vmalloc區域之間插入1頁安全隙,其沒有對應物理頁表項。

如果程序無意訪問到安全隙時,觸發段錯誤機制。阻止潛在的安全威脅或系統崩潰。

vmalloc函數會生成一個sturct vm_struct實例。用于描述vmalloc分配的區域。

struct vm_struct {

????????struct vm_struct ????????*next;? ? ? ? ? ? //連接所有實例,表頭為struct vm_struct *vmlist

????????void ????????????????????????*addr;? ? ? ? ? ? ? //起始的虛擬地址。

????????unsigned long ????????size;? ? ? ? ? ? ? ? ?//該區域大小。

????????unsigned long ????????flags;

????????struct page? ? ? ? ? ? ? **pages;? ? ? ? ? ?//指向page數組,映射源自哪些物理頁。

????????unsigned int? ? ? ? ? ? nr_pages; ????????//包含有多少個物理頁。

????????phys_addr_t? ? ? ? ? ?phys_addr; ????????//ioremap使用,其物理地址。

????????const void? ? ? ? ? ? ? *caller;

};

flags:

????????VA_ALLOC:表示該區域由vmalloc函數建立。

????????VA_MAP:表示該區域由vmap函數建立。

????????VM_IOREMAP:表示該區域由ioremap函數建立。

vmap,ioremap,vmalloc三個函數:

? ? ? ? 1. 都用于建立物理地址非連續的映射。

? ? ? ? 2. 都會生成一個struct vm_struct實例,用flag成員區別。

全局變量struct vm_struct *vmlist鏈表頭,鏈接所有vm_struct。

分配內存

vmalloc實現:

get_vm_area_node:

????????創建vm_struct實例,并分配虛擬內存。

__vmalloc_area_node:

????????分配對應物理頁。

????????初始化vm_struct的pages,nr_pages成員。

????????調用map_vm_area:將分散物理頁映射到連續虛擬空間。

vmalloc的實現中使用了__GFP_HIGHMEM:

????????表示盡可能從ZONE_HIGHMEM分配頁。

當分配頁后,應從對應節點伙伴系統中移除。

其他映射方法

下面函數也可創建虛擬連續的映射:

????????vmalloc_32:

????????????????分配的物理內存總是可以用32位指針尋址。

????????vmap函數:

????????????????將一個page數組映射到連續虛擬地址空間。

????????????????該函數不分配頁,需提前分配好。

????????????????用VM_MAP標識。

????????ioremap:

????????????????體系架構自己實現。將硬件IO空間映射到內核空間。

????????????????用VM_IOREMAP標識,驅動中多使用。

釋放內存

vfree:

????????釋放vmalloc,vmalloc_32分配的內存。

????????將頁返回伙伴系統。

vunmap:

????????釋放vmap,ioremap創建的映射。

????????不會將頁返回伙伴系統。

上述兩個函數最終都調用__vunmap

3.5.8 內核映射

除vmalloc,其他將ZONE_HIGHMEM域到內核空間的方式:

永久內核映射(pkmap):

????????pkmap:Permanent Kernel MAPping。

????????作用:為指定高端內存頁創建永久映射到內核空間,直到手動解除映射。

????????內核空間范圍:

????????????????PKMAP_BASE - FIXADDR_START區域

創建一個永久內核映射:

????????void *kmap(struct page *page)

????????{

????????????????if (!PageHighMem(page))

????????????????????????return page_address(page); 沒有高端內存時,簡單的將頁轉換為虛擬地址。

????????

????????????????return kmap_high(page);

????????}

解除永久映射:

????????void kunmap(struct page *page)

????????????????內容:解除映射,刪除頁表,刷出TLB。

過多kmap映射可能導致內存碎片和性能問題。

避免頻繁使用kmap。

kmap和vmap區別:

????????kmap:單頁的映射。

????????????????短時間的映射。

????????vmap:多個頁映射。(將一組不連續物理頁映射到連續虛擬地址)。

????????????????長時間的映射。

kmap:若pkmap數組沒有空閑位置,會睡眠,所以不能在中斷中使用。

此時應使用kmap_atomic與kunmap_atomic。

在64位體系架構沒有高端內存,此時kmap,kunmap,kmap_atomic,kunmap_atomic函數名一樣,但實現不一致。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11286.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11286.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11286.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MongoDB聚合運算符:$type

MongoDB聚合運算符&#xff1a;$type 文章目錄 MongoDB聚合運算符&#xff1a;$type語法使用可用的類型 舉例 $type聚合運算符用來返回指定參數的BSON類型的字符串。。 語法 { $type: <expression> }<expression>可以是任何合法的表達式。 使用 不像查詢操作符$…

Selenium + Pytest自動化測試框架實戰(上)

前言 今天呢筆者想和大家來聊聊selenium自動化 pytest測試框架&#xff0c;在這篇文章里你需要知道一定的python基礎——至少明白類與對象&#xff0c;封裝繼承&#xff1b;一定的selenium基礎。這篇文章不會selenium&#xff0c;不會的可以自己去看selenium中文翻譯網喲。 一…

六西格瑪管理培訓公司:事業進階的充電站,助你沖破職場天花板!

六西格瑪&#xff0c;源于制造業&#xff0c;卻不僅僅局限于制造業。它是一種以數據為基礎、以顧客為中心、以流程優化為手段的全面質量管理方法。通過六西格瑪管理&#xff0c;企業可以系統性地識別并解決運營過程中的問題&#xff0c;提高產品和服務的質量&#xff0c;降低成…

導航app為什么知道還有幾秒變綠燈?

在使用地圖導航app行駛至信號燈的交叉路口時&#xff0c;這些應用程序會貼心地告知用戶距信號燈變化還有多少秒&#xff0c;無論是即將轉為綠燈還是紅燈。這一智能化提示不僅使得駕駛員能適時做好起步或剎車的準備&#xff0c;有效緩解了因等待時間不確定而產生的焦慮情緒&…

GBPC2510-ASEMI工業電源專用GBPC2510

編輯&#xff1a;ll GBPC2510-ASEMI工業電源專用GBPC2510 型號&#xff1a;GBPC2510 品牌&#xff1a;ASEMI 封裝&#xff1a;GBPC-4 最大重復峰值反向電壓&#xff1a;1000V 最大正向平均整流電流(Vdss)&#xff1a;25A 功率(Pd)&#xff1a;中小功率 芯片個數&#x…

分布式鎖之RedissonLock

什么是Redisson&#xff1f; 俗話說他就是看門狗&#xff0c;看門狗機制是一種用于保持Redis連接活躍性的方法&#xff0c;通常用于分布式鎖的場景。看門狗的工作原理是&#xff1a;當客戶端獲取到鎖之后&#xff0c;會對Redis中的一個特定的鍵設置一個有限的過期時間&#xff…

[附源碼]傳世手游_玲瓏傳世_GM_安卓搭建教程

本教程僅限學習使用&#xff0c;禁止商用&#xff0c;一切后果與本人無關&#xff0c;此聲明具有法律效應&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人親自搭建成功的&#xff0c;絕對是完整可運行的&#xff0c;踩過的坑都給你們填上了。 如果你是小白也沒…

C++ 509. 斐波那契數

文章目錄 一、題目描述二、參考代碼 一、題目描述 示例 1&#xff1a; 輸入&#xff1a;n 2 輸出&#xff1a;1 解釋&#xff1a;F(2) F(1) F(0) 1 0 1 示例 2&#xff1a; 輸入&#xff1a;n 3 輸出&#xff1a;2 解釋&#xff1a;F(3) F(2) F(1) 1 1 2 示例 3…

設計模式——訪問者模式(Visitor)

訪問者模式&#xff08;Visitor Pattern&#xff09;是一種將數據操作與數據結構分離的設計模式。這種模式適用于數據結構相對穩定&#xff0c;而操作算法經常改變的情況。訪問者模式將數據結構&#xff08;穩定的部分&#xff09;中的元素&#xff08;Element&#xff09;的訪…

C語言題目:一元二次方程

題目描述 解一元二次方程ax^2bxc0的解。 輸入格式 a,b,c的值。 輸出格式 輸出兩個解&#xff0c;按照大小順序輸出&#xff0c;一個解時需要打印兩次&#xff0c;不用考慮無解問題&#xff0c;保留兩位小數 樣例輸入 1 5 -2樣例輸出 0.37 -5.37 代碼解析 首先&#xff0…

了解進程和線程

一、進程和線程 類比&#xff1a; 一個工廠&#xff0c;至少有一個車間&#xff0c;一個車間中至少有一個工人&#xff0c;最終是工人在工作。 一個程序&#xff0c;至少有一個進程&#xff0c;一個進程中至少有一個線程&#xff0c;最終是線程在工作。 進程&#xff1a;是計…

C#正則表達式,提取信息使用

正則表達式簡介 在C#中&#xff0c;正則表達式&#xff08;Regular Expression&#xff0c;通常簡寫為regex或regexp&#xff09;是一種功能強大的文本處理工具&#xff0c;它使用特定的字符序列來定義搜索模式&#xff0c;從而實現對文本的高效搜索、匹配和替換操作。正則表達…

鄉村振興與鄉村旅游深度融合:依托鄉村自然和文化資源,發展鄉村旅游產業,促進農民增收致富,打造特色美麗鄉村

目錄 一、引言 二、鄉村振興與鄉村旅游的內在聯系 三、依托鄉村自然和文化資源發展鄉村旅游產業 &#xff08;一&#xff09;挖掘鄉村自然資源優勢&#xff0c;打造特色旅游品牌 &#xff08;二&#xff09;挖掘鄉村文化資源內涵&#xff0c;豐富旅游活動內容 四、促進農…

新手做視頻號電商,做什么樣的產品好賣?適合不會選類目的新手看

大家好&#xff0c;我是電商花花&#xff0c;專注做電商的花花。 視頻號現在的發展可以說是非常好的&#xff0c;擁有著空前的市場和流量&#xff0c;隨著視頻號小店新項目對電商的沖擊&#xff0c;讓更多創業者和新手商家開始涌入視頻號電商的行列。 想要在新項目中搶占流量…

【客戶案例】禪道軟件助力長虹新網實現研發項目管理創新

四川長虹新網科技有限責任公司&#xff08;以下簡稱長虹新網&#xff09;深耕全球運營商市場二十多年&#xff0c;具備行業領先的軟硬件研發、制造、全球化市場營銷能力&#xff0c;持續服務國內外200多家主流電信及廣電運營商、垂直行業服務商&#xff0c;與合作伙伴共同成長。…

Windows11系統安裝Mysql8之后,啟動服務net start mysql報錯“服務沒有響應控制功能”的解決辦法

問題 系統環境&#xff1a;Windows11 數據庫版本&#xff1a;Mysql8 雙擊安裝&#xff0c;一路下一步&#xff0c;完成&#xff0c;很順利&#xff0c;但是開啟服務后 net start mysql 報錯&#xff1a; 服務沒有響應控制功能。 請鍵入 NET HELPMSG 2186 以獲得更多的幫助 不…

【項目001】運維工程師項目實踐:高可用性云基礎設施部署與升級項目

目錄 項目名稱 項目背景 項目目標 項目成果 我的角色與職責 我主要完成的工作內容 本次項目涉及的技術 本次項目遇到的問題與解決方法 本次項目中可能被面試官問到的問題 1、什么是ELK&#xff1f; 2、什么是Elasticsearch、Logstash 和Kibana&#xff1f; 3、ELK 三…

echarts樹圖 改文本顯示的地方的樣式

樹圖改文本顯示的時候的樣式 雖然有點越改越丑 其中有一些失敗的嘗試 forammter 無法識別html元素 所以對于tooptips有用的html元素定義獲取返回在這里寫的話是不生效的 rich配置項里面的backgroundColor官方說支持 html元素和canvas元素 已經圖片url 沒有詳細試驗 官網地址 h…

【chisel】如何用chisel寫一個上升沿檢測程序

自定義上升沿檢測 class RisingEdgeDetector extends Module {val io IO(new Bundle {val inSig Input(Bool())val outSig Output(Bool())val clock Input(Clock())})// 定義 risingedge 函數def risingedge(x: Bool): Bool x && !RegNext(x)// 使用 risingedge …

代碼簽名證書的重要作用及申請途徑

代碼簽名技術是一種確保軟件完整性和來源可信度的安全措施。它通過數字證書和加密算法為軟件代碼或可執行文件加上一個“簽名”&#xff0c;以此驗證軟件未被篡改&#xff0c;并確認其來源于可信賴的開發者。 一、代碼簽名證書的重要作用 1、提高下載率和安裝率&#xff1a;用…