Linux vmallocµÄʵÏÖ
Äں˰汾:2.6.28
linuxÈçºÎÀûÓûï°éϵͳ,slab·ÖÅäÆ÷·ÖÅäÄÚ´æ,ÓÃÕâЩ·½·¨µÃµ½µÄÄÚ´æÔÚÎïÀíµØÖ·É϶¼ÊÇÁ¬ÐøµÄ, È»¶ø,ÓÐЩʱºò,ÿ´ÎÇëÇóÄÚ´æÊ±,ϵͳ¶¼·ÖÅäÎïÀíµØÖ·Á¬ÐøµÄÄÚ´æ¿éÊDz»ºÏÊʵÄ,¿ÉÒÔÀûÓÃС¿éÄÚ´æ“Á¬½Ó”³É´ó¿é¿ÉʹÓõÄÄÚ´æ.ÕâÔÚ²Ù×÷ϵͳÉè¼ÆÖÐÒ²±»³ÆÎª “ÄÚ´æÆ´½Ó”,ÏÔÈ»,ÄÚ´æÆ´½ÓÔÚÐèÒª½Ï´óÄÚ´æ,¶øÄÚ´æ·ÃÎÊÏà±È֮ϲ»ÊÇºÜÆµ·±µÄÇé¿öÏÂÊDZȽÏÓÐЧµÄ.
¡¡¡¡ÔÚlinuxÄÚºËÖÐÓÃÀ´¹ÜÀíÄÚ´æÆ´½ÓµÄ½Ó¿ÚÊÇvmalloc/vfree.ÓÃvmalloc·ÖÅäµÃµ½µÄÄÚ´æÔÚÏßÐÔµØÖ·ÊÇÆ½»¬µÄ,µ«ÊÇÎïÀíµØÖ·ÉÏÊÇ·ÇÁ¬ÐøµÄ.
º¯ÊývmallocÁгöÈçÏÂ:(mm/vmalloc.c)
size: ·ÖÅäµÄÐéÄâ¿Õ¼äµÄ´óС.
gfp_mask: Ò³¼¶·ÖÅäÆ÷µÄ±êÖ¾.
prot: ÒÑ·ÖÅäµÄ±£»¤ÑÚÂë.
void *__vmalloc(unsigned long size, gfp_t gfp_mask, pgprot_t prot)
{
return __vmalloc_node(size, gfp_mask, prot, -1,
__builtin_return_address(0));
}
º¯Êý_vmalloc·ÖÅä×ã¹»µÄÒ³ÊýÓësizeÏàÅä,°ÑËüÃÇÓ³Éä½øÁ¬ÐøµÄÄÚºËÐéÄâ¿Õ¼ä,µ«·ÖÅäµÄÄÚ´æ¿é²»Ò»¶¨Á¬Ðø.ÔÚº¯ÊýÖеÚÒ»²½ÊÇÔÚvmlistÖÐѰÕÒµ½Ò»¸ö´óСºÏÊʵÄÐéÄâÄÚ´æ¿é(_get_vm_area_node(...)).
static void *__vmalloc_node(unsigned long size, gfp_t gfp_mask, pgprot_t prot,
int node, void *caller)
{
struct vm_struct *area;
//¼ì²éÇëÇó·ÖÅäµÄÄÚ´æ´óСÓÐûÓг¬¹ý×î´óµÄÎïÀíÒ³ÃæÊý¡£Èç¹û³¬¹ý·µ»Ø 0 £¬±íʾ·ÖÅäʧ°Ü¡£
size = PAGE_ALIGN(size);
//ÓÐЧÐÔ¼ì²é
if (!size || (size >> PAGE_SHIFT) > num_physpages)
return NULL;
//È¡µÃÒ»¸öÓÐЧµÄvma
area = __get_vm_area_node(size, VM_ALLOC, VMALLOC_START, VMALLOC_END,
node, gfp_mask, caller);
//Èç¹ûÉêÇëµÄÎÞЧ£¬·µ»ØÒ»¸öNULLÖ¸Õë
&nb
Ïà¹ØÎĵµ£º
Ôø×ö¹ýsignalÏà¹ØµÄÒ»µã¶ù¿ª·¢£¬Ì¸Ì¸ÎÒµÄһЩÀí½â¡£
Ê×ÏÈ£¬ÐèÒªÀí½â¼¸¸ösignalÏà¹ØµÄº¯Êý¡£
sigaddset(sigset_t* sigSet, int sigNum ) : ½«ÐźÅsigNum Ìí¼Óµ½Ðźż¯ sigSet ÖУ»
sigdelset(sigset_t* sigSet, int sigNum) : ½«ÐźŠsigNum ´ÓÐźż¯ sigSet ÖÐɾ³ý£»
......
¶ÔÓÚÕâ¸öº¯Êý£¬ÆäʵÊǺܶàºê¶¨Òåµ÷Óõĺ¯Êý£¬ÆäÖÐalloc_bootmem_low_pages(x)ÊÇÆäÖÐÒ»¸öµ÷ÓÃËüµÄºê£¬´ó¼Ò¿ÉÒÔÈÏΪÕâЩºêÖ»ÊǰÑÕâ¸ö__alloc_bootmemʵÖÊÐԵĺ¯Êý½øÐÐÁË·â×°¡£#define alloc_bootmem_low_pages(x)Ï൱ÓÚ__alloc_bootmem((x), PAGE_SIZE, 0)£¬¾ÍÊÇ´Ó0µØÖ·¿ªÊ¼µÄµÍ¶ËÄÚ´æ·ÖÅä°´Ò³´óС¶ÔÆëµÄÄÚ´æ¡£ºÃÁË£¬Îª ......
¡ð
¡¢ËµÃ÷
±Ê¼ÇÊÊÓÃÓÚ
Linux
µÄ
2.6.10
ÒÔºóµÄÄںˡ£
±Ê¼ÇÒÔ
Linux
Device
Driver3
ÌṩµÄ
scull
³ÌÐò
(scull
Ŀ¼ÖеÄ
main.c
ºÍ
scull.h)
Ϊ¼Ç¼Ö÷Ïߣ¬²¢ÒÔ¸ÃÇý¶¯³ÌÐòÖеĸ÷ÖÖϵͳµ÷Óúͺ¯Êýµ÷ÓÃÁ÷³ÌΪ¼Ç
¼˳Ðò¡£±ÈÈ磬
module_init( )
ºÍ
module_exit(
)
ΪÏà¶ÔÓ¦µÄÒ»¶Ôϵͳµ÷Óã¬Ò»°ãÊé¼®Öж ......
1. ѧ»áд¼òµ¥µÄmakefile
2. ±àÒ»Ó¦ÓóÌÐò£¬¿ÉÒÔÓÃmakefileÅÜÆðÀ´
3. ѧ»áдÇý¶¯µÄmakefile
4. дһ¼òµ¥charÇý¶¯£¬makefile±àÒëͨ¹ý£¬¿ÉÒÔinsmod£¬ lsmod£¬ rmmod. ÔÚÇý¶¯µÄinitº¯ÊýÀï´òÓ¡hello world£¬ insmodºóÓ¦¸ÃÄܹ»Í¨¹ýdmesg¿´µ½Êä³ö¡£
&n ......
˵ʵ»°£¬ÐźÅÊÇÎÒÌÖÑáµÄ¶«Î÷£¬ÔÚÎÒЩµÄ´úÂëÖУ¬ÎÒ¶¼ÏëÓÃ×î¼òµ¥µÄ°ì·¨À´´¦ÀíËü£¬ÏÖÔÚÓöµ½¶àÏß³ÌÖÐÐźŵĴ¦Àí£¬APUEÖеÄ˵·¨Ò²¿´µÃ²»ÊǺܶ®£¬CSDNÖÐһλÅóÓÑÓÐÈçϵÄ×ܽᣬÏȼÇÔÚÕâÀï¡£
1. ĬÈÏÇé¿öÏ£¬ÐźŽ«ÓÉÖ÷½ø³Ì½ÓÊÕ´¦Àí£¬¾ÍËãÐźŴ¦Àíº¯ÊýÊÇÓÉ×ÓÏß³Ì×¢²áµÄ
2. ÿ¸öÏ߳̾ùÓÐ×Ô¼ºµÄÐÅºÅÆÁ±Î×Ö£¬¿ÉÒÔʹÓÃsigprocmaskº¯ ......