掌控记忆体ppt课件_第1页
掌控记忆体ppt课件_第2页
掌控记忆体ppt课件_第3页
掌控记忆体ppt课件_第4页
掌控记忆体ppt课件_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Chapter 7掌控記憶體7.1 kmalloc的來龍去脈 (1/3)nkmalloc()定義在,其函式的速度很快,因為它不會清理所配置到的記憶體,記憶體仍保管先前留下的內容,且利用它所得到的記憶體空間在實際記憶體是連續的。nvoid *kmalloc(size_t size, int flags);nkmalloc()的第一個引數為配置區塊之容量,第二個引數(allocation flags)為控制kmalloc()的行為。nsize引數介紹:n中心只能以頁為單位來整塊配置,並且採用一種特殊的分頁配置技術(page-oriented allocation),以充分利用系統的RAM.nLin

2、ux處理記憶體配置的方法,是製作一組記憶體物件集散區(pools of memory objects),同一集散區的記憶物件都有固定容量.n中心只能配置幾種預定容量的位元組陣列,假设沒有剛好他要的容量,他就必須選擇大一級的容量.n在Linux2.0實際可用的用量略微少於2的整數次方,因為管裡系統將控制旗標留在配置給他的記憶體上。n如他要配置一個2000bytes的緩衝區,最好選擇2000而不要選擇2048.nkmalloc()一次可配置的容量上限是128KBytes.7.1 kmalloc的來龍去脈 (2/3)nflags引數介紹:nGFP_KERNELn 平常的中心記憶體配置,配置到的記憶體

3、空間屬於current行程.有能够休眠.nGFP_BUFFERn 用於管理快取暫存區,容許配置者可以休眠.不同於GFP_KERNEL之處,在於它是藉由出清髒頁(dirty page)到磁碟,以換取可用的記憶空間,此旗標的意图是防止I/O子系統本身有需求記憶體時引發了死結。nGFP_ATOMICn 供interrupt handler以及任何在行程外部的程式來配置記憶體.絕不會休眠.7.1 kmalloc的來龍去脈 (3/3)nGFP_USERn 替代user-process配置記憶體,有能够休眠,而且是屬於低優先度的要求。nGFP_HIGHUSERn 類似GFP_USER,但是從高址劃分區获得

4、可用空間。n_GFP_DMAn 配置可供DMA傳輸运用的記憶體.可搭配(运用or運算) GFP_KERNEL或GFP_ATOMIC的其中之一。n_GFP_HIGHMEMn 要求配置高址劃分區.在沒有高址劃分區的平台上,此旗標沒有作用.它是GFP_HIGHUSER遮罩的一部分,除此之外幾乎沒有作用。7.1. 記憶體劃分區(memory zone)nLinux2.4認識三種記憶體劃分區:正常、DMA-capable 、高址(high memory).n普通的配置動作都是從正常劃分區找空間.nDMA劃分區是独一可搭配週邊裝置進行DMA傳輸的位址段.並非一切實體記憶體都可以配合DMA操作,因為CPU-

