Linux¶ÔI/O¶Ë¿Ú×ÊÔ´µÄ¹ÜÀí(1)

¡¶Linux¶ÔI/O¶Ë¿Ú×ÊÔ´µÄ¹ÜÀí(1)¡·ÕªÒª£º ¢ÚÈç¹ûthisÖ¸ÕëΪ¿Õ£¬ÄǾÍÈÃnew->endµÈÓÚroot->end¡£ÕâÓÐÁ½²ãÒâ˼£ºµÚÒ»ÖÖÇé¿ö¾ÍÊǸù½áµãµÄchildÖ¸ÕëΪNULL£¨¼´¸ù½ÚµãûÓÐÈκÎ×Ó×ÊÔ´£©¡£Òò´Ë´ËʱÏÈÔÝʱ½«new->end·Åµ½×î´ó¡£µÚ¶þÖÖÇé¿ö¾ÍÊÇÒѾ¡­

¢ÚÈç¹ûthisÖ¸ÕëΪ¿Õ£¬ÄǾÍÈÃnew->endµÈÓÚroot->end¡£ÕâÓÐÁ½²ãÒâ˼£ºµÚÒ»ÖÖÇé¿ö¾ÍÊǸù½áµãµÄchildÖ¸ÕëΪNULL£¨¼´¸ù½ÚµãûÓÐÈκÎ×Ó×ÊÔ´£©¡£Òò´Ë´ËʱÏÈÔÝʱ½«new->end·Åµ½×î´ó¡£µÚ¶þÖÖÇé¿ö¾ÍÊÇÒѾ­±éÀúÍêÕû¸öchildÁ´±í£¬ËùÒÔ´Ëʱ¾ÍÈÃnew±íʾ×îºóÒ»¸ö×Ó×ÊÔ´ºóÃæÄÇÒ»¶ÎδʹÓõÄ×ÊÔ´Çø¼ä¡£

¢Û¸ù¾Ý²ÎÊýminºÍmaxÐÞÕýnew->[start,end]µÄÖµ£¬ÒÔʹ×ÊÔ´new±»°üº¬ÔÚ[min,max]ÇøÓòÄÚ¡£

¢Ü½ÓÏÂÀ´½øÐÐ¶ÔÆë²Ù×÷¡£

¢ÝÈ»ºó£¬ÅжϾ­¹ýÉÏÊöÕâЩ²½ÖèËùÐγɵÄ×ÊÔ´ÇøÓònewÊÇ·ñÊÇÒ»¶ÎÓÐЧµÄ×ÊÔ´£¨end±ØÐë´óÓÚ»òµÈÓÚstart£©£¬¶øÇÒ×ÊÔ´ÇøÓòµÄ³¤¶ÈÂú×ãsize²ÎÊýµÄÒªÇó£¨end£­start£«1>=size£©¡£Èç¹ûÕâÁ½¸öÌõ¼þ¾ùÂú×㣬Ôò˵Ã÷ÎÒÃÇÒѾ­ÕÒµ½ÁËÒ»¶ÎÂú×ãÌõ¼þµÄ×ÊÔ´¿Õ¶´¡£Òò´ËÔÚ¶Ônew->endµÄÖµ½øÐÐÐÞÕýºó£¬È»ºó¾Í¿ÉÒÔ·µ»ØÁË£¨·µ»ØÖµ0±íʾ³É¹¦£©¡£

¢ÞÈç¹ûÉÏÊöÁ½Ìõ¼þ²»ÄÜͬʱÂú×㣬Ôò˵Ã÷»¹Ã»ÓÐÕÒµ½£¬Òò´ËÒª¼ÌÐøÉ¨ÃèÁ´±í¡£ÔÚ¼ÌÐøÉ¨Ãè֮ǰ£¬ÎÒÃÇ»¹ÊÇÒªÅжÏÒ»ÏÂthisÖ¸ÕëÊÇ·ñΪ¿Õ¡£Èç¹ûΪ¿Õ£¬ËµÃ÷ÒѾ­É¨ÃèÍêÕû¸öchildÁ´±í£¬Òò´Ë¾Í¿ÉÒÔÍÆ³öforÑ­»·ÁË¡£·ñÔò¾Í½«new->startµÄÖµÐÞ¸ÄΪthis->end+1£¬²¢ÈÃthisÖ¸ÏòÏÂÒ»¸öÐÖµÜ×ÊÔ´½Úµã£¬´Ó¶ø¼ÌÐøÉ¨ÃèÁ´±íÖеÄÏÂÒ»¸ö×Ó×ÊÔ´½Úµã¡£

3£®2£®5 ·ÖÅä½Ó¿Úallocate_resource()

ÔÚfind_resource()º¯ÊýµÄ»ù´¡ÉÏ£¬º¯Êýallocate_resource()ʵÏÖ£ºÔÚÒ»¿Å×ÊÔ´Ê÷ÖзÖÅäÒ»ÌõÖ¸¶¨´óСµÄ¡¢ÇÒ°üº¬ÔÚÖ¸¶¨ÇøÓò[min,max]Öеġ¢Î´Ê¹ÓÃ×ÊÔ´ÇøÓò¡£ÆäÔ´´úÂëÈçÏ£º

/*

* Allocate empty slot in the resource tree given range and alignment.

*/

int allocate_resource(struct resource *root, struct resource *new,

unsigned long size,

unsigned long min, unsigned long max,

unsigned long align,

void (*alignf)(void *, struct resource *, unsigned long),

void *alignf_data)

{

int err;

write_lock(&resource_lock);

err = find_resource(root, new, size, min, max, align, alignf, alignf_data);

if (err >= 0 && __request_resource(root, new))

err = -EBUSY;

write_unlock(&resource_lock);

return err;

}

3£®2£®6 »ñÈ¡×ÊÔ´µÄÃû³ÆÁбí

º¯Êýget_resource_list()ÓÃÓÚ»ñÈ¡¸ù½ÚµãrootµÄ×Ó×ÊÔ´Ãû×ÖÁÐ±í¡£¸Ãº¯ÊýÖ÷ÒªÓÃÀ´Ö§³Ö/proc/Îļþϵͳ£¨±ÈÈçʵÏÖproc/ioportsÎļþºÍ/proc/iomemÎļþ£©¡£ÆäÔ´´úÂëÈçÏ£º

ÄãµÄλÖ㺵çÄÔ¹ÊÕÏÍø >> ²Ù×÷ϵͳ >> Linux/Unix >> Linux¶ÔI/O¶Ë¿Ú×ÊÔ´µÄ¹ÜÀí(1)