ºìÁªLinuxÃÅ»§
Linux°ïÖú

LinuxÄں˽â¶ÁÈëÃÅ

·¢²¼Ê±¼ä:2006-09-11 16:25:27À´Ô´:ºìÁª×÷Õß:yorktown
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 Äں˶øÑÔ£¬Ò»ÆªÎÄÕÂÔ¶Ô¶²»¹»£¬¶øÇÒÓëϵͳµ÷ÓÃÏà¹ØµÄ´úÂëÒ²Ö»ÊÇÄÚºËÖм«Æä΢СµÄÒ»²¿·Ö£»µ«ÖØÒªµÄÊÇ·½·¨¡¢ÕÆÎպõķÖÎö·½·¨£»ËùÒÔÉϵķÖÎöÖ»ÊÇÆð¸öÒýµ¼µÄ×÷Ó㬶øÕýÕæµÄ·ÖÎö»¹ÓдýÓÚ¶ÁÕß×Ô¼ºµÄŬÁ¦¡£:)
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