LinuxÍøÂçÇý¶¯³ÌÐò±àд(Ò»)
¹¤×÷ÐèҪдÁËÎÒÃǹ«Ë¾Ò»¿éÍø¿¨µÄLinuxÇý¶¯³ÌÐò¡£¾ÀúÒ»¸ö´ÓÎÞµ½ÓеĹý³Ì£¬Éî¸Ð¼¼Êõ½»Á÷µÄÖØÒª¡£Linux×÷ΪÌôս΢Èí¢¶ÏµÄÇ¿ÓÐÁ¦ÎäÆ÷£¬ÈÕÒæÊܵ½´ó¼ÒµÄϲ°®¡£ÕæÏ£ÍûËýÄÜÔÚÖйúѸËٳɳ¤¡£°Ñ³ÌÐòÎĵµÌù³öÀ´£¬Ï£ÍûºÍ´ó¼Ò̽ÌÖLinux¼¼ÊõºÍÓ¦Ó㬴ٽøLinuxÔÚÖйúµÄÆÕ¼°¡£
¡¡¡¡±¾ÎÄ¿ÉËæÒâ×ªÔØ£¬µ«Çë²»ÒªÔÚÓ¯ÀûÐÔ³ö°æÎïÉÏ¿¯µÇ¡£
¡¡¡¡Ò».LinuxϵͳÉ豸Çý¶¯³ÌÐò¸ÅÊö
¡¡¡¡1.1 LinuxÉ豸Çý¶¯³ÌÐò·ÖÀà
¡¡¡¡LinuxÉ豸Çý¶¯³ÌÐòÔÚLinuxµÄÄÚºËÔ´´úÂëÖÐÕ¼ÓкܴóµÄ±ÈÀý£¬Ô´´úÂëµÄ³¤¶ÈÈÕÒæÔö¼Ó£¬Ö÷ÒªÊÇÇý¶¯³ÌÐòµÄÔö¼Ó¡£ÔÚLinuxÄں˵IJ»¶ÏÉý¼¶¹ý³ÌÖУ¬Çý¶¯³ÌÐòµÄ½á¹¹»¹ÊÇÏà¶ÔÎȶ¨¡£ÔÚ2.0.xxµ½2.2.xxµÄ±ä¶¯ÀÇý¶¯³ÌÐòµÄ±àд×öÁËһЩ¸Ä±ä£¬µ«ÊÇ´Ó2.0.xxµÄÇý¶¯µ½2.2.xxµÄÒÆÖ²Ö»Ðè×öÉÙÁ¿µÄ¹¤×÷¡£
¡¡¡¡LinuxϵͳµÄÉ豸·ÖΪ×Ö·ûÉ豸(char device)£¬¿éÉ豸(block device)ºÍÍøÂçÉ豸(network device)ÈýÖÖ¡£×Ö·ûÉ豸ÊÇÖ¸´æÈ¡Ê±Ã»Óлº´æµÄÉ豸¡£¿éÉ豸µÄ¶Áд¶¼Óлº´æÀ´Ö§³Ö£¬²¢ÇÒ¿éÉ豸±ØÐëÄܹ»Ëæ»ú´æÈ¡(random access)£¬×Ö·ûÉ豸ÔòûÓÐÕâ¸öÒªÇó¡£µäÐ͵Ä×Ö·ûÉ豸°üÀ¨Êó±ê£¬¼üÅÌ£¬´®Ðпڵȡ£¿éÉ豸Ö÷Òª°üÀ¨Ó²ÅÌÈíÅÌÉ豸£¬CD-ROMµÈ¡£Ò»¸öÎļþϵͳҪ°²×°½øÈë²Ù×÷ϵͳ±ØÐëÔÚ¿éÉ豸 ......
¶þ.LinuxÏµÍ³ÍøÂçÉ豸Çý¶¯³ÌÐò
¡¡¡¡2.1 ÍøÂçÇý¶¯³ÌÐòµÄ½á¹¹
¡¡¡¡ËùÓеÄLinuxÍøÂçÇý¶¯³ÌÐò×ñÑͨÓõĽӿڡ£Éè¼ÆÊ±²ÉÓõÄÊÇÃæÏò¶ÔÏóµÄ·½·¨¡£Ò»¸öÉ豸¾ÍÊÇÒ»¸ö¶ÔÏó(device ½á¹¹)£¬ËüÄÚ²¿ÓÐ×Ô¼ºµÄÊý¾ÝºÍ·½·¨¡£Ã¿Ò»¸öÉ豸µÄ·½·¨±»µ÷ÓÃʱµÄµÚÒ»¸ö²ÎÊý¶¼ÊÇÕâ¸öÉ豸¶ÔÏó±¾Éí¡£ÕâÑùÕâ¸ö·½·¨¾Í¿ÉÒÔ´æÈ¡×ÔÉíµÄÊý¾Ý(ÀàËÆÃæÏò¶ÔÏó³ÌÐòÉè¼ÆÊ±µÄthisÒýÓÃ)¡£Ò»¸öÍøÂçÉ豸×î»ù±¾µÄ·½·¨Óгõʼ»¯¡¢·¢ËͺͽÓÊÕ¡£
¡¡¡¡ -------------------¡¡¡¡¡¡¡¡¡¡¡¡---------------------
¡¡¡¡|deliver packets¡¡¡¡|¡¡¡¡¡¡¡¡¡¡|receive packets queue|
¡¡¡¡|(dev_queue_xmit()) |¡¡¡¡¡¡¡¡¡¡|them(netif_rx())¡¡¡¡ |
¡¡¡¡ -------------------¡¡¡¡¡¡¡¡¡¡¡¡---------------------
¡¡¡¡¡¡¡¡|¡¡¡¡¡¡¡¡ |¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡/¡¡¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ /¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡|¡¡¡¡¡¡¡¡¡¡|
¡¡¡¡-------------------------------------------------------
¡¡ | methods and variables(initialize,open,close,hard_xmit,|
¡¡ | interrupt handler,config,resources,status...)¡¡¡¡¡¡¡¡ |
¡¡¡¡ ......
topÃüÁîºÍpsÃüÁîµÄ»ù±¾×÷ÓÃÊÇÏàͬµÄ£¬ÏÔʾϵͳµ±Ç°µÄ½ø³ÌºÍÆäËü×´¿ö£»µ«ÊÇtopÊÇÒ»¸ö¶¯Ì¬ÏÔʾ¹ý³Ì£¬¼´¿ÉÒÔͨ¹ýÓû§°´¼üÀ´²»¶Ïˢе±Ç°×´Ì¬¡£Èç¹ûÔÚǰִ̨ÐиÃÃüÁËü½«¶Àռǰ̨£¬Ö±µ½Óû§ÖÕÖ¹¸Ã³ÌÐòΪֹ¡£±È½Ï׼ȷµÄ˵£¬topÃüÁîÌṩÁËʵʱµÄ¶Ôϵͳ´¦ÀíÆ÷µÄ״̬¼àÊÓ¡£Ëü½«ÏÔʾϵͳÖÐCPU×î“Ãô¸Ð”µÄÈÎÎñÁÐ±í¡£¸ÃÃüÁî¿ÉÒÔ°´CPUʹÓá£ÄÚ´æÊ¹ÓúÍÖ´ÐÐʱ¼ä¶ÔÈÎÎñ½øÐÐÅÅÐò£»¶øÇÒ¸ÃÃüÁîµÄºÜ¶àÌØÐÔ¶¼¿ÉÒÔͨ¹ý½»»¥Ê½ÃüÁî»òÕßÔÚ¸öÈ˶¨ÖÆÎļþÖнøÐÐÉ趨¡£ÔÚºóÃæµÄ½éÉÜÖн«°ÑÃüÁî²ÎÊýºÍ½»»¥ÃüÁî·Ö¿ª½²Êö¡£
ÏÂÃæÊǸÃÃüÁîµÄÓï·¨¸ñʽ£º
top [-] [d delay] [q] [c] [s] [S]
d Ö¸¶¨Ã¿Á½´ÎÆÁÄ»ÐÅϢˢÐÂÖ®¼äµÄʱ¼ä¼ä¸ô¡£µ±È»Óû§¿ÉÒÔʹÓÃs½»»¥ÃüÁîÀ´¸Ä±äÖ®¡£
q ¸ÃÑ¡ÏʹtopûÓÐÈκÎÑӳٵĽøÐÐˢС£Èç¹ûµ÷ÓóÌÐòÓг¬¼¶Óû§È¨ÏÞ£¬ÄÇçÛtop½«ÒÔ¾¡¿ÉÄܸߵÄÓÅÏȼ¶ÔËÐС£
S Ö¸¶¨ÀÛ¼ÆÄ£Ê½¡£
s ʹtopÃüÁîÔÚ°²È«Ä£Ê½ÖÐÔËÐС£Õ⽫ȥ³ý½»»¥ÃüÁîËù´øÀ´µÄDZÔÚΣÏÕ¡£
i ʹtop²»ÏÔʾÈκÎÏÐÖûòÕß½©ËÀ½ø³Ì¡£
c ÏÔʾÕû¸öÃüÁîÐжø²»Ö»ÊÇÏÔʾÃüÁîÃû
topÃüÁîÏÔʾµÄÏîÄ¿ºÜ¶à£¬Ä¬ÈÏÖµÊÇÿ5Ãë¸üÐÂÒ»´Î£¬µ±È»ÕâÊÇ¿ÉÒÔÉèÖõġ£ÏÔʾµÄ¸÷ÏîĿΪ£º
uptime ¸ÃÏîÏÔʾµÄÊÇϵͳÆô¶¯Ê±¼ä¡¢ÒѾÔËÐеÄʱ¼äºÍÈý ......
¡¡2.4 ³£ÓõÄϵͳ֧³Ö
¡¡¡¡2.4.1 ÄÚ´æÉêÇëºÍÊÍ·Å
¡¡¡¡include/linux/kernel.hÀïÉùÃ÷ÁËkmalloc()ºÍkfree()¡£ÓÃÓÚÔÚÄÚºËģʽÏÂÉêÇëºÍÊÍ·ÅÄÚ´æ¡£
¡¡¡¡void *kmalloc(unsigned int len,int priority);
¡¡¡¡void kfree(void *__ptr);
¡¡¡¡ÓëÓû§Ä£Ê½ÏµÄmalloc()²»Í¬£¬kmalloc()ÉêÇë¿Õ¼äÓдóСÏÞÖÆ¡£³¤¶ÈÊÇ2µÄÕû´Î·½¡£¿ÉÒÔÉêÇëµÄ×î´ó³¤¶ÈÒ²ÓÐÏÞÖÆ¡£ÁíÍâkmalloc()ÓÐpriority²ÎÊý£¬Í¨³£Ê¹ÓÃʱ¿ÉÒÔΪGFP_KERNEL£¬Èç¹ûÔÚÖжÏÀïµ÷ÓÃÓÃGFP_ATOMIC²ÎÊý£¬ÒòΪʹÓÃGFP_KERNELÔòµ÷ÓÃÕß¿ÉÄܽøÈësleep״̬£¬ÔÚ´¦ÀíÖжÏʱÊDz»ÔÊÐíµÄ¡£
¡¡¡¡kfree()ÊͷŵÄÄÚ´æ±ØÐëÊÇkmalloc()ÉêÇëµÄ¡£Èç¹ûÖªµÀÄÚ´æµÄ´óС£¬Ò²¿ÉÒÔÓÃkfree_s()ÊÍ·Å¡£
¡¡¡¡2.4.2 request_irq()¡¢free_irq()
¡¡¡¡ÕâÊÇÇý¶¯³ÌÐòÉêÇëÖжϺÍÊÍ·ÅÖжϵĵ÷Óá£ÔÚinclude/linux/sched.hÀïÉùÃ÷¡£request_irq()µ÷Óõ͍Ò壺
¡¡¡¡int request_irq(unsigned int irq,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ void (*handler)(int irq, void *dev_id, struct pt_regs *regs),
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ unsigned long irqflags,
¡ ......
¡¡Èý.±àдLinuxÍøÂçÇý¶¯³ÌÐòÖÐÐèҪעÒâµÄÎÊÌâ
¡¡¡¡3.1 ÖжϹ²Ïí
¡¡¡¡LinuxϵͳÔËÐм¸¸öÉ豸¹²Ïíͬһ¸öÖжϡ£ÐèÒª¹²ÏíµÄ»°£¬ÔÚÉêÇëµÄʱºòÖ¸Ã÷¹²Ïí·½Ê½¡£ÏµÍ³ÌṩµÄrequest_irq()µ÷Óõ͍Ò壺
¡¡¡¡¡¡¡¡int request_irq(unsigned int irq,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡void (*handler)(int irq, void *dev_id, struct pt_regs *regs),
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡unsigned long irqflags,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡const char * devname,
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡void *dev_id);
¡¡¡¡Èç¹û¹²ÏíÖжϣ¬irqflagsÉèÖÃSA_SHIRQÊôÐÔ£¬ÕâÑù¾ÍÔÊÐí±ðµÄÉ豸ÉêÇëͬһ¸öÖжϡ£ÐèҪעÒâËùÓÐÓõ½Õâ¸öÖжϵÄÉ豸ÔÚµ÷ÓÃrequest_irq()¶¼±ØÐëÉèÖÃÕâ¸öÊôÐÔ¡£ÏµÍ³Ôڻص÷ÿ¸öÖжϴ¦Àí³ÌÐòʱ£¬¿ÉÒÔÓÃdev_idÕâ¸ö²ÎÊýÕÒµ½ÏàÓ¦µÄÉ豸¡£ÏµÍ³Ôڻص÷ÿ¸öÖжϴ¦Àí³ÌÐòʱ£¬¿ÉÒÔÓÃdev_idÕâ¸ö²ÎÊýÕÒµ½ÏàÓ¦µÄÉ豸¡£Ò»°ãdev_id¾ÍÉèΪdevice½á¹¹±¾Éí¡£ÏµÍ³´¦Àí¹²ÏíÖжÏÊÇÓø÷×ÔµÄdev_id²ÎÊýÒÀ´Îµ÷ÓÃÿһ¸öÖжϴ¦Àí³ÌÐò¡£
¡¡¡¡3.2 Ó²¼þ·¢ËÍæʱµÄ´¦Àí
¡¡¡¡Ö÷CPUµÄ´¦ÀíÄÜÁ¦Ò»°ã±ÈÍøÂç·¢ËÍÒª¿ì£¬ËùÒÔ¾³£»áÓöµ½ÏµÍ³ÓÐÊý¾ÝÒª·¢£¬µ«ÉÏÒ»°üÊý¾ÝÍøÂçÉ豸»¹Ã»·¢ËÍÍê¡£ÒòΪÔÚLinuxÀïÍøÂçÉ豸Çý¶¯³ÌÐòÒ»°ã²»×öÊý¾Ý»º´æ£¬²»ÄÜ·¢Ë͵ÄÊý¾Ý¶¼Ê ......
ÐòÑÔ
¡¡¡¡LinuxÊÇUnix²Ù×÷ϵͳµÄÒ»ÖÖ±äÖÖ£¬ÔÚLinuxϱàдÇý¶¯³ÌÐòµÄÔÀíºÍ˼ÏëÍêÈ«ÀàËÆÓÚÆäËûµÄUnixϵͳ£¬µ«Ëüdos»òwindow»·¾³ÏµÄÇý¶¯³ÌÐòÓкܴóµÄÇø±ð¡£ÔÚLinux»·¾³ÏÂÉè¼ÆÇý¶¯³ÌÐò£¬Ë¼Ïë¼ò½à£¬²Ù×÷·½±ã£¬¹¦ÄÜÒ²ºÜÇ¿´ó£¬µ«ÊÇÖ§³Öº¯ÊýÉÙ£¬Ö»ÄÜÒÀÀµkernelÖеĺ¯Êý£¬ÓÐЩ³£ÓõIJÙ×÷Òª×Ô¼ºÀ´±àд£¬¶øÇÒµ÷ÊÔÒ²²»·½±ã¡£±¾ÈËÕ⼸ÖÜÀ´ÎªÊµÑéÊÒ×ÔÐÐÑÐÖÆµÄÒ»¿é¶àýÌ忨±àÖÆÁËÇý¶¯³ÌÐò£¬»ñµÃÁËһЩ¾Ñ飬ԸÓëLinux fans¹²Ïí£¬Óв»µ±Ö®´¦£¬ÇëÓèÖ¸Õý¡£
¡¡¡¡ÒÔϵÄһЩÎÄ×ÖÖ÷ÒªÀ´Ô´ÓÚkhg£¬johnsonmµÄWrite linux device driver£¬Brennan's Guide to Inline Assembly£¬The Linux A-Z£¬»¹ÓÐÇ廪BBSÉϵÄÓйØdevice driverµÄһЩ×ÊÁÏ. ÕâЩ×ÊÁÏÓеÄÒѾ¹ýʱ£¬ÓеϹÓÐһЩ´íÎó£¬ÎÒÒÀ¾Ý×Ô¼ºµÄÊÔÑé½á¹û½øÐÐÁËÐÞÕý.
¡¡¡¡Ò»¡¢Linux device driver µÄ¸ÅÄî
¡¡¡¡ÏµÍ³µ÷ÓÃÊDzÙ×÷ϵͳÄں˺ÍÓ¦ÓóÌÐòÖ®¼äµÄ½Ó¿Ú£¬É豸Çý¶¯³ÌÐòÊDzÙ×÷ϵͳÄں˺ͻúÆ÷Ó²¼þÖ®¼äµÄ½Ó¿Ú.É豸Çý¶¯³ÌÐòΪӦÓóÌÐòÆÁ±ÎÁËÓ²¼þµÄϸ½Ú£¬ÕâÑùÔÚÓ¦ÓóÌÐò¿´À´£¬Ó²¼þÉ豸ֻÊÇÒ»¸öÉ豸Îļþ£¬ Ó¦ÓóÌÐò¿ÉÒÔÏó²Ù×÷ÆÕͨÎļþÒ»Ñù¶ÔÓ²¼þÉ豸½øÐвÙ×÷.É豸Çý¶¯³ÌÐòÊÇÄں˵ÄÒ»²¿·Ö£¬ËüÍê³ÉÒÔÏµĹ¦ÄÜ:
¡¡¡¡1.¶ÔÉ豸³õʼ»¯ºÍÊÍ·Å.
¡¡¡¡2. ......