Linux內核中編寫一個模塊,實現申請一塊內存,需要考慮哪些方面?

1、Linux內核模塊
               編寫模塊:
               1、module_init(XXX_init);
                    static int __init XXX_init(){...};
               2、module_exit(XXX_exit);
                    static int __exit XXX_exit(){...};
               3、MODULE_lICENSE("GPL"); //模塊許可聲明
               4、static int booknum=100;
                     module_param(bookNumber,int,S_IRUGO);
                編寫編譯文件Makefile:
                 1、mymodule_objs :=book.o
                     obj-m :=book.o
             KDIR := /usr/src/linux-headers-2.6.38-8-generic
          2、all:
               $(MAKE) -C $(KDIR) M=$(PWD)
             clean:
                rm -rf *.mod.c *.mod.o *.ko *.o *.tmp_versions *.order *symvers
      2、在內核中申請內存
       在內核中申請內存和在用戶空間中申請內存不同,有以下因素引起了複雜性,包括:
      1、內核的虛擬地址和物理地址被限制到1G大小
      2、linux內核中沒有分頁內存
      3、內核通常需要連續的物理內存
      4、通常內核申請內存過程不能睡眠
      5、內核中的錯誤比其他地方錯誤代價更大
    在內核中申請內存最常用的方法:
 #include <linux/slab.h>
    void *kmalloc(size_t size, int flags);
    flags:flags控制了申請內存的行爲。flags分爲三類:action modifierszone modifierstypesAction modifiers告訴內如以怎麼的行爲去申請內存。比如kernel能否睡眠。Zone modifiers告訴內核從什麼地方去申請內存,比如一些請求可能需要申請的內存能夠讓硬件以DMA的方式方式。type指定了申請的類型。把這寫flags可以合成一個變量,傳給kmalloc
 3、內核中申請內存需遵循的一些簡單規則
       1、判斷申請內存的時候可否睡眠,也就是調用kmalloc的時候能否被阻塞。如果在一箇中斷處理,在中斷處理的下半部分,或者有一個鎖的時候,就不能被阻塞。如果在一個進程上下文,也沒有鎖,則一般可以睡眠。
       2、如果可以睡眠,指定GFP_KERNEL
       3、如果不能睡眠,就指定GFP_ATOMIC
       4、如果需要DMA可以訪問的內存,比如ISA或者有些PCI設備,就需要指定GFP_DMA
       5、需要對kmalloc返回的值檢查NULL
       6、爲了沒有內存泄漏,需要用kfree()來釋放內存。
kmalloc並不直接從分頁機制中獲得空閒頁面,而是從slab頁面分配器那獲得需要的頁面,slab的實現代碼限制了最大分配的大小爲128k.
  4、幾種內存分配函數比較:
                    1、 __get_free_pages
                    直接對頁框進行操作,最大分配內存爲4M,適用於分配較大量的連續物理內存。
                    2、 kmem_cache_alloc
                    基於slab機制實現,最大分配內存爲128kb, 適合需要頻繁申請釋放相同大小內存塊時使用.
                    3、kmalloc
                    基於kmem_cache_alloc實現,最大分配內存爲128kb, 最常見的分配方式,需要小於頁框大小的內存時可以使用。
                    4、vmalloc
                    建立非連續物理內存到虛擬地址的映射,物理不連續,適合需要大內存,但是對地址連續性沒有要求的場合
                    5、dma_alloc_coherent
                    基於__alloc_pages實現,最大分配內存爲4MB,適用於DMA操作。
                    6、ioremap
                    實現已知物理地址到虛擬地址的映射,適用於物理地址已知的場合,如設備驅動
                    7、alloc_bootmem
                   在啓動kernel時,預留一段內存,內核看不見,小於物理內存大小,內存管理要求較高
發佈了68 篇原創文章 · 獲贊 45 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章