欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载
     

    《掌控记忆体》PPT课件.ppt

    • 资源ID:5516188       资源大小:344.47KB        全文页数:22页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    《掌控记忆体》PPT课件.ppt

    Chapter 7,掌控記憶體,7.1 kmalloc的來龍去脈(1/3),kmalloc()定義在,其函式的速度很快,因為它不會清理所配置到的記憶體,記憶體仍保留先前留下的內容,且利用它所得到的記憶體空間在實際記憶體是連續的。void*kmalloc(size_t size,int flags);kmalloc()的第一個引數為配置區塊之容量,第二個引數(allocation flags)為控制kmalloc()的行為。size引數介紹:核心只能以頁為單位來整塊配置,並且採用一種特殊的分頁配置技術(page-oriented allocation),以充分利用系統的RAM.Linux處理記憶體配置的方法,是製作一組記憶體物件集散區(pools of memory objects),同一集散區的記憶物件都有固定容量.核心只能配置幾種預定容量的位元組陣列,如果沒有剛好你要的容量,你就必須選擇大一級的容量.在Linux2.0實際可用的用量稍微少於2的整數次方,因為管裡系統將控制旗標留在配置給你的記憶體上。如你要配置一個2000bytes的緩衝區,最好選擇2000而不要選擇2048.kmalloc()一次可配置的容量上限是128KBytes.,7.1 kmalloc的來龍去脈(2/3),flags引數介紹:GFP_KERNEL 平常的核心記憶體配置,配置到的記憶體空間屬於current行程.有可能休眠.GFP_BUFFER 用於管理快取暫存區,容許配置者可以休眠.不同於GFP_KERNEL之處,在於它是藉由出清髒頁(dirty page)到磁碟,以換取可用的記憶空間,此旗標的用意是避免I/O子系統本身有需要記憶體時引發了死結。GFP_ATOMIC 供interrupt handler以及任何在行程外部的程式來配置記憶體.絕不會休眠.,7.1 kmalloc的來龍去脈(3/3),GFP_USER 代替user-process配置記憶體,有可能休眠,而且是屬於低優先度的要求。GFP_HIGHUSER 類似GFP_USER,但是從高址劃分區取得可用空間。_GFP_DMA 配置可供DMA傳輸使用的記憶體.可搭配(使用or運算)GFP_KERNEL或GFP_ATOMIC的其中之一。_GFP_HIGHMEM 要求配置高址劃分區.在沒有高址劃分區的平台上,此旗標沒有作用.它是GFP_HIGHUSER遮罩的一部分,除此之外幾乎沒有作用。,7.1.記憶體劃分區(memory zone),Linux2.4認識三種記憶體劃分區:正常、DMA-capable、高址(high memory).一般的配置動作都是從正常劃分區找空間.DMA劃分區是唯一可搭配週邊裝置進行DMA傳輸的位址段.並非所有實體記憶體都可以配合DMA操作,因為CPU-Device之間的位址匯流排,與Device-RAM之間的位址匯流排,只有部分是重疊的.高址劃分區是需要特別處理才能存取的位址段.在2.3版研發期間,為了支援Pentium II Virtual Memory Extension(VME)以存取高達64GB-實體記憶體時,才將它納入核心記憶體管理.如沒指定特殊旗標,則正常劃分和DMA劃分區都會被搜尋.如果設立了_GFP_HIGHMEM,則三種劃分區都會被搜尋.對於沒有high memory的平台,或是核心組態刻意關掉high memory的支援,則_GFP_HIGHMEM會被定義為0,而且沒有效用.,7.2 前瞻快取(Lookaside Caches),驅動程式經常需要一次又一次配置許多同樣大小的物件,為此核心提供一些特殊的集散區,稱之為前瞻快取.Linux記憶快取的型別為kmem_cache_t,可藉由呼叫kmem_cache_create()來產生: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*,kmem_cache_t*,unsigned long flags);name:同時代表函式與快取的符號,名稱最長不得超過19個字元(包含0在內).offset:第一個物件在記憶頁裡的起始位置,用來確保配置到的物件一定放在特定的對齊位置上,使用0來要求核心幫你完成.,7.2 前瞻快取(Lookaside Caches),flags:SLAB_NO_REAP:保護快取不因系統記憶不足而縮減容量.通常不需要設立此旗標.SLAB_HWCACHE_ALIGN:要求每個資料物件都要對齊一條快取線.SLAB_CACHE_DMA:要求每個資料物件都配置在DMA可存取的記憶體.物件快取產生之後,呼叫kmem_cache_alloc(kmem_*cache,int flags)來配置物件 cache:先前建立的快取 flags:與傳給和kmalloc()的旗標相同使用void kmem_cache_free(kmem_cache_t*cache,const void*obj)釋放物件使用int kmem_cache_destory(kmem_cache_t*cache)釋放空間,7.2.1 scullc:以Slab Caches為基礎的scull,/*使用快取配置一個配額*/if(!dptr-datas_pos)dptr-datas_pos=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的使用,需把下面程式段放在適當位置./*宣告一個快取指標,供所有裝置共用*/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);,將scull改成scullc之後,最主要的差異是速度稍微提升了,也更有效率了.因為配額是從集散區配置來的,分布位置已經盡可能緊密.,7.3 get_free_page()與其相關函式(1/3),如果模組需要比較大塊的記憶體,通常最好使用分頁配置技術.下列函式用來配置記憶頁:get_free_page()回傳一指向新記憶頁的指標,內容全清除為0._get_free_page()類似get_free_page(),但不清除內容._get_free_pages()配置一個跨頁的連續記憶區,傳回指向記憶區第一位元組的指標.記憶區內容不被清除._get_dma_pages()類似_get_free_pages(),但保證配置到的記憶體可作為DMA用途.在Linux2.2之後,使用_get_free_pages()搭配_GFP_DMA也可達到相同效果.,7.3 get_free_page()與其相關函式(2/3),上述原型如下這裡的flags,意義與kmalloc()一樣,而且同樣以GFP_KERNEL或GFP_ATOMIC最常用,頂多是在搭配_GFP_DMA或_GFP_HIGHMEM.order是你要配置或釋放頁數的2的對數.如值為0則為一頁;8頁則其值為3.在Linux2.0版,order值的上限是5,Linux2.2版之後的版本最高值為9.無論如何,階數越大,配置失敗的機會就越高.,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),當程式不再需要先前配置的記憶頁時,就應該以下列函式將它們釋回.void free_pages(unsigned long addr,unsigned long order);如果你釋放的頁數,不等於先前要求配置的頁數,則記憶表將會損毀,而系統很快就會遇到大麻煩.由於核心會盡力滿足配置的要求,所以,要把系統搞垮,使其反應遲鈍,時在是輕而易舉 只要配置夠多的記憶體就成了。,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;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:使用完整記憶頁的scull,效率提升的程度並不算顯著,因為速度本來就是kmalloc()本身的設計重點之一。記憶頁層級的配置技術,主要優點不在於速度,而是較佳的記憶體利用率,不會浪費無謂的空間,但是kmalloc()則不然,它所浪費的記憶空間是無法預料的,因為它必須盡力滿足程式師的要求._get_free_page()的最大優點,是你可以全權處置所得到的記憶頁,理論上,你甚至可以修改分頁表,讓得到的所有記憶頁集合成一個線性記憶區.(Ch13 MMAP&DMA),7.4 vmalloc()與其相關函式(1/3),另一種的記憶體配置函式,這是讓你可以在虛擬位址空間(virtual address space)配置一個連續記憶區的vmalloc()函式.請注意,構成連續虛擬位址的實體記憶體,不見得是連續的,而只是被核心視為一段連續的位址範圍而已.vmalloc()與其親戚ioremap()(不算是配置函式)的原型如下:,#include void*vmalloc(unsigned long size);void vfree(void*addr);void*ioremap(unsigned long offset,unsigned long size);void iounmap(void*addr);,7.4 vmalloc()與其相關函式(2/3),kmalloc()和get_free_pages()所傳的位址,也是虛擬位址,而非真正用於定位實際記憶晶片的實體位址.CPU內部的MMU(Memory Management Unit)會自動將虛擬位址轉換成實體位址.vmalloc()和ioremap所用的位址範圍,則是完全靠人工虛構出來的,每一次的配置動作,都必須適當修改分頁表,才能建構出(虛擬的)記憶區.它們之間的差異在某些平台上(如x86),vmalloc()傳回的位址,只是高於kmalloc所傳回的位址.vmalloc()的位址範圍從VMALLOC_START到VMALLOC_END,定義在利用vmalloc()配置的位址,不能用於CPU之外(如DMA),因為只有MMU才能處理這類位址.所以可使用vmalloc()的正確時機,是當你需要配置一大塊僅供軟體使用的連續緩衝區時.,7.4 vmalloc()與其相關函式(3/3),ioremap()也會建構新的分頁表,和vmalloc()相同;不同的是它實際上並不配置任何記憶體.它所傳回的值,是一個特殊的虛擬位址,可用來存取指定的實體位址範圍.ioremap()最有用之處,是可用來將PCI緩衝區的(實體)位址映射到kernel-space(虛擬)位址.例如,讓驅動程式用來存取PCI顯示卡的視訊記憶體.基於相容性考量,不要將ioremap()傳回的位址當成記憶體的指標,就是不要直接存取該位址.這個工作應交給readb()和Ch.8的I/O函式來達成.(註Alpha CPU的資料傳輸方式,和PCI規格不相容)。vmalloc()能配置的容量,以及ioremap()可映射到CPU位址空間的記憶體範圍,可說是幾乎沒有限制.兩者都是分頁導向技術(透過修改分頁表來達成要求).vmalloc()有個小缺點,它不能用於中斷期,因為它內部使用了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)vfree(dptr-datai);kfree(dptr-data);,7.5 開機期的配置,如果你真的需要一大段連續的實體記憶體,唯一機會是在開機期間要求配置記憶體.當核心剛啟動時,先設法獲取系統上所有可用的實體記憶體之存取權,然後呼叫每一個子系統的初始函式,讓每一個子系統有機會設定自己的初始狀態.在子系統初始化過程中,子系統有機會保留一塊自己的專用區,縮減系統正常運作可用的RAM.,7.5 開機期的配置(Cont.),在2.4版核心,這種配置是藉由呼叫下列函式所達成:#include void*alloc_bootmem(unsigned long size);void*alloc_bootmem_low(unsigned long size);void*alloc_bootmem_pages(unsigned long size);void*alloc_bootmem_low_pages(unsigned long size);名稱末端有_pages的函式,只能配置完整的記憶頁.而其他則可以配置“沒對齊頁邊”的記憶區.名稱末端含有_low的函式,用來配置低劃分區(DMA劃分區),其他則是從正常劃分區配置.這種方式的缺點是,不能釋回不在需要的記憶空間.但是,這是目前標準核心唯一可以安全配置連續32頁以上記憶體的辦法(get_free_pages上限值為5).若打算在開機期偷走記憶體,必須修改核心原碼中的init/main.c,P.234 DEMO 因為要在除錯模式下,所以要改Makefile,將Debug=y前的去掉,並重新MAKE,

    注意事项

    本文(《掌控记忆体》PPT课件.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开