婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Linux內核設備驅動之內存管理筆記整理

Linux內核設備驅動之內存管理筆記整理

熱門標簽:涪陵商都400電話開通辦理 云會外呼系統 外呼系統的經營范圍 安陽ai電銷機器人軟件 智能電話機器人坐席 柳州市機器人外呼系統報價 廈門營銷外呼系統平臺 申請400電話價格多少 外呼系統不彈窗
/**********************
 * linux的內存管理
 **********************/

到目前為止,內存管理是unix內核中最復雜的活動。我們簡單介紹一下內存管理,并通過實例說明如何在內核態獲得內存。

(1)各種地址

對于x86處理器,需要區分以下三種地址:

*邏輯地址(logical address)

只有x86支持。每個邏輯地址都由一個段(segment)和一個偏移量(offset)組成,偏移量指明了從段的開始到實際地址之間的距離。

邏輯地址共48位,段選擇符16位,偏移量32位。linux對邏輯地址的支持很有限

*線性地址(linear address)

也稱為虛擬地址(virtual address)。

32位無符號整數,從0x0000,0000到0xffff,ffff,共4GB的地址范圍。無論是應用程序還是驅動程序,我們在程序中使用的地址都是虛擬地址。

*物理地址(physical address)

32位無符號整數,與從CPU的地址引腳發送到存儲器總線上的電信號相對應。用于存儲器尋址。

找一個程序,如scanf.c,運行兩個,然后執行下面指令觀察:

$>pmap $(pid)
$>cat /proc/$(pid)/maps

(2)物理內存和虛擬內存

a.物理內存

就是系統中實際存在的RAM,比如我們常說的一條256兆RAM。x86處理器和物理內存之間是通過實際的物理線路連接的。

另外,x86處理器還通過主板連接了很多的外設,這些外設也通過實際的物理線路和處理器相連。

對于處理器來說,多數的外設和RAM的訪問方式是一致的,都是由程序發出物理地址訪問實際的物理器件。

外設和RAM共享一個4G大小的物理內存空間。

b.虛擬內存

是在物理內存之上為每個進程構架的一種邏輯內存,處于應用程序的內存請求與硬件內存管理單元(Memory Management Unit, MMU) 之間.MMU將應用程序使用的虛擬內存根據預先定義好的頁表轉化為物理地址,然后通過物理地址對實際的外設或RAM進行訪問。

虛擬內存有很多用途和優點:

  • *若干個進程可以并發地執行
  • *應用程序所需內存大于物理內存時也可以運行
  • *程序只有部分代碼裝入內存時進程可以執行它
  • *允許每個進程訪問可用物理內存的一個子集
  • *進程可以共享庫函數或程序的一個單獨內存映像
  • *程序是可重定位的,也就是說,可以把程序放在物理內存的任何地方
  • *編程者可以編寫與機器無關的代碼,不必關心物理內存的組織結構

(3)RAM的使用

linux將實際的物理RAM劃分為兩部分使用,其中若干兆字節專門用于存放內核映像(也就是內核代碼和內核靜態數據結構),RAM的其余部分通常由虛擬內存系統來處理,并用在以下3種可能的方面:

  • *滿足內核對緩存,描述符和其他動態內核數據結構的請求
  • *滿足進程對一般內存區的請求及對文件內存映射的請求
  • *借助于高速緩存從磁盤及其他緩沖設備獲得較好的性能

虛擬內存必須解決的一個主要問題是內存碎片,因為通常內核使用連續的物理內存,所以碎片過多可能導致請求失敗。

/**********************
 * 在內核中獲取內存
 **********************/

和在用戶空間中一樣,在內核中也可以動態分配和釋放內存,但受到的限制要比用戶空間多一些。

(1)內核中的內存管理

內核把物理頁作為內存管理的基本單位。這主要是因為內存管理單元(MMU)是以頁為單位進行虛擬地址和物理地址轉換的,從虛擬內存的角度來看,頁就是最小單位。大多數32位體系結構支持4KB的頁。

a.頁

內核用struct page表示系統中的每個物理頁。

包括<linux/mm.h>就可以使用page,其實際定義在<linux/mm_types.h>

struct page{
 page_flags_t flags;
 atomic_t _count;
 atomic_t _mapcount;
 unsigned long private;
 struct address_space *mapping;
 pgoff_t index;
 struct list_head lru;
 void *virtual;
};

flags用于存放頁的狀態,定義在<linux/page-flags.h>,狀態包括頁是不是臟的,是不是被鎖定在內存中等等。_count存放頁的引用計數。

page結構與物理頁相關,并非與虛擬頁相關。結構的目的再于描述物理內存本身,而不是其中的數據。

內核根據page結構來管理系統中所有的頁,內核通過page可以知道一個頁是否空閑(也就是頁有沒有被分配)。

如果頁已經被分配,內核還需要知道誰擁有這個頁。

擁有者可能是用戶空間進程,動態分配的內核數據,靜態內核代碼,或頁高速緩存等。

系統中的每個物理頁都要分配這樣一個結構。如果結構體40字節大小,則128MB物理內存(4K的頁)需要分配1MB多用于page結構。

b.區

由于硬件的限制,內核不能對所有的頁一視同仁。內核使用區(zone)對具有相似特性的頁進行分組。這些特性包括:

  • *一些硬件只能用某些特定的內存地址來執行DMA
  • *一些體系結構其內存的物理尋址范圍遠大于虛擬尋址范圍,這樣,就有一些內存不能永久地映射到內核空間

針對這些限制,linux采用了三種區(<linux/mmzone.h>):

  • ZONE_DMA:這個區包含的頁能執行DMA操作
  • ZONE_NORMAL:這個區包含的都是能正常映射的頁
  • ZONE_HIGHMEM:這個區包含高端內存(大于896M),其中的頁不能永久地映射到內核的地址空間

對于x86,這3個區對于的物理內存分別是:

  • ZONE_DMA: <16MB
  • ZONE_NORMAL: 16~896MB
  • ZONE_HIGHMEM: >896MB

見<linux/mmzone.h>中的struct zone。

系統中只有3個這樣的區結構。

(2)頁分配

內核是使用頁進行內存管理的,因此,我們在內核中也可以要求系統以頁為單位給我們分配內存。當然,以頁為單位分配可能造成內存浪費,因此,只有在我們確定需要整頁內存時才調用他們。

a.分配

#include <linux/gfp.h>
1. struct page * alloc_pages(
    unsigned int gfp_mask, 
    unsigned int order);
//分配2的order次方個連續的物理頁。
2. void *page_address(
    struct page *page);
//返回一個指針,指向給定物理頁當前的虛擬地址
3. unsigned long __get_free_pages(
    unsigned int gfp_mask, 
    unsigned int order);
//相當于上兩個函數結合
4. struct page * alloc_page(
    unsigned int gfp_mask);
5. unsigned long __get_free_page(
    unsigned int gfp_mask);
6. unsigned long get_zeroed_page(
    unsigned int gfp_mask);
//只分配一頁

b.gfp_mask標志

這個標志決定了內核在分配內存時的行為,以及從哪里分配內存。

#include <linux/gfp.h>
#define GFP_ATOMIC
//原子分配,不會休眠,可用于中斷處理。
#define GFP_KERNEL 
//首選,內核可能會睡眠,用在進程上下文中

c.釋放頁

void __free_pages(struct page *page,
    unsigned int order);
void free_pages(unsigned long addr,
    unsigned int order);
void free_page(unsigned long addr);

注意!只能釋放屬于你的頁。錯誤的參數可能導致內核崩潰。

(3)通過kmalloc獲取內存

kmalloc和malloc很象,是內核中最常用的內存分配函數。

kmalloc不會對分配的內存區域清0,分配的區域在物理內存中是連續的。

a.分配

#include <linux/slab.h>
void *kmalloc(size_t size, int flags)

size是要求分配的內存的大小

kmalloc的參數flags可以控制kmalloc分配時的行為。和alloc_page時使用的標志是一致的。注意,kmalloc不能分配高端內存

b.釋放

#include <linux/slab.h>
 void kfree(const void *ptr);

如果要釋放的內存已經被釋放了,或者釋放屬于內核其他部分的內存,則會產生嚴重的后果。調用kfree(NULL)是安全的。

要注意!內核只能分配一些預定義的,固定大小的字節數組。kmalloc能處理的最小內存塊是32或64。由于kmalloc分配的內存在物理上連續,所以有分配上限,通常不要超過128KB。

(4)通過vmalloc獲得內存

vmalloc()分配的內存虛擬地址是連續的,但物理地址不需要連續。這也是malloc()的分配方式。vmalloc分配非連續的內存塊,再修改頁表,把內存映射到邏輯空間連續的區域內。

大多數情況下,只有硬件設備需要得到物理地址連續的內存,內核可以使用通過vmalloc獲得的內存。但內核中多采用kmalloc,這主要是考慮性能,因為vmalloc會引起較大的TLB抖動,除非映射大塊內存時采用vmalloc。例如模塊動態加載時,就是加載到通過vmalloc分配的內存。

vmalloc在<linux/vmalloc.h>聲明,在<mm/vmalloc.c>定義,用法和malloc()相同。

 void* vmalloc(unsigned long size);
 void vfree(void *addr);

vmalloc會引起睡眠  

(5)通過slab機制獲得內存

分配和釋放數據結構是內核最普遍的操作之一。

一種常用的方法是構建一個空閑鏈表,其中包含有可供使用的,已經分配好的數據結構塊。

每次要分配數據結構就不用再申請內存,而是直接從這個空閑鏈表中分配數據塊,釋放結構時將內存還回這個鏈表。

這實際上是一種對象高速緩存(緩存對象).

linux針對這種要求提供了一個slab分配器來完成這一工作。

slab分配器要在幾個基本原則之間尋求平衡:

  • *頻繁使用的數據結構會頻繁分配和釋放,需要緩存
  • *頻繁分配和回收必然導致內存碎片,為避免這一現象,空閑鏈表中的緩存會連續存放,從而避免碎片
  • *分配器可以根據對象大小,頁大小和總的高速緩存大小來進行優化

kmalloc就建立在slab之上。

a.創建一個新的高速緩存

#include <linux/slab.h>
struct kmem_cache *kmem_cache_create(
   const char *name, 
   size_t size,
   size_t align,
   unsigned long flags,
   void(*ctor)(...));

name: 高速緩存的名字。出現在/proc/slabinfo
size: 緩存中每個元素的大小
align: 緩存中第一個對象的偏移,常用0
flags:分配標志。常用SLAB_HWCACHE_ALIGH,表明按cache行對齊,見slab.h

b.銷毀高速緩存

#include <linux/slab.h>
void kmem_cache_destroy(struct kmem_cache *cachep);

必須在緩存中的所有對象都被釋放后才能調用。

c.從高速緩存中獲得對象

void *kmem_cache_alloc(
   struct kmem_cache *cachep, int flags);
flags:
   GFP_KERNEL

d.將對象釋放回高速緩存

void kmem_cache_free(
   struct kmem_cache *cachep, void *objp);

可參見kernel/fork.c

(6)高端內存的映射

在高端內存中的頁不能永久地映射到內核地址空間,因此,通過alloc_pages()函數以__GFP_HIGHMEM標志獲得的頁不可能有虛擬地址。需要通過函數為其動態分配。

a.映射

要映射一個給定的page結構到內核地址空間,可以使用:

void *kmap(struct page *page);

函數可以睡眠

b.解除映射

void kunmap(struct page* page);

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

標簽:撫順 巴中 晉城 福州 南充 綏化 蕪湖 孝感

巨人網絡通訊聲明:本文標題《Linux內核設備驅動之內存管理筆記整理》,本文關鍵詞  Linux,內核,設備驅動,之,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Linux內核設備驅動之內存管理筆記整理》相關的同類信息!
  • 本頁收集關于Linux內核設備驅動之內存管理筆記整理的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品欧美久久久久一区二区| 国产亚洲精品aa| 欧美三级日韩在线| 91免费看片在线观看| 国产福利不卡视频| 成人一区在线看| 成人精品视频一区二区三区| 99精品欧美一区| 在线电影国产精品| 亚洲欧洲三级电影| 亚洲精品五月天| 夜色激情一区二区| 日本成人在线网站| 成人av影视在线观看| 欧美中文字幕一二三区视频| 欧美日韩二区三区| 五月激情丁香一区二区三区| 天堂va蜜桃一区二区三区| 国产真实乱偷精品视频免| 不卡大黄网站免费看| 欧美久久一二区| 国产欧美视频一区二区| 日韩影视精彩在线| www.欧美精品一二区| 欧美一区永久视频免费观看| 久久综合久久综合久久| 亚洲成人在线观看视频| 国产成人亚洲综合色影视| 欧美肥妇bbw| 亚洲一区二区三区四区五区黄 | 日本午夜一本久久久综合| 国产一区二区视频在线播放| 欧美日韩国产高清一区| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 国产精品午夜电影| 在线欧美小视频| 日韩国产欧美在线视频| 欧美精品一区二区精品网| 粉嫩一区二区三区在线看| 中文字幕中文字幕中文字幕亚洲无线| 一区二区三区在线影院| 欧美人伦禁忌dvd放荡欲情| 国产喷白浆一区二区三区| 99精品视频在线播放观看| 国产精品女主播av| 91福利小视频| 乱一区二区av| 亚洲欧洲在线观看av| 日韩欧美资源站| 99久精品国产| 国产精品羞羞答答xxdd| 亚洲国产视频a| 国产亚洲精品福利| 欧美一区国产二区| 91视频一区二区| 丁香激情综合五月| 国产在线视视频有精品| 亚洲va欧美va国产va天堂影院| 久久久精品2019中文字幕之3| 91麻豆.com| 99久久精品免费看国产免费软件| 日本va欧美va欧美va精品| 亚洲国产精品尤物yw在线观看| 久久久久久久久久久99999| 欧美日韩一区二区三区四区五区| 国产宾馆实践打屁股91| 国产麻豆成人精品| 国产一区二区三区四区在线观看| 亚洲一区二区中文在线| 亚洲免费资源在线播放| 国产精品嫩草99a| 成人欧美一区二区三区视频网页| 中文字幕精品综合| 国产精品不卡一区二区三区| 中文字幕综合网| 亚洲一级二级三级在线免费观看| 亚洲精品乱码久久久久久黑人 | 国产精品资源网| 色综合久久99| 欧美一区二区精美| 国产精品美女久久久久久久久久久| 久久综合五月天婷婷伊人| 久久久久久免费网| 亚洲视频小说图片| 精品综合久久久久久8888| 成人午夜激情片| 在线不卡中文字幕播放| 成人免费在线播放视频| 日韩经典一区二区| 一本到不卡免费一区二区| 欧美精品粉嫩高潮一区二区| 欧美精品一区二区三区四区 | 欧美四级电影网| 国产精品久久久久久久浪潮网站 | 精品精品国产高清a毛片牛牛| 国产精品天美传媒| 麻豆91在线看| 精品视频在线免费看| 国产精品久久久久久久久果冻传媒| 亚洲va韩国va欧美va| 一本大道久久a久久综合婷婷| 久久精品视频在线免费观看| 麻豆成人免费电影| 91精品国产91久久久久久一区二区 | 欧美日韩免费视频| 一区二区三区中文在线| 色狠狠综合天天综合综合| 国产精品久99| 99精品国产热久久91蜜凸| 中文字幕在线视频一区| 国产suv一区二区三区88区| 欧美肥妇free| 国产乱码字幕精品高清av| 337p粉嫩大胆色噜噜噜噜亚洲| 久久精品国产精品亚洲红杏| 久久婷婷成人综合色| 成人黄色软件下载| 香蕉久久一区二区不卡无毒影院 | 日韩精品一区二区三区在线播放| 免费国产亚洲视频| 国产喂奶挤奶一区二区三区| 99久久精品国产观看| 亚洲色图制服诱惑| 日韩欧美一区二区三区在线| 国产福利一区二区三区在线视频| 一区视频在线播放| 久久综合九色综合欧美98 | 91精品福利视频| 国产成人精品免费一区二区| 亚洲国产精品久久不卡毛片| 久久精品夜夜夜夜久久| 色猫猫国产区一区二在线视频| 视频一区二区国产| 亚洲免费三区一区二区| 国产人成一区二区三区影院| 制服.丝袜.亚洲.另类.中文| 一本色道久久综合狠狠躁的推荐 | 日韩电影在线一区| 国产精品不卡一区| 精品国产露脸精彩对白| 欧美日韩高清影院| 欧美日韩精品久久久| 欧美视频中文字幕| 欧美性大战久久久久久久蜜臀| 91在线国产福利| 欧美色电影在线| 欧美亚洲国产一区二区三区| 91亚洲男人天堂| 97精品久久久午夜一区二区三区| 成人午夜电影网站| 99精品视频在线观看免费| 99re免费视频精品全部| 色狠狠综合天天综合综合| 欧美日韩精品三区| 久久精品人人做人人爽人人| 337p粉嫩大胆色噜噜噜噜亚洲| 国产欧美一区二区精品秋霞影院| 久久久美女艺术照精彩视频福利播放| 欧美精品一区二区三| 国产精品久久久久久久久动漫 | 欧美亚洲综合另类| 日韩欧美在线影院| 亚洲欧洲精品一区二区精品久久久 | 综合色天天鬼久久鬼色| 丝袜美腿成人在线| 成年人国产精品| 91麻豆精品国产91久久久使用方法 | 欧美三级视频在线播放| 欧美mv和日韩mv国产网站| 亚洲欧洲三级电影| 国产不卡高清在线观看视频| 色综合久久88色综合天天6| 日韩欧美专区在线| 亚洲第一在线综合网站| 99国产精品久久久久| 精品国产乱码91久久久久久网站| 亚洲高清久久久| 欧洲av在线精品| 一片黄亚洲嫩模| 色先锋aa成人| 亚洲综合视频网| 99久久精品国产导航| 日本一区二区成人| 国产麻豆成人精品| 国产欧美精品一区二区三区四区 | 日韩女优电影在线观看| 精品一区二区三区在线视频| 91精品黄色片免费大全| 亚洲国产cao| 欧美videossexotv100| 精品一区二区三区在线播放| 精品国产一区二区三区久久影院 | 欧美xxxxx牲另类人与| 国产美女在线观看一区| 国产欧美一区二区精品婷婷 | 国产精品久久久久久久久久免费看| 99久久亚洲一区二区三区青草| 亚洲欧美在线aaa| 欧美老肥妇做.爰bbww| 九九视频精品免费|