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.oobj-m :=book.oKDIR := /usr/src/linux-headers-2.6.38-8-generic2、all:$(MAKE) -C $(KDIR) M=$(PWD)clean:rm -rf *.mod.c *.mod.o *.ko *.o *.tmp_versions *.order *symvers2、在內核中申請內存在內核中申請內存和在用戶空間中申請內存不同,有以下因素引起了複雜性,包括:1、內核的虛擬地址和物理地址被限制到1G大小2、linux內核中沒有分頁內存3、內核通常需要連續的物理內存4、通常內核申請內存過程不能睡眠5、內核中的錯誤比其他地方錯誤代價更大在內核中申請內存最常用的方法:#include <linux/slab.h>void *kmalloc(size_t size, int flags);flags:flags控制了申請內存的行爲。flags分爲三類:action modifiers,zone modifiers,types。Action 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時,預留一段內存,內核看不見,小於物理內存大小,內存管理要求較高
Linux內核中編寫一個模塊,實現申請一塊內存,需要考慮哪些方面?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.