LinuxÄں˽â¶ÁÈëÃÅ
Õë¶ÔºÃ¶àLinux °®ºÃÕ߶ÔÄں˺ÜÓÐÐËȤȴÎÞ´ÓÏ¿ڣ¬±¾ÎÄÖ¼ÔÚ½éÉÜÒ»ÖÖ½â¶ÁlinuxÄÚºËÔ´ÂëµÄÈëÃÅ·½·¨£¬¶ø²»Êǽâ˵linux¸´ÔÓµÄÄں˻úÖÆ£»
Ò»£®ºËÐÄÔ´³ÌÐòµÄÎļþ×éÖ¯£º
1£®LinuxºËÐÄÔ´³ÌÐòͨ³£¶¼°²×°ÔÚ/usr/src/linuxÏ£¬¶øÇÒËüÓÐÒ»¸ö·Ç³£¼òµ¥µÄ±àºÅÔ¼¶¨£ºÈκÎżÊýµÄºËÐÄ£¨ÀýÈç2.0.30£©¶¼ÊÇÒ»¸öÎȶ¨µØ·¢ÐеĺËÐÄ£¬¶øÈκÎÆæÊýµÄºËÐÄ£¨ÀýÈç2.1.42£©¶¼ÊÇÒ»¸ö¿ª·¢ÖеĺËÐÄ¡£
±¾ÎÄ»ùÓÚÎȶ¨µÄ2.2.5Ô´´úÂ룬µÚ¶þ²¿·ÖµÄʵÏÖƽ̨Ϊ Redhat Linux 6.0¡£
2£®ºËÐÄÔ´³ÌÐòµÄÎļþ°´Ê÷Ðνṹ½øÐÐ×éÖ¯£¬ÔÚÔ´³ÌÐòÊ÷µÄ×îÉϲãÄã»á¿´µ½ÕâÑùһЩĿ¼£º
¡ñArch £ºarch×ÓĿ¼°üÀ¨ÁËËùÓкÍÌåϵ½á¹¹Ïà¹ØµÄºËÐÄ´úÂë¡£ËüµÄÿһ¸ö×ÓĿ¼¶¼´ú±íÒ»ÖÖÖ§³ÖµÄÌåϵ½á¹¹£¬ÀýÈçi386¾ÍÊǹØÓÚintel cpu¼°ÓëÖ®Ïà¼æÈÝÌåϵ½á¹¹µÄ×ÓĿ¼¡£PC»úÒ»°ã¶¼»ùÓÚ´ËĿ¼£»
¡ñInclude: include×ÓĿ¼°üÀ¨±àÒëºËÐÄËùÐèÒªµÄ´ó²¿·ÖÍ·Îļþ¡£Óëƽ̨Î޹صÄÍ·ÎļþÔÚ include/linux×ÓĿ¼Ï£¬Óë intel cpuÏà¹ØµÄÍ·ÎļþÔÚinclude/asm-i386×ÓĿ¼ÏÂ,¶øinclude/scsiĿ¼ÔòÊÇÓйØscsiÉ豸µÄÍ·ÎļþĿ¼£»
¡ñInit£º Õâ¸öĿ¼°üº¬ºËÐĵijõʼ»¯´úÂë(×¢£º²»ÊÇϵͳµÄÒýµ¼´úÂë)£¬°üº¬Á½¸öÎļþmain.cºÍVersion.c£¬ÕâÊÇÑо¿ºËÐÄÈçºÎ¹¤×÷µÄÒ»¸ö·Ç³£ºÃµÄÆðµã¡£
¡ñMm £ºÕâ¸öĿ¼°üÀ¨ËùÓжÀÁ¢ÓÚ cpu Ìåϵ½á¹¹µÄÄÚ´æ¹ÜÀí´úÂ룬Èçҳʽ´æ´¢¹ÜÀíÄÚ´æµÄ·ÖÅäºÍÊͷŵȣ»¶øºÍÌåϵ½á¹¹Ïà¹ØµÄÄÚ´æ¹ÜÀí´úÂëÔòλÓÚarch/*/mm/£¬ÀýÈçarch/i386/mm/Fault.c
¡ñKernel£ºÖ÷ÒªµÄºËÐÄ´úÂ룬´ËĿ¼ÏµÄÎļþʵÏÖÁË´ó¶àÊýlinuxϵͳµÄÄں˺¯Êý£¬ÆäÖÐ×îÖØÒªµÄÎļþµ±Êôsched.c£»Í¬Ñù£¬ºÍÌåϵ½á¹¹Ïà¹ØµÄ´úÂëÔÚarch/*/kernelÖУ»
¡ñDrivers£º ·ÅÖÃϵͳËùÓеÄÉ豸Çý¶¯³ÌÐò;ÿÖÖÇý¶¯³ÌÐòÓÖ¸÷Õ¼ÓÃÒ»¸ö×ÓĿ¼£ºÈ磬/block ÏÂΪ¿éÉ豸Çý¶¯³ÌÐò£¬±ÈÈçide£¨ide.c£©¡£Èç¹ûÄãÏ£Íû²é¿´ËùÓпÉÄÜ°üº¬ÎļþϵͳµÄÉ豸ÊÇÈçºÎ³õʼ»¯µÄ£¬Äã¿ÉÒÔ¿´drivers/block/genhd.cÖеÄdevice_setup()¡£Ëü²»½ö³õʼ»¯Ó²ÅÌ£¬Ò²³õʼ»¯ÍøÂ磬ÒòΪ°²×°nfsÎļþϵͳµÄʱºòÐèÒªÍøÂçÆäËû: Èç, Lib·ÅÖúËÐĵĿâ´úÂë; Net,ºËÐÄÓëÍøÂçÏà¹ØµÄ´úÂë; Ipc,Õâ¸öĿ¼°üº¬ºËÐĵĽø³Ì¼äͨѶµÄ´úÂë; Fs ,ËùÓеÄÎļþϵͳ´úÂëºÍ¸÷ÖÖÀàÐ͵ÄÎļþ²Ù×÷´úÂ룬ËüµÄÿһ¸ö×ÓĿ¼֧³ÖÒ»¸öÎļþϵͳ£¬ÀýÈçfatºÍext2;
Scripts, ´ËĿ¼°üº¬ÓÃÓÚÅäÖúËÐĵĽű¾ÎļþµÈ¡£
Ò»°ã£¬ÔÚÿ¸öĿ¼Ï£¬¶¼ÓÐÒ»¸ö .depend ÎļþºÍÒ»¸ö Makefile Îļþ£¬ÕâÁ½¸öÎļþ¶¼ÊDZàÒëʱʹÓõĸ¨ÖúÎļþ£¬×ÐϸÔĶÁÕâÁ½¸öÎļþ¶ÔŪÇå¸÷¸öÎļþÕâ¼äµÄÁªÏµºÍÒÀÍйØϵºÜÓаïÖú£»¶øÇÒ£¬ÔÚÓеÄĿ¼Ï»¹ÓÐReadme Îļþ£¬ËüÊǶԸÃĿ¼ÏµÄÎļþµÄһЩ˵Ã÷£¬Í¬ÑùÓÐÀûÓÚÎÒÃǶÔÄÚºËÔ´ÂëµÄÀí½â£»
¡¡¡¡¶þ£®½â¶Áʵս£ºÎªÄãµÄÄÚºËÔö¼ÓÒ»¸öϵͳµ÷ÓÃ
ËäÈ»£¬Linux µÄÄÚºËÔ´ÂëÓÃÊ÷Ðνṹ×éÖ¯µÃ·Ç³£ºÏÀí¡¢¿Æѧ£¬°Ñ¹¦ÄÜÏà¹ØÁªµÄÎļþ¶¼·ÅÔÚͬһ¸ö×ÓĿ¼Ï£¬ÕâÑùʹµÃ³ÌÐò¸ü¾ß¿É¶ÁÐÔ¡£È»¶ø£¬Linux µÄÄÚºËÔ´ÂëʵÔÚÊÇÌ«´ó¶øÇҷdz£¸´ÔÓ£¬¼´±ã²ÉÓÃÁ˺ܺÏÀíµÄÎļþ×éÖ¯·½·¨£¬ÔÚ²»Í¬Ä¿Â¼ÏµÄÎļþÖ®¼ä»¹ÊÇÓкܶàµÄ¹ØÁª£¬·ÖÎöºËÐĵÄÒ»²¿·Ö´úÂëͨ³£»áÒª²é¿´ÆäËüµÄ¼¸¸öÏà¹ØµÄÎļþ£¬¶øÇÒ¿ÉÄÜÕâЩÎļþ»¹²»ÔÚͬһ¸ö×ÓĿ¼Ï¡£
ÌåϵµÄÅÓ´ó¸´ÔÓºÍÎļþÖ®¼ä¹ØÁªµÄ´í×Û¸´ÔÓ£¬¿ÉÄܾÍÊǺܶàÈ˶ÔÆäÍû¶øÉúηµÄÖ÷ÒªÔÒò¡£µ±È»£¬ÕâÖÖÁîÈËÉúηµÄÀͶ¯Ëù´øÀ´µÄ»Ø±¨Ò²ÊǷdz£ÁîÈË×ÅÃԵģºÄã²»½ö¿ÉÒÔ´ÓÖÐѧµ½ºÜ¶àµÄ¼ÆËã»úµÄµ×²ãµÄ֪ʶ£¨ÈçÏÂÃ潫½²µ½µÄϵͳµÄÒýµ¼£©£¬Ìå»áµ½Õû¸ö²Ù×÷ϵͳÌåϵ½á¹¹µÄ¾«ÃîºÍÔÚ½â¾öij¸ö¾ßÌåϸ½ÚÎÊÌâʱ£¬Ëã·¨µÄÇÉÃ¶øÇÒ¸üÖØÒªµÄÊÇ£ºÔÚÔ´ÂëµÄ·ÖÎö¹ý³ÌÖУ¬Äã¾Í»á±»Ò»µãÒ»µãµØ¡¢Ç±ÒÆĬ»¯µØרҵ»¯£»ÉõÖÁ£¬Ö»Òª·ÖÎöÊ®·ÖÖ®Ò»µÄ´úÂëºó£¬Äã¾Í»áÉî¿ÌµØÌå»áµ½£¬Ê²Ã´ÑùµÄ´úÂë²ÅÊÇÒ»¸öרҵµÄ³ÌÐòԱдµÄ£¬Ê²Ã´ÑùµÄ´úÂëÊÇÒ»¸öÒµÓà°®ºÃÕßдµÄ¡£
ΪÁËʹ¶ÁÕßÄܸüºÃµÄÌå»áµ½ÕâÒ»Ìص㣬ÏÂÃæ¾ÙÁËÒ»¸ö¾ßÌåµÄÄں˷ÖÎöʵÀý£¬Ï£ÍûÄÜͨ¹ýÕâ¸öʵÀý£¬Ê¹¶ÁÕß¶Ô LinuxµÄÄں˵Ä×éÖ¯ÓÐЩ¾ßÌåµÄÈÏʶ£¬´ÓÖжÁÕßÒ²¿ÉÒÔѧµ½Ò»Ð©¶ÔÄں˵ķÖÎö·½·¨¡£
ÒÔϼ´Îª·ÖÎöʵÀý£º
¡¾Ò»¡¿²Ù×÷ƽ̨:
Ó²¼þ£ºcpu intel Pentium II ;
Èí¼þ£ºRedhat Linux 6.0; Äں˰汾2.2.5¡¾¶þ¡¿Ïà¹ØÄÚºËÔ´´úÂë·ÖÎö:
1£®ÏµÍ³µÄÒýµ¼ºÍ³õʼ»¯£ºLinux ϵͳµÄÒýµ¼Óкü¸ÖÖ·½Ê½£º³£¼ûµÄÓÐ Lilo, LoadinÒýµ¼ºÍLinuxµÄ×Ô¾ÙÒýµ¼
£¨bootsect-loader£©,¶øºóÕßËù¶ÔÓ¦Ô´³ÌÐòΪarch/i386/boot/bootsect.S£¬ËüΪʵģʽµÄ»ã±à³ÌÐò£¬ÏÞÓÚƪ·ùÔڴ˲»×ö·ÖÎö£»ÎÞÂÛÊÇÄÄÖÖÒýµ¼·½Ê½£¬×îºó¶¼ÒªÌøתµ½ arch/i386/Kernel/setup.S£¬ setup.SÖ÷ÒªÊǽøÐÐʱģʽϵijõʼ»¯£¬ÎªÏµÍ³½øÈë±£»¤Ä£Ê½×ö×¼±¸£»´Ëºó£¬ÏµÍ³Ö´ÐÐ arch/i386/kernel/head.S (¶Ô¾Ñ¹Ëõºó´æ·ÅµÄÄÚºËÒªÏÈÖ´ÐÐ arch/i386/boot/compressed/head.S); head.S Öж¨ÒåµÄÒ»¶Î»ã±à³ÌÐòsetup_idt £¬Ëü¸ºÔð½¨Á¢Ò»ÕÅ256ÏîµÄ idt ±í(Interrupt Descriptor Table),´Ë±í±£´æ×ÅËùÓÐ×ÔÏݺÍÖжϵÄÈë¿ÚµØÖ·;ÆäÖаüÀ¨ÏµÍ³µ÷ÓÃ×ܿسÌÐò system_call µÄÈë¿ÚµØÖ·;µ±È»£¬³ý´ËÖ®Í⣬head.S»¹Òª×öһЩÆäËûµÄ³õʼ»¯¹¤×÷£»
2£®ÏµÍ³³õʼ»¯ºóÔËÐеĵÚÒ»¸öÄں˳ÌÐòasmlinkage void __init start_kernel(void) ¶¨ÒåÔÚ
/usr/src/linux/init/main.cÖÐ,Ëüͨ¹ýµ÷ÓÃusr/src/linux/arch/i386/kernel/traps.c ÖеÄÒ»¸öº¯Êý
void __init trap_init(void) °Ñ¸÷×ÔÏݺÍÖжϷþÎñ³ÌÐòµÄÈë¿ÚµØÖ·ÉèÖõ½ idt ±íÖÐ,ÆäÖÐϵͳµ÷ÓÃ×ܿسÌÐòsystem_cal¾ÍÊÇÖжϷþÎñ³ÌÐòÖ®Ò»;void __init trap_init(void) º¯ÊýÔòͨ¹ýµ÷ÓÃÒ»¸öºê
set_system_gate(SYSCALL_VECTOR,&system_call); °Ñϵͳµ÷ÓÃ×ܿسÌÐòµÄÈë¿Ú¹ÒÔÚÖжÏ0x80ÉÏ;
ÆäÖÐSYSCALL_VECTORÊǶ¨ÒåÔÚ /usr/src/linux/arch/i386/kernel/irq.hÖеÄÒ»¸ö³£Á¿0x80; ¶ø system_call ¼´ÎªÖжÏ×ܿسÌÐòµÄÈë¿ÚµØÖ·;ÖжÏ×ܿسÌÐòÓûã±àÓïÑÔ¶¨ÒåÔÚ/usr/src/linux/arch/i386/kernel/entry.SÖÐ;
3.ÖжÏ×ܿسÌÐòÖ÷Òª¸ºÔð±£´æ´¦Àí»úÖ´ÐÐϵͳµ÷ÓÃÇ°µÄ״̬,¼ìÑ鵱ǰµ÷ÓÃÊÇ·ñºÏ·¨, ²¢¸ù¾Ýϵͳµ÷ÓÃÏòÁ¿£¬Ê¹´¦Àí»úÌøתµ½±£´æÔÚ sys_call_table ±íÖеÄÏàӦϵͳ·þÎñÀý³ÌµÄÈë¿Ú; ´Óϵͳ·þÎñÀý³Ì·µ»Øºó»Ö¸´´¦Àí»ú״̬ÍË»ØÓû§³ÌÐò;
¶øϵͳµ÷ÓÃÏòÁ¿Ôò¶¨ÒåÔÚ/usr/src/linux/include/asm-386/unistd.h ÖÐ;sys_call_table ±í¶¨ÒåÔÚ/usr/src/linux/arch/i386/kernel/entry.S ÖÐ; ͬʱÔÚ /usr/src/linux/include/asm-386/unistd.h ÖÐÒ²¶¨ÒåÁËϵͳµ÷ÓõÄÓû§±à³Ì½Ó¿Ú;
4.Óɴ˿ɼû , linux µÄϵͳµ÷ÓÃÒ²Ïó dos ϵͳµÄ int 21h ÖжϷþÎñ, Ëü°Ñ0x80 ÖжÏ×÷Ϊ×ܵÄÈë¿Ú, È»ºóתµ½±£´æÔÚ sys_call_table ±íÖеĸ÷ÖÖÖжϷþÎñÀý³ÌµÄÈë¿ÚµØÖ· , Ðγɸ÷ÖÖ²»Í¬µÄÖжϷþÎñ;
ÓÉÒÔÉÏÔ´´úÂë·ÖÎö¿ÉÖª, ÒªÔö¼ÓÒ»¸öϵͳµ÷ÓþͱØÐëÔÚ sys_call_table ±íÖÐÔö¼ÓÒ»Ïî , ²¢ÔÚÆäÖб£´æºÃ×Ô¼ºµÄϵͳ·þÎñÀý³ÌµÄÈë¿ÚµØÖ·,È»ºóÖØбàÒëÄںˣ¬µ±È»£¬ÏµÍ³·þÎñÀý³ÌÊDZز»¿ÉÉٵġ£
ÓÉ´Ë¿ÉÖªÔÚ´Ë°ælinuxÄÚºËÔ´³ÌÐòÖÐ,Óëϵͳµ÷ÓÃÏà¹ØµÄÔ´³ÌÐòÎļþ¾Í°üÀ¨ÒÔÏÂÕâЩ:
1£®arch/i386/boot/bootsect.S
2£®arch/i386/Kernel/setup.S
3£®arch/i386/boot/compressed/head.S
4£®arch/i386/kernel/head.S
5£®init/main.c
6£®arch/i386/kernel/traps.c
7£®arch/i386/kernel/entry.S
8£®arch/i386/kernel/irq.h
9£®include/asm-386/unistd.h
µ±È»£¬ÕâÖ»ÊÇÉæ¼°µ½µÄ¼¸¸öÖ÷ÒªÎļþ¡£¶øÊÂʵÉÏ£¬Ôö¼Óϵͳµ÷ÓÃÕæÕýÒªÐÞ¸ÄÎļþÖ»ÓÐinclude/asm-386/unistd.hºÍarch/i386/kernel/entry.SÁ½¸ö;
¡¾Èý¡¿ ¶ÔÄÚºËÔ´ÂëµÄÐ޸ģº
1.ÔÚkernel/sys.cÖÐÔö¼Óϵͳ·þÎñÀý³ÌÈçÏ£º
asmlinkage int sys_addtotal(int numdata)
{
int i=0,enddata=0;
while(i<=numdata)
enddata+=i++;
return enddata;
}
¸Ãº¯ÊýÓÐÒ»¸ö int ÐÍÈë¿Ú²ÎÊý numdata , ²¢·µ»Ø´Ó 0 µ½ numdata µÄÀÛ¼ÓÖµ; µ±È»Ò²¿ÉÒÔ°Ñϵͳ·þÎñÀý³Ì·ÅÔÚÒ»¸ö×Ô¼º¶¨ÒåµÄÎļþ»òÆäËûÎļþÖУ¬Ö»ÊÇÒªÔÚÏàÓ¦ÎļþÖÐ×÷±ØÒªµÄ˵Ã÷£»
2.°Ñ asmlinkage int sys_addtotal( int) µÄÈë¿ÚµØÖ·¼Óµ½sys_call_table±íÖÐ:
arch/i386/kernel/entry.S ÖеÄ×îºó¼¸ÐÐÔ´´úÂëÐÞ¸ÄǰΪ:
... ...
.long SYMBOL_NAME(sys_sendfile)
.long SYMBOL_NAME(sys_ni_syscall) /* streams1 */
.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */
.long SYMBOL_NAME(sys_vfork) /* 190 */
.rept NR_syscalls-190
.long SYMBOL_NAME(sys_ni_syscall)
.endr
Ð޸ĺóΪ: ... ...
.long SYMBOL_NAME(sys_sendfile)
.long SYMBOL_NAME(sys_ni_syscall) /* streams1 */
.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */
.long SYMBOL_NAME(sys_vfork) /* 190 */
/* add by I */
.long SYMBOL_NAME(sys_addtotal)
.rept NR_syscalls-191
.long SYMBOL_NAME(sys_ni_syscall)
.endr
3. °ÑÔö¼ÓµÄ sys_call_table ±íÏîËù¶ÔÓ¦µÄÏòÁ¿,ÔÚinclude/asm-386/unistd.h ÖнøÐбØÒªÉêÃ÷,ÒÔ¹©Óû§½ø³ÌºÍÆäËûϵͳ½ø³Ì²éѯ»òµ÷ÓÃ:
Ôö¼ÓºóµÄ²¿·Ö /usr/src/linux/include/asm-386/unistd.h ÎļþÈçÏÂ:
... ...
#define __NR_sendfile 187
#define __NR_getpmsg 188
#define __NR_putpmsg 189
#define __NR_vfork 190
/* add by I */
#define __NR_addtotal 191
4.²âÊÔ³ÌÐò(test.c)ÈçÏÂ:
#include
#include
_syscall1(int,addtotal,int, num)
main()
{
int i,j;
¡¡¡¡do
printf("Please input a numbern");
while(scanf(" d",&i)==EOF);
if((j=addtotal(i))==-1)
printf("Error occurred in syscall-addtotal();n");
printf("Total from 0 to d is d n",i,j);
}
¶ÔÐ޸ĺóµÄеÄÄں˽øÐбàÒ룬²¢Òýµ¼Ëü×÷ΪеIJÙ×÷ϵͳ£¬ÔËÐм¸¸ö³ÌÐòºó¿ÉÒÔ·¢ÏÖÒ»ÇÐÕý³££»ÔÚеÄϵͳ϶ԲâÊÔ³ÌÐò½øÐбàÒë(*×¢£ºÓÉÓÚÔÄں˲¢Î´Ìṩ´Ëϵͳµ÷Óã¬ËùÒÔÖ»ÓÐÔÚ±àÒëºóµÄÐÂÄÚºËÏ£¬´Ë²âÊÔ³ÌÐò²ÅÄÜ¿ÉÄܱ»±àÒëͨ¹ý)£¬ÔËÐÐÇé¿öÈçÏ£º
$gcc -o test test.c
$./test
Please input a number
36
Total from 0 to 36 is 666
¿É¼û£¬Ð޸ijɹ¦£»
¶øÇÒ£¬¶ÔÏà¹ØÔ´ÂëµÄ½øÒ»²½·ÖÎö¿ÉÖª£¬ÔÚ´Ë°æ±¾µÄÄÚºËÖÐ,´Ó/usr/src/linux/arch/i386/kernel/entry.S
ÎļþÖÐ¶Ô sys_call_table ±íµÄÉèÖÿÉÒÔ¿´³ö,Óкü¸¸öϵͳµ÷ÓõķþÎñÀý³Ì¶¼ÊǶ¨ÒåÔÚ/usr/src/linux/kernel/sys.c ÖеÄͬһ¸öº¯Êý£º
asmlinkage int sys_ni_syscall(void)
{
return -ENOSYS;
}
ÀýÈçµÚ188ÏîºÍµÚ189Ïî¾ÍÊÇÈç´Ë:
... ...
.long SYMBOL_NAME(sys_sendfile)
.long SYMBOL_NAME(sys_ni_syscall) /* streams1 */
.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */
.long SYMBOL_NAME(sys_vfork) /* 190 */
... ...
¶øÕâÁ½ÏîÔÚÎļþ /usr/src/linux/include/asm-386/unistd.h ÖÐÈ´ÉêÃ÷ÈçÏÂ:
... ...
#define __NR_sendfile 187
#define __NR_getpmsg 188 /* some people actually want streams */
#define __NR_putpmsg 189 /* some people actually want streams */
#define __NR_vfork 190
Óɴ˿ɼû,ÔÚ´Ë°æ±¾µÄÄÚºËÔ´´úÂëÖÐ,ÓÉÓÚasmlinkage int sys_ni_syscall(void) º¯Êý²¢²»½øÐÐÈκβÙ×÷,ËùÒÔ°üÀ¨ getpmsg, putpmsg ÔÚÄڵĺü¸¸öϵͳµ÷Óö¼ÊDz»½øÐÐÈκβÙ×÷µÄ£¬¼´ÓдýÀ©³äµÄ¿Õµ÷Óã» µ«ËüÃÇÈ´ÈÔȻռÓÃ×Åsys_call_table±íÏ¹À¼ÆÕâÊÇÉè¼ÆÕßÃÇΪÁË·½±ãÀ©³äϵͳµ÷Óöø°²ÅŵÄ; ËùÒÔÖ»ÐèÔö¼ÓÏàÓ¦·þÎñÀý³Ì£¨ÈçÔö¼Ó·þÎñÀý³Ìgetmsg»òputpmsg£©£¬¾Í¿ÉÒÔ´ïµ½Ôö¼Óϵͳµ÷ÓõÄ×÷Óá£
½áÓµ±È»¶ÔÓÚÅÓ´ó¸´Ô linux Äں˶øÑÔ£¬Ò»ÆªÎÄÕÂÔ¶Ô¶²»¹»£¬¶øÇÒÓëϵͳµ÷ÓÃÏà¹ØµÄ´úÂëÒ²Ö»ÊÇÄÚºËÖм«Æä΢СµÄÒ»²¿·Ö£»µ«ÖØÒªµÄÊÇ·½·¨¡¢ÕÆÎպõķÖÎö·½·¨£»ËùÒÔÉϵķÖÎöÖ»ÊÇÆð¸öÒýµ¼µÄ×÷Ó㬶øÕýÕæµÄ·ÖÎö»¹ÓдýÓÚ¶ÁÕß×Ô¼ºµÄŬÁ¦¡£:)