̽ѰLinuxÄÚºËÔ´´úÂëËùÔÚÎļþÏê½â
̽ѰLinuxÄÚºËÔ´´úÂëËùÔÚÎļþÏê½â
Linux×÷Ϊһ¿î¿ªÔ´²Ù×÷ϵͳ£¬ÆäÄÚºËÔ´´úÂë×÷ΪÆäÉè¼ÆÓ빦ЧµÄ½¹µã²¿·Ö£¬±»ÆÕ±éÑо¿ºÍʹÓá£LinuxÄÚºËÔ´´úÂë°üÀ¨ÁËÐí¶àÎļþ£¬Ã¿¸öÎļþÈÏÕæ²î±ðµÄ¹¦Ð§Ä£¿é¡£ÔÚÕâƪÎÄÕÂÖУ¬ÎÒÃǽ«ÉîÈë̽ѰLinuxÄÚºËÔ´´úÂëÖм¸¸öÒªº¦ÎļþµÄ×÷ÓúÍÏêϸ´úÂëʾÀý£¬×ÊÖú¶ÁÕ߸üºÃµØÃ÷È·LinuxÄں˵ÄÉè¼ÆºÍÔËÐС£
kernel/sched/core.c – Õâ¸öÎļþʵÏÖÁËLinuxÄÚºËÖеĵ÷ÀíÆ÷¡£µ÷ÀíÆ÷ÈÏÕæ¾öÒéÄĸöÀú³ÌÔÚʲôʱ¼äÖ´ÐУ¬ÒÔʵÏÖʱ¼äƬÂÖת¡¢ÓÅÏȼ¶µ÷ÀíµÈ¹¦Ð§¡£ÏÂÃæÊÇÒ»¸ö¼òÆӵĴúÂëʾÀý£º
#include <linux/sched.h> #include <linux/sched/signal.h> void schedule(void) { struct task_struct *prev, *next; prev = current; next = pick_next_task(); // Ñ¡ÔñÏÂÒ»¸öÒªÔËÐеÄÀú³Ì switch_to(next); // Çл»µ½ÏÂÒ»¸öÀú³ÌÖ´ÐÐ }
µÇ¼ºó¸´ÖÆ
kernel/slab.c – Õâ¸öÎļþʵÏÖÁËLinuxÄÚºËÖеÄSlab·ÖÅÉÆ÷¡£Slab·ÖÅÉÆ÷ÓÃÓÚ¸ßЧµØ·ÖÅɺͽÓÄÉÄڴ棬Ìá¸ßϵͳµÄÐÔÄÜ¡£ÏÂÃæÊÇÒ»¸ö¼òÆӵĴúÂëʾÀý£º
#include <linux/slab.h> void *kmalloc(size_t size, gfp_t flags) { struct kmem_cache *cache; void *ptr; cache = get_cache_for_size(size); // ƾ֤·ÖÅɾÞϸ»ñÈ¡ºÏÊʵĻº´æ ptr = alloc_slab(cache); // ´Ó»º´æÖзÖÅÉÄÚ´æ return ptr; }
µÇ¼ºó¸´ÖÆ
kernel/fs/namei.c – Õâ¸öÎļþʵÏÖÁËLinuxÄÚºËÖеÄ·¾¶ÆÊÎöºÍÎļþϵͳ²Ù×÷¡£Â·¾¶ÆÊÎöÓÃÓÚ½«Óû§Ì¬´«ÈëµÄÎļþ·¾¶×ª»»³ÉÄÚºËÖеÄinode£¬¾ÙÐÐÎļþ²Ù×÷¡£ÏÂÃæÊÇÒ»¸ö¼òÆӵĴúÂëʾÀý£º
#include <linux/fs.h> #include <linux/path.h> int vfs_open(const char *pathname, int flags, int mode) { struct path path; struct file *file; int err = kern_path(pathname, LOOKUP_FOLLOW, &path); if (!err) { file = filp_open(&path, flags, mode); if (IS_ERR(file)) { err = PTR_ERR(file); } } return err; }
µÇ¼ºó¸´ÖÆ
ͨ¹ý¶ÔÒÔÉϼ¸¸öÒªº¦ÎļþµÄ´úÂëʾÀý¾ÙÐÐÆÊÎö£¬¶ÁÕß¿ÉÒÔÔ½·¢ÉîÈëµØÏàʶLinuxÄÚºËÔ´´úÂëµÄ½á¹¹ºÍ¹¦Ð§¡£³ýÁËÕâЩÎļþÖ®Í⣬LinuxÄں˻¹°üÀ¨ÁËÐí¶àÆäËûÖ÷ÒªµÄÎļþ£¬º¸ÇÁËÀú³ÌÖÎÀí¡¢ÄÚ´æÖÎÀí¡¢ÎļþϵͳµÈ·½ÃæµÄʵÏÖ¡£½øÒ»²½Ñо¿ºÍ̽Ë÷LinuxÄÚºËÔ´´úÂ룬ÓÐÖúÓÚÃ÷È·²Ù×÷ϵͳµÄÉè¼ÆÔÀíºÍÄÚ²¿ÊÂÇé»úÖÆ£¬ÌáÉýϵͳ±à³ÌµÄÄÜÁ¦ºÍˮƽ¡£
ÒÔÉϾÍÊÇ̽ѰLinuxÄÚºËÔ´´úÂëËùÔÚÎļþÏê½âµÄÏêϸÄÚÈÝ£¬¸ü¶àÇë¹Ø×¢±¾ÍøÄÚÆäËüÏà¹ØÎÄÕ£¡