5、Device之間的位址匯流排,與Device-RAM之間的位址匯流排,只需部分是重疊的.n高址劃分區是需求特別處理才干存取的位址段.在2.3版研發期間,為了援助Pentium II Virtual Memory Extension (VME)以存取高達64GB-實體記憶體時,才將它納入中心記憶體管理.n如沒指定特殊旗標,則正常劃分和DMA劃分區都會被搜尋.假设設立了_GFP_HIGHMEM,則三種劃分區都會被搜尋.n對於沒有high memory的平台,或是中心組態刻意關掉high memory的援助,則_GFP_HIGHMEM會被定義為0,而且沒有成效.7.2 前瞻快取(Lookaside

6、Caches)n驅動程式經常需求一次又一次配置許多同樣大小的物件,為此中心提供一些特殊的集散區,稱之為前瞻快取.nLinux記憶快取的型別為kmem_cache_t,可藉由呼叫kmem_cache_create()來產生:n kmem_cache_t *kmem_cache_create(const char *name, size_t size, size_t offset, unsigned long flags, void (*constructor)(void *,kmem_cache_t *,unsigned long flags), void (*destructor)(void

7、*,kmem_cache_t *,unsigned long flags);n name: 同時代表函式與快取的符號,名稱最長不得超過19個字元(包含0在內).n offset: 第一個物件在記憶頁裡的起始位置,用來確保配置到的物件一定放在特定的對齊位置上,运用0來要求中心幫他完成.7.2 前瞻快取(Lookaside Caches)nflags:nSLAB_NO_REAP:n保護快取不因系統記憶缺乏而縮減容量.通常不需求設立此旗標.nSLAB_HWCACHE_ALIGN:n要求每個資料物件都要對齊一條快取線.nSLAB_CACHE_DMA:n要求每個資料物件都配置在DMA可存取的記憶體.n物

8、件快取產生之後,呼叫kmem_cache_alloc(kmem_*cache, int flags) 來配置物件n cache:先前建立的快取n flags:與傳給和kmalloc()的旗標一样n运用void kmem_cache_free(kmem_cache_t *cache, const void *obj)釋放物件n运用int kmem_cache_destory(kmem_cache_t *cache)釋放空間7.2.1 scullc:以Slab Caches為基礎的scull /* 运用快取配置一個配額 */if (!dptr-datas_pos) dptr-datas_pos =

9、 kmem_cache_alloc(scullc_cache, GFP_KERNEL); if (!dptr-datas_pos) goto nomem; memset(dptr-datas_pos, 0, scullc_quantum); /* 釋放記憶體 */ for (i = 0; i datai) kmem_cache_free(scullc_cache, dptr-datai);kfree(dptr-data);7.2.1 scullc:以Slab Caches為基礎的scull為了援助scullc_cache的运用,需把下面程式段放在適當位置./* 宣告一個快取指標,供一切裝置共用

10、 */kmem_cache_t *scullc_cache; /* init_module: 產生一個快取,當成我們的配額 */ scullc_cache = kmem_cache_create(scullc, scullc_quantum, 0, SLAB_HWCACHE_ALIGN, NULL, NULL); /* 沒有建構解構 */ if (!scullc_cache) result = -ENOMEM; goto fail_malloc2; /* cleanup_module: 釋放被我們當成配額的快取 */ kmem_cache_destroy(scullc_cache);將scul

11、l改成scullc之後,最主要的差異是速度略微提升了,也更有效率了.因為配額是從集散區配置來的,分布位置已經盡能够緊密.7.3 get_free_page( )與其相關函式 (1/3)n假设模組需求比較大塊的記憶體,通常最好运用分頁配置技術.n以下函式用來配置記憶頁:n get_free_page()n 回傳一指向新記憶頁的指標,內容全去除為0.n _get_free_page()n 類似get_free_page(),但不去除內容.n _get_free_pages()n 配置一個跨頁的連續記憶區,傳回指向記憶區第一位元組的指標.記憶區內容不被去除.n _get_dma_pages()n 類

12、似_get_free_pages(),但保證配置到的記憶體可作為DMA用途.在Linux2.2之後,运用_get_free_pages()搭配_GFP_DMA也可達到一样效果.7.3 get_free_page( )與其相關函式 (2/3)n上述原型如下n這裡的flags,意義與kmalloc()一樣,而且同樣以GFP_KERNEL或GFP_ATOMIC最常用,頂多是在搭配_GFP_DMA或_GFP_HIGHMEM.norder是他要配置或釋放頁數的2的對數.如值為0則為一頁;8頁則其值為3.n在Linux2.0版,order值的上限是5,Linux2.2版之後的版本最高值為9.無論如何,階數

13、越大,配置失敗的機會就越高.unsigned long get_free_page(int flags);unsigned long _get_free_page(int flags);unsigned long _get_free_pages(int flags, unsigned long order);unsigned long _get_dma_pages(int flags, unsigned long order);7.3 get_free_page( )與其相關函式 (3/3)n當程式不再需求先前配置的記憶頁時,就應該以以下函式將它們釋回. n void free_pages (

14、unsigned long addr, unsigned long order);n假设他釋放的頁數,不等於先前要求配置的頁數,則記憶表將會損毀,而系統很快就會遇到大麻煩.n由於中心會盡力滿足配置的要求,所以,要把系統搞垮,使其反應遲鈍,時在是輕而易舉 只需配置夠多的記憶體就成了。7.3.1 scullp:运用完好記憶頁的scull/* 配置單一配額 */ if (!dptr-datas_pos) dptr-datas_pos = (void *)_get_free_pages(GFP_KERNEL, dptr-order); if (!dptr-datas_pos) goto nomem;

15、memset(dptr-datas_pos, 0, PAGE_SIZE order);/* 釋放整組配額 */for (i = 0; i datai) free_pages(unsigned long)(dptr-datai), dptr-order);kfree(dptr-data);7.3.1 scullp:运用完好記憶頁的sculln效率提升的程度並不算顯著,因為速度本來就是kmalloc()本身的設計重點之一。記憶頁層級的配置技術,主要優點不在於速度,而是較佳的記憶體利用率,不會浪費無謂的空間,但是kmalloc()則不然,它所浪費的記憶空間是無法預料的,因為它必須盡力滿足程式師的要求

16、.n_get_free_page()的最大優點,是他可以全權處置所得到的記憶頁,理論上,他甚至可以修正分頁表,讓得到的一切記憶頁集合成一個線性記憶區.(Ch13 MMAP&DMA)7.4 vmalloc() 與其相關函式 (1/3)n另一種的記憶體配置函式,這是讓他可以在虛擬位址空間(virtual address space)配置一個連續記憶區的vmalloc()函式.n請留意,構成連續虛擬位址的實體記憶體,不見得是連續的,而只是被中心視為一段連續的位址範圍而已.nvmalloc()與其親戚ioremap()(不算是配置函式)的原型如下:#include void *vmalloc(

17、unsigned long size);void vfree(void *addr);void *ioremap(unsigned long offset, unsigned long size);void iounmap(void *addr);7.4 vmalloc() 與其相關函式 (2/3)nkmalloc()和get_free_pages()所傳的位址,也是虛擬位址,而非真正用於定位實際記憶晶片的實體位址.nCPU內部的MMU (Memory Management Unit)會自動將虛擬位址轉換成實體位址.nvmalloc()和ioremap所用的位址範圍,則是完全靠人工虛構出來的,

18、每一次的配置動作,都必須適當修正分頁表,才干建構出(虛擬的)記憶區.n它們之間的差異在某些平台上(如x86),vmalloc()傳回的位址,只是高於kmalloc所傳回的位址.vmalloc()的位址範圍從VMALLOC_START到VMALLOC_END,定義在n利用vmalloc()配置的位址,不能用於CPU之外(如DMA),因為只需MMU才干處理這類位址. 所以可运用vmalloc()的正確時機,是當他需求配置一大塊僅供軟體运用的連續緩衝區時.7.4 vmalloc() 與其相關函式 (3/3)nioremap()也會建構新的分頁表,和vmalloc()一样;不同的是它實際上並不配置任何

19、記憶體.它所傳回的值,是一個特殊的虛擬位址,可用來存取指定的實體位址範圍.nioremap()最有用之處,是可用來將PCI緩衝區的(實體)位址映射到kernel-space(虛擬)位址.例如,讓驅動程式用來存取PCI顯示卡的視訊記憶體.n基於相容性考量,不要將ioremap()傳回的位址當成記憶體的指標,就是不要直接存取該位址.這個任务應交給readb()和Ch.8的I/O函式來達成.(註Alpha CPU的資料傳輸方式,和PCI規格不相容)。nvmalloc()能配置的容量,以及ioremap()可映射到CPU位址空間的記憶體範圍,可說是幾乎沒有限制.兩者都是分頁導向技術(透過修正分頁表來達

20、成要求).nvmalloc()有個小缺點,它不能用於中斷期,因為它內部运用了kmalloc(GFP_KERNEL)來获得分頁表的儲存空間,因此有休眠的能够.7.4.1 scullv:运用虛擬位址的scull/* 运用虛擬位址配置一個配額 */if (!dptr-datas_pos) dptr-datas_pos = (void *)vmalloc(PAGE_SIZE order); if (!dptr-datas_pos) goto nomem; memset(dptr-datas_pos, 0, PAGE_SIZE order);/* 釋放配額集 */ for (i = 0; i datai

21、) vfree(dptr-datai); kfree(dptr-data);7.5 開機期的配置n假设他真的需求一大段連續的實體記憶體,独一機會是在開機期間要求配置記憶體.n當中心剛啟動時,先設法獲取系統上一切可用的實體記憶體之存取權,然後呼叫每一個子系統的初始函式,讓每一個子系統有機會設定本人的初始狀態.n在子系統初始化過程中,子系統有機會保管一塊本人的專用區,縮減系統正常運作可用的RAM.7.5 開機期的配置 (Cont.)n在2.4版中心,這種配置是藉由呼叫以下函式所達成:n #include n void *alloc_bootmem(unsigned long size);n voi

22、d *alloc_bootmem_low(unsigned long size);n void *alloc_bootmem_pages(unsigned long size);n void *alloc_bootmem_low_pages(unsigned long size);n 名稱末端有_pages的函式,只能配置完好的記憶頁.而其他則可以配置“沒對齊頁邊的記憶區.名稱末端含有_low的函式,用來配置低劃分區(DMA劃分區),其他則是從正常劃分區配置.n這種方式的缺點是,不能釋回不在需求的記憶空間.n但是,這是目前標準中心独一可以平安配置連續32頁以上記憶體的辦法(get_free_p

23、ages上限值為5).n假设计划在開機期偷走記憶體,必須修正中心原碼中的init/P.234 DEMO n因為要在除錯方式下,所以要改Makefile,將Debug=y前的去掉,並重新MAKEkThPeMaJ7G4C1z-w&t!pYmVjRgOdL9I6E3B0y(v%s#oXlTiQfNbK8H5D2A-x*u$qZnWkShPdMaJ7F4C1z)w&t!pYmUjRgOcL9I6E3B+y(v%r#oXlTiQeNbK8G5D2A-x*t$qZnVkShPdMaI7F4C0z)w&s!pXmUjRfOcL9H6E2B+y(u%r#oWlThQeNbJ8G5D1A

24、-x*t$qYnVkSgPdMaI7F3C0z)v&s!pXmUiRfOcK9H6E2B+x(u%rZoWlThQeMbJ8G4D1A-w*t!qYnVjSgPdLaI6F3C0y)v&s#pXmUiRfNcK9H5E2B+x(u$rZoWkThQeMbJ7G4D1z-w*t!qYmVjSgOdLaI6F3B0y)v%s#pXlUiQfNcK8H5E2A+x*u$rZnWkThPeMbJ7G4C1z-w&t!qYmVjRgOdL9I6F3B0y(v%s#oXlUiQfNbK8H5D2A+x*u$qZnWkShPeMaJ7F4C1z)w&t!pYmUjRgOcL9

25、I6E3B+y(v%r#oXlTiQfNbK8G5D2A-x*u$qZnVkShPdMaJ7F4C0z)w&s!pYmUjRfOcL9H6E3B+y(u%r#oWlTiQeNbJ8G5D1A-x*t$qYnVkSgPdMaI7F4C0z)v&s!pXmUjRfOcK9H6E2B+y(u%rZoWlThQeNbJ8G4D1A-w*t$qYnVjSgPdLaI7F3C0y)v&s#pXmUiRfNcK9H5E2B+x(u$rZoWkThQeMbJ8G4D1z-w*t!qYnVjSgOdLaI6F3C0y)v%s#pXlUiRfNcK8H5E2A+x(u$rZnWkThPeM

26、bJ7G4C1z-w&t!qYmVjRgOdL9I6F3B0y)v%s#oXlUiQfNcK8H5D2A+x*u$rZnWkShPeMaJ7G4C1z)w&t!pYmVjRgOcL9I6E3B0y(v%r#oXlTiQfNbK8G5D2A-x*u$qZnWkShPdMaJ7F4C1z)w&s!pYmUjRgOcL9H6E3B+y(v%r#oWlTiQeNbK8G5D1A-x*t$qZnVkSgPdMaI7F4C0z)v&s!pXmUjRfOcK9H6E2B+y(u%r#oWlThQeNbJ8G5D1A-w*t$qYnVkSgPdLaI7F3C0z)v&s

27、#pXmUiRfOcK9H5E2B+x(u%rZoWkThQeMbJ8G4D1z-w*t!qYnVjSgPdLaI6F3C0y)v&s#pXlUiRfNcK9H5E2A+x(u$rZoWkThPeMbJ7G4D1z-w&t!qYmVjSgOdL9I6F3B0y)v%s#oXlUiQfNcK8H1A-w*t!qYnVjSgPdLaI6F3C0y)v&s#pXlUiRfNcK9H5E2A+x(u$rZoWkThPeMbJ7G4D1z-w&t!qYmVjSgOdL9I6F3B0y)v%s#pXlUiQfNcK8H5E2A+x*u$rZnWkThPeMaJ7G4C1z-

28、w&t!pYmVjRgOdL9I6E3B0y(v%s#oXlTiQfNbK8H5D2A-x*u$qZnWkShPeMaJ7F4C1z)w&t!pYmUjRgOcL9I6E3B+y(v%r#oXlTiQeNbK8G5D2A-x*t$qZnVkShPdMaI7F4C0z)w&s!pXmUjRfOcL9H6E2B+y(u%r#oWlTiQeNbJ8G5D1A-x*t$qYnVkSgPdMaI7F3C0z)v&s!pXmUiRfOcK9H6E2B+x(u%rZoWlThQeMbJ8G4D1A-w*t!qYnVjSgPdLa3B+y(u%r#oWlTiQeNbJ8G5D1

29、A&t!pYmUjRgOcL9I6E3B+y(v%r#oXlTiQeNbK8G5D2A-x*t$qZnVkShPdMaJ7F4C0z)w&s!pYmUjRfOcL9H6E3B+y(u%r#oWlTiQeNbJ8G5D1A-x*t$qYnVkSgPdMaI7F3C0z)v&s!pXmUiRfOcK9H6E2B+y(u%rZoWlThQeNbJ8G4D1A-w*t$qYnVjSgPdLaI7F3C0y)v&s#pXmUiRfNcK9H5E2B+x(u$rZoWkThQeMbJ7G4D1z-w*t!qYmVjSgOdLaI6F3C0y)v%s#pXlUiRfNcK8H

30、5E2A+x(u$rZnWkThPeMbJ7G4C1z-w&t!qYmVjRgOdL9I6F3B0y(v%s#oXlUiQfNbK8H5D2A+x*u$rZnWkShPeMaJ7G4C1z)w&t!pYmVjRgOcL9I6E3B0y(v%r#oXlTiQfNbK8G5D2A-x*u$qZnVkShPdMaJ7F4C0z)w&s!pYmUjRgOcL9H6E3B+y(v%r#oWlTiQeNbK8G5D1A-x*t$qZnVkSgPdMaI7F4C0z)v&s!pXmUjRfOcK9H6E2B+y(u%rZoWlThQeNbJ8G4D1A-w*t$qYnVkSg

31、PdLaI7F3C0z)v&s#pXmUiRfOcK9H5E2B+x(u%rZoWkThQeMbJ8G4D1z-w*t!qYnVjSgOdLaI6F3C0y)v%s#pXlUiRfNcK9H5E2A+x(u$rZoWkThPeMbJ7G4D1z-w&t!qYmVjSgOdL9I6F3B0y)v%s#oXlUiQfNcK8H5D2A+x*u$rZnWkShPeMaJ7G4C1z-w&t!pYmVjRgOdL9I6E3B0y(v%s#oXlTiQfNbK8H5D2A-x*u$qZnWkShPdMaJ7F4C1z)w&s!pYmUjRgOcL9H6E3B+y(v%r#

32、oWlTiQeNbK8G5D2A-x*t$qZnVkShPdMaI7F4C0z)woXlTiQfNbK8H5D2A-x*u$qZnWkShPdMaJ7F4C1z)w&s!pYmUjRgOcL9I6E3B+y(v%r#oXlTiQeNbK8G5D2A-x*t$qZnVkShPdMaI7F4C0z)w&s!pXmUjRfOcL9H6E2B+y(u%r#oWlThQeNbJ8G5D1A-w*t$qYnVkSgPdMaI7F3C0z)v&s!pXmUiRfOcK9H6E2B+x(u%rZoWlThQeMbJ8G4D1A-w*t!qYnVjSgPdLaI6F3C0y)v&

33、s#pXlUiRfNcK9H5E2B+x(u$rZoWkThQeMbJ7G4D1z-w*t!qYmVjSgOdLaI6F3B0y)v%s#pXlUiQfNcK8H5E2A+x*u$rZnWkThPeMaJ7G4C1z-w&t!qYmVjRgOdL9I6F3B0y(v%s#oXlUiQfNbK8H5D2A+x*u$qZnWkShPeMaJ7F4C1z)w&t!pYmUjRgOcL9I6E3B+y(v%r#oXlTiQeNbK8G5D2A-x*u$qZnVkShPdMaJ7F4C0z)w&s!pYmUjRfOcL9H6E3B+y(u%r#oWlTiQeNbJ8G5D1A-x

34、*t$qYnVkSgPdMaI7F3C0z)v&s!pXmUjRfOcK9H6E2B+y(u%rZoWlThQeNbJ8G4D1A-w*t$qYnVjSgPdLaI7F3C0y)v&s#pXmUiRfNcK9H5E2B+x(u$rZoWkThQeMbJ7G4D1z-s!pXmUjRfOcK9H6E2B+y(u%rZoWlThQeNbJ8G4D1A-w*t$qYnVjSgPdLaI7F3C0y)v&s#pXmUiRfNcK9H5E2B+x(u%rZoWkThQeMbJ8G4D1z-w*t!qYnVjSgOdLaI6F3C0y)v%s#pXlUiRfNcK8H5E2A+x(

35、u$rZnWkThPeMbJ7G4C1z-w&t!qYmVjRgOdL9I6F3B0y)v%s#oXlUiQfNcK8H5D2A+x*u$rZnWkShPeMaJ7G4C1z)w&t!pYmVjRgOcL9I6E3B0y(v%r#oXlTiQfNbK8G5D2A-x*u$qZnWkShPdMaJ7F4C1z)w&s!pYmUjRgOcL9H6E3B+y(v%r#oWlTiQeNbK8G5D1A-x*t$qZnVkSgPdMaI7F4C0z)v&s!pXmUjRfOcL9H6E2B+y(u%r#oWlThQeNbJ8G5D1A-w*t$qYnVkSgPdLaI7F3C0z)v&s#pXmUiRfOcK9H5E2B+x(u%rZoWkThQeMbJ8G4D1z-w*t!qYnVjSgPdLaI6F3C0y)v&s#pXlUiRfNcK9H5E2A+x(u$rZoWkThPeMbJ7G4D1z-w&t!qYmVjSgOdL9I6F3B0y)v%s#oXlUiQfNcK8H5-w*t!qYnVjSgPdLaI6F3C0y)v&s#pXlUiRfNcK9H5E2A+x(u$rZoWkThPeMbJ7G4D1z-w&t!qYmVjSgOdL9I6F3B0y)v%s#p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论