內核中的內存申請:kmalloc、vmalloc、kzalloc、get_free_pages 之間的區別

kmalloc ? vmalloc ? kzalloc ? get_free_page()是內核空間申請內存空間函數

malloc是用戶空間申請內存函數

?

一 ,kmalloc()?與 kfree()? 和get_free_page的區別

1,用于申請較小的、連續的物理內存:使用的是內存分配器slab一小片。申請的內存位于物理內存的映射區域。其正真的物理地址只相差一個固定的偏移。

?? 可以用這兩個宏來簡單轉換 __pa(address)??{virt_to_phys()} 和 ?__va(address){phys_to_virt()}

?? get_free_page()申請的內存是一整頁,一頁的大小一般是128K。它們的區別只有這一點不同,其它的都相同。

?? 本質上講,kmalloc()和get_free_page()最終調用實現都是相同的,只不過在調用最終函數時所傳的flag不同而以。

2. void *kmalloc(size_t size, int flags) 分配的內存物理地址上連續,虛擬地址上也是連續

3. gfp_mask標志:

情形 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?相應標志
進程上下文,可以睡眠 ? ? ? ? ? ? ? ? ?GFP_KERNEL
進程上下文,不可以睡眠 ? ? ? ? ? ??? GFP_ATOMIC
中斷處理程序 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?GFP_ATOMIC
軟中斷 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?GFP_ATOMIC
Tasklet ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? GFP_ATOMIC
用于DMA的內存,可以睡眠 ? ? ? ? GFP_DMA | GFP_KERNEL
用于DMA的內存,不可以睡眠 ? ? GFP_DMA | GFP_ATOMIC

4. void kfree(const void *ptr)

釋放由kmalloc()分配出來的內存塊

二,vmalloc() 與 vfree()

用于申請較大的內存空間,虛擬內存是連續的:申請內存位于vmalloc_start -----vmalloc_end之間,與物理內存沒有簡單的轉換關系。物理上不要求連續。

1. 以字節為單位進行分配,在<linux/vmalloc.h>中

2. void *vmalloc(unsigned long size) 分配的內存虛擬地址上連續,物理地址不連續

3. 一般情況下,只有硬件設備才需要物理地址連續的內存,因為硬件設備往往存在于MMU之外,根本不了解虛擬地址;但為了性能上的考慮,內核中一般使用kmalloc(),而只有在需要獲得大塊內存時才使用vmalloc(),例如當模塊被動態加載到內核當中時,就把模塊裝載到由vmalloc()分配的內存上。

4.void vfree(void *addr),這個函數可以睡眠,因此不能從中斷上下文調用。

三,malloc(), vmalloc()和kmalloc()區別

[1]kmalloc和vmalloc是分配的是內核的內存,malloc分配的是用戶的內存

[2]kmalloc保證分配的內存在物理上是連續的,vmalloc保證的是在虛擬地址空間上的連續,malloc和vmalloc一樣,也是虛連,物理不一定連。

[3]kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相對較大

[4]內存只有在要被DMA訪問的時候才需要物理上連續

[5]vmalloc比kmalloc要慢

?

四,kzalloc

kzalloc實現了kmalloc以及memset的功能,一個函數起到了兩個函數的作用

?這個函數就是原來的兩個函數的整合?,?原來我們每次申請內存的時候都會這么做?,?先是用?kmalloc()?申請空間?,?然后用memset()?來初始化?,?而現在省事了?,?一步到位?,?直接調用kzalloc(),?效果等同于原來那兩個函數?,?所有申請的元素都被初始化為?0.?其實對寫驅動的來說?,?知道現在應該用?kzalloc()?代替原來的?kmalloc()??memset()?就可以了?,?這是內核中內存管理部分做出的改變?,?確切的說是改進?,?負責內存管理那部分的兄弟們的目標無非就是讓內核跑起來更快一些?,?而從?kmalloc/memset?kzalloc?的改變確實也是為了實現這方面的優化.


五,目前kzalloc將取代kmalloc和memset功能。

?以后在內核,看到此函數的比率將會更高。

轉載于:https://www.cnblogs.com/alan666/p/8312357.html

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

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

相關文章

前端 保存后端傳來數據的id_一篇來自前端同學對后端接口的吐槽

前言去年的某個時候就想寫一篇關于接口的吐槽&#xff0c;當時后端提出了接口方案對于我來說調用起來非常難受&#xff0c;但又說不上為什么&#xff0c;沒有論點論據所以也就作罷。最近因為寫全棧的緣故&#xff0c;團隊內部也遇到了一些關于接口設計的問題&#xff0c;于是開…

2018-2019-1 《信息安全系統設計基礎》教學進程

《信息安全系統設計基礎》教學進程 目錄 考核方式暑假準備教學進程 第01周學習任務和要求第02周學習任務和要求第03周學習任務和要求第04周學習任務和要求第05周學習任務和要求第06周學習任務和要求第07周學習任務和要求第08周學習任務和要求第09周學習任務和要求第10周學習任務…

python字符串是什么_python字符串詳解

字符串詳解 在python中引號引起來的就是字符串 字符串是用來存儲少量數據 索引 索引(下標) 通過索引可以精確的定位到某個元素 name "meat" meat 每一個字母叫做一個元素 # 0123 從左向右代表每一個字母 #-4-3-2-1 從右向左每一個字母 print(name[-1]) 輸出 t name …

最小編輯代價

最小編輯代價問題&#xff1a; 對于兩個字符串A和B&#xff0c;我們需要進行插入、刪除和修改操作將A串變為B串&#xff0c;定義c0&#xff0c;c1&#xff0c;c2分別為三種操作的代價&#xff0c;請設計一個高效算法&#xff0c;求出將A串變為B串所需要的最少代價。 給定兩個字…

Android中的數據庫

2019獨角獸企業重金招聘Python工程師標準>>> 1.1. 什么時候使用數據庫 有大量相似結構的數據需要存儲的時候就可以使用數據庫。 1.2. SQLite的簡介 SQLite是一款輕量級的數據庫。它的設計目標是嵌入式的&#xff0c;而且目前已經在很多嵌入式產品中使用了它。Androi…

python計算績效工資_python實現 --工資管理系統

原博文 2017-07-25 22:41 ? # -*- coding: utf-8 -*- __author__ hjianli # import re import os info_message """Alex 100000 Rain 80000 Egon 50000 Yuan 30000 """ #序列字典 xulie_...01669 相關推薦 2019-09-28 21:13 ? Python python…

為Windows Server 2012 R2指定授權服務器

為Windows Server 2012 R2指定授權服務器在Windows Server 2008 R2的終端服務中&#xff0c;可以手動指定授權服務器&#xff0c;而在Windows Server 2012 R2中&#xff0c;默認只能通過"遠程桌面連接服務"管理器&#xff0c;指定授權服務器&#xff0c;而要使用遠程…

spring5高級編程_Spring 5.X系列教程:滿足你對Spring5的一切想象-持續更新

簡介是什么讓java世界變得更好&#xff0c;程序員變得更友愛&#xff0c;禿頭率變得不是那么的高&#xff0c;讓程序員不必再每天996&#xff0c;有時間找個女朋友&#xff1f;是Spring。是什么讓企業級java應用變得簡單易懂&#xff0c;降低了java程序員的進入門檻&#xff0c…

關于resolve非泛型方法不能與類型實參一起使用

今天mvc新建三層時&#xff0c;寫到bll層中一直報下面的錯誤&#xff0c;檢查了幾遍趕腳并沒有什么錯。最后發現缺少一些引用。 如下面的圖&#xff0c;少添加了下面的兩個引用.Unity是微軟模式與實踐團隊開發的一個輕量級、可擴展的依賴注入容器, Microsoft.Practices.Unity.C…

設計模式-Singleton

2019獨角獸企業重金招聘Python工程師標準>>> Singleton算是知道的設計模式中最簡單的最方便實現的了&#xff0c;模式實現了對于類提供唯一實例的方法&#xff0c;在很多系統中都會用到此模式。在實際項目中使用全局變量&#xff0c;或者靜態函數等方式也可以達到這…

dump分析工具_Java應用CPU過高,如何排查?參考解決思路和常用工具總結

本文總結了一些常見的線上應急現象和對應排查步驟和工具。分享的主要目的是想讓對線上問題接觸少的同學有個預先認知&#xff0c;免得在遇到實際問題時手忙腳亂。畢竟作者自己也是從手忙腳亂時走過來的。只不過這里先提示一下。在線上應急過程中要記住&#xff0c;只有一個總體…

st官網下載stm32固件庫方法

進入www.st.com官網------把網站改成中文&#xff08;就在右上方&#xff09;----點擊產品-----選擇右側的微控制器選項------選擇左側的STM32 32位ARM CortexMCU-----選擇左側的STM32F1系列-----選擇STM32103-----選擇中間部分mcu對應型號&#xff08;我用的是STM32F103ZE)---…

mysql5.5提示Deprecated: mysql_query(): The mysql extension is deprecated

解決方法1&#xff1a;在php程序代碼里面設置報警級別 <?php error_reporting E_ALL & ~E_DEPRECATED 方法2&#xff1a;禁止php報錯 display_errors On 改為 display_errors Off 方法3&#xff1a;使用mysqli或者PDO 建議大家盡快取消mysql&#xff0c;全部都走…

JavaScript強化教程 —— Cocos2d-JS極速調試技巧

本文為 H5EDU 機構官方 HTML5培訓 教程&#xff0c;主要介紹&#xff1a;JavaScript強化教程 —— Cocos2d-JS極速調試技巧 本文教大家一個調試Cocos2d-JS的小技巧&#xff0c;我都是這么用的&#xff0c;特意來告訴大家這個輕量快速的調試技巧。1.首先我們需要安裝官方的cocos…

dos攻擊命令_Kali Linux系列之拒絕服務攻擊(DOS)實戰(上)

(你的世界是個什么樣的世界&#xff1f;你說&#xff0c;我們傾聽!)-----------------小百科拒絕服務攻擊即是攻擊者想辦法讓目標機器停止提供服務&#xff0c;是黑客常用的攻擊手段之一。其實對網絡帶寬進行的消耗性攻擊只是拒絕服務攻擊的一小部分&#xff0c;只要能夠對目標…

stm32定時器配置

stm32通用定時器 STM32的定時器是個強大的模塊&#xff0c;定時器使用的頻率也是很高的&#xff0c;定時器可以做一些基本的定時&#xff0c;還可以做PWM輸出或者輸入捕獲功能。 時鐘源問題&#xff1a; 名為TIMx的有八個&#xff0c;其中TIM1和TIM8掛在APB2總線上&#xff0c;…

SQL 養成一個好習慣是一筆財富

來源&#xff1a;MR_ke 鏈接&#xff1a;http://www.cnblogs.com/MR_ke/archive/2011/05/29/2062085.html 我們做軟件開發的&#xff0c;大部分人都離不開跟數據庫打交道&#xff0c;特別是erp開發的&#xff0c;跟數據庫打交道更是頻繁&#xff0c;存儲過程動不動就是上千行&a…

【JAVA】StringTokenizer 迭代方式對字符串進行分割

StringTokenizer是一個用來分隔String的應用類&#xff0c;相當于VB的split函數。1.構造函數public StringTokenizer(String str)public StringTokenizer(String str, String delim)public StringTokenizer(String str, String delim, boolean returnDelims)第一個參數就是要分…

python數組定義_python定義數組

廣告關閉 騰訊云11.11云上盛惠 &#xff0c;精選熱門產品助力上云&#xff0c;云服務器首年88元起&#xff0c;買的越多返的越多&#xff0c;最高返5000元&#xff01; 一、一維數組 1. 直接定義matrix2. 間接定義matrixprint(matrix)輸出&#xff1a;3. 數組乘法matrix*5print…

Android-語言設置流程分析

Android手機語言切換行為&#xff0c;是通過設置-語言和輸入法-語言來改變手機的語言&#xff0c;其實這個功能很少被用戶使用。 以Android5.1工程源碼為基礎,從設置app入手來分析和學習語言切換的過程:一、語言設置界面&#xff1a;首先在設置app中找到語言設置這個Preference…