CÓïÑÔÒÔÆä¸ßЧ¡¢Áé»îµÄÌØÐÔ£¬³ÉΪµ×²ã¿ª·¢¡¢ÏµÍ³±à³ÌµÄÊ×Ñ¡£»¶øLinux£¬ÔòÒÔÆä¿ªÔ´¡¢Îȶ¨µÄÓÅÊÆ£¬ÔÚ·þÎñÆ÷¡¢Ç¶Èëʽϵͳ¡¢ÉõÖÁ×ÀÃæ»·¾³Öй㷺ӦÓÃ
ÔÚCÓïÑÔÓëLinuxµÄ½áºÏÖУ¬ºê£¨Macro£©×÷ΪһÖÖÇ¿´óµÄÔ¤´¦ÀíÖ¸Á²»½öÔöÇ¿ÁË´úÂëµÄ¿É¶ÁÐԺͿÉά»¤ÐÔ£¬»¹¼«´óµØÌáÉýÁ˱à³ÌµÄЧÂʺÍÁé»îÐÔ
±¾ÎĽ«ÉîÈë̽ÌÖCÓïÑÔÔÚLinux»·¾³ÏµĺêÓ¦Ó㬽ÒʾÆäÈçºÎ³ÉΪ½âËø±à³ÌDZÄܵĹؼü¹¤¾ß
Ò»¡¢ºêµÄ»ù±¾¸ÅÄîÓëÓÅÊÆ ºêÊÇCÓïÑÔÔ¤´¦Àí½×¶ÎµÄÒ»¸öÖØÒª×é³É²¿·Ö£¬ËüÔÊÐí³ÌÐòÔ±ÔÚ±àÒë֮ǰ¶ÔÔ´´úÂë½øÐÐÎı¾Ìæ»»²Ù×÷
ºêµÄ¶¨Òåͨ¹ý`define`Ö¸ÁîÍê³É£¬Æä»ù±¾Ó﷨Ϊ`define ºêÃû Ìæ»»Îı¾`
ºê¿ÉÒÔ·ÖΪÎÞ²ÎÊýºêºÍ´ø²ÎÊýºêÁ½À࣬ǰÕßÖ±½ÓÌæ»»ºêÃû£¬ºóÕßÔò¸ù¾Ý´«ÈëµÄ²ÎÊý½øÐÐÌæ»»£¬ÀàËÆÓÚº¯ÊýµÄµ÷Ó㬵«ÓÖ²»Í¬ÓÚº¯Êýµ÷Óã¬ÒòΪºêÕ¹¿ªÊÇÔÚ±àÒëǰ½øÐе쬲»Éæ¼°ÔËÐÐʱ¿ªÏú
ºêµÄÖ÷ÒªÓÅÊÆÌåÏÖÔÚ£º 1.´úÂ븴ÓãºÍ¨¹ý¶¨Òåºê£¬¿ÉÒÔ½«Öظ´µÄ´úÂëÆ¬¶Î³éÏó³öÀ´£¬¼õÉÙ´úÂëÈßÓ࣬Ìá¸ß¿ª·¢Ð§ÂÊ
2.Ìá¸ß¿É¶ÁÐÔ£ººê¿ÉÒÔΪ¸´Ôӵıí´ïʽ»ò²Ù×÷ÃüÃû£¬Ê¹´úÂë¸ü¼ÓÖ±¹ÛÒ×¶®
3.Ìõ¼þ±àÒ룺ÀûÓÃ#ifdef¡¢# ifndef¡¢`#if`¡¢`else`¡¢`#elif`¡¢`endif`µÈÔ¤´¦ÀíÖ¸Á¿ÉÒÔ¸ù¾Ý±àÒëÌõ¼þÑ¡ÔñÐԵذüº¬»òÅųý´úÂë¶Î£¬ÊµÏÖ¿çÆ½Ì¨¼æÈÝÐÔ
4.ÐÔÄÜÓÅ»¯£ººêÕ¹¿ª¿ÉÒÔ±ÜÃ⺯Êýµ÷ÓõĿªÏú£¬ÌرðÊÇÔÚǶÈëʽϵͳºÍÐÔÄÜÃô¸ÐµÄÓ¦ÓÃÖÐÓÈÎªÖØÒª
¶þ¡¢Linux»·¾³ÏµĺêÓ¦ÓÃʵÀý ÔÚLinuxϵͳ±à³ÌÖУ¬ºêµÄÓ¦ÓÃÎÞ´¦²»ÔÚ£¬´Ó»ù±¾µÄϵͳµ÷Ó÷â×°µ½¸´ÔÓµÄÄÚºËÄ£¿é¿ª·¢£¬ºê¶¼·¢»Ó×Ų»¿É»òȱµÄ×÷ÓÃ
1. ϵͳµ÷Ó÷â×° Linuxϵͳµ÷ÓÃÊÇÓû§¿Õ¼ä³ÌÐòÓëÄں˽»»¥µÄÇÅÁº
ÔÚCÓïÑÔÖУ¬Ö±½Óµ÷ÓÃϵͳµ÷ÓÃͨ³£Éæ¼°¸´ÔӵĻã±àÓïÑÔ֪ʶºÍÆ½Ì¨ÌØ¶¨µÄϸ½Ú
ΪÁ˼ò»¯ÕâÒ»¹ý³Ì£¬LinuxÌṩÁËÒ»×é·â×°Á˵ײãϵͳµ÷ÓõĿ⺯Êý£¨Èç`open`¡¢`read`¡¢`write`µÈ£©£¬µ«ÕâЩ¿âº¯ÊýÔÚijЩÇé¿öÏ¿ÉÄܲ»¹»Áé»î»ò¸ßЧ
´Ëʱ£¬¿ÉÒÔͨ¹ýºêÀ´¶¨Òå¸üµ×²ãµÄϵͳµ÷Óýӿڣ¬ÊµÏÖ¸ü¾«Ï¸µÄ¿ØÖÆ
define_syscall3(type,name,type1,arg1,type2,arg2,type3,arg type name(type1 arg1,type2 arg2,type3 arg{ long__res; __asm__volatile (int $0x80 : =a (__res) : 0 (__NR_##name),b((long)(arg1)),c ((long)(arg2)),d((long)(arg3)) : memory); if(__res >= return(type) __res; errno = -__res; return -1; } _syscall3(int,my_read,int,fd,char ,buf,int,count); ÉÏÊö´úÂ붨ÒåÁËÒ»¸öÃûΪ`_syscall3`µÄºê£¬ÓÃÓÚÉú³É¾ßÓÐÈý¸ö²ÎÊýµÄϵͳµ÷Ó÷â×°º¯Êý
ͨ¹ýÕâ¸öºê£¬ÎÒÃÇ¿ÉÒÔÇáËɵض¨Òå×Ô¼ºµÄ`my_read`º¯Êý£¬ËüÖ±½Óµ÷ÓÃLinuxÄں˵Ä`read`ϵͳµ÷ÓÃ
2. Ìõ¼þ±àÒëÓëÆ½Ì¨ÊÊÓ¦ÐÔ Linux²Ù×÷ϵͳ֧³Ö¶àÖÖÓ²¼þ¼Ü¹¹ºÍ±àÒëÆ÷£¬Òò´ËÔÚ±àд¿çƽ̨´úÂëʱ£¬Ìõ¼þ±àÒëÏÔµÃÓÈÎªÖØÒª
ºêÔÚÕâÀï°çÑÝÁ˹ؼü½ÇÉ«
ifdef__linux__
include ͨ¹ýÕâÖÖ·½·¨£¬ÎÒÃÇ¿ÉÒÔÇáËɵرàд³öÄܹ»ÔÚ²»Í¬Æ½Ì¨ÉϱàÒëºÍÔËÐеĴúÂë
3. ÄÚºËÄ£¿é¿ª·¢Öеĺê
ÔÚLinuxÄÚºËÄ£¿é¿ª·¢ÖУ¬ºê±»¹ã·ºÓ¦ÓÃÓÚ´íÎó´¦Àí¡¢ÈÕÖ¾¼Ç¼¡¢ÄÚ´æ¹ÜÀíµÈ¸÷¸ö·½Ãæ ÀýÈ磬ÄÚºËÖг£¼ûµÄ`BUG_ON`ºÍ`WARN_ON`ºêÓÃÓÚÔÚµ÷ÊԽ׶β¶»ñ²»Ó¦¸Ã·¢ÉúµÄÌõ¼þ£¬¶ø`printk`ºêÔòÓÃÓÚÊä³öÄÚºËÈÕÖ¾
defineBUG_ON(condition)do {if (unlikely(condition))__BUG(); }while(
defineWARN_ON(condition)({
bool__ret_warn_on= !!(condition);
if(unlikely(__ret_warn_on))
warn_slowpath(__ret_warn_on, WARN_ON(%s), __stringify(condition));
__ret_warn_on;
})
// ʹÓÃʾÀý
BUG_ON(x == 0);
WARN_ON(y < 0);
ÕâЩºê²»½ö¼ò»¯ÁË´úÂ룬»¹Ìá¸ßÁË´úÂëµÄ°²È«ÐԺͿÉά»¤ÐÔ Í¨¹ý`__BUG`ºÍ`warn_slowpath`µÈµ×²ãº¯Êý£¬ËüÃÇÄܹ»ÔÚ¼ì²âµ½´íÎóÌõ¼þʱÁ¢¼´²ÉÈ¡Ðж¯£¬°ïÖú¿ª·¢Õß¿ìËÙ¶¨Î»ºÍ½â¾öÎÊÌâ
Èý¡¢ºêµÄDZÔÚ·çÏÕÓë×î¼Ñʵ¼ù
¾¡¹ÜºêÌṩÁËÇ¿´óµÄ¹¦ÄÜ£¬µ«²»µ±µÄʹÓÃÒ²¿ÉÄÜÒýÈëÄÑÒÔµ÷ÊÔµÄÎÊÌâ ³£¼ûµÄ·çÏÕ°üÀ¨£º
- ºêÕ¹¿ª´íÎ󣺸´Ôӵĺ궨Òå¿ÉÄܵ¼ÖÂÒâÍâµÄÕ¹¿ª½á¹û£¬ÌرðÊÇÔÚÉæ¼°¶àÖØÌæ»»ºÍºê²ÎÊýÕ¹¿ªÊ±
- ´úÂë¿É¶ÁÐÔϽµ£º¹ý¶ÈʹÓÃºê£¬ÌØ±ðÊÇ´ø²ÎÊýµÄºê£¬¿ÉÄÜʹ´úÂë±äµÃÄÑÒÔÀí½â
- µ÷ÊÔÀ§ÄÑ£ºÓÉÓÚºêÕ¹¿ª·¢ÉúÔÚ±àÒëǰ£¬µ÷ÊÔÆ÷ͨ³£ÎÞ·¨Ö±½ÓÏÔʾºêÕ¹¿ªºóµÄ´úÂ룬Ôö¼ÓÁ˵÷ÊÔÄѶÈ
ΪÁ˱ÜÃâÕâЩÎÊÌ⣬½¨Òé²ÉÈ¡ÒÔÏÂ×î¼Ñʵ¼ù£º
- ±£³Öºê¼òµ¥£º¾¡Á¿Ê¹ºêµÄ¶¨Òå¼òµ¥Ã÷ÁË£¬±ÜÃ⸴ÔÓµÄǶÌ׺ÍÌõ¼þÅжÏ
- ʹÓÃ# pragma message£ºÔں궨ÒåÖÐʹÓÃ`#pragma message`À´Êä³öÓÐÓõĵ÷ÊÔÐÅÏ¢£¬°ïÖúÀí½âºêµÄÕ¹¿ª½á¹û
- Îĵµ»¯ºê£º¶Ôºê½øÐгä·ÖµÄ×¢ÊͺÍÎĵµ»¯£¬ËµÃ÷ÆäÓÃ;¡¢²ÎÊýºÍ·µ»ØÖµ£¬ÒÔÌá¸ß´úÂëµÄ¿É¶ÁÐԺͿÉά»¤ÐÔ
- ÉóÉ÷ʹÓôø²ÎÊýµÄºê£ºÔÚ¶¨Òå´ø²ÎÊýµÄºêʱ£¬ÒªÌرð×¢Òâ²ÎÊýµÄÀàÐͺÍ˳Ðò£¬±ÜÃâDZÔڵĴíÎó