¸ß¼¶¿É±à³Ì¿ØÖÆÆ÷
Èç¹ûϵͳֻÓÐÒ»¸öcpu£¬Ö÷picÊä³öÏßÒÔÖ±½ØÁ˵±µÄ·½Ê½Á¬½Óµ½cpuµÄintrÒý½Å¡£Èç¹ûϵͳÖаüº¬Á½¸ö»ò¶à¸öcpu,¾ÍÐèÒª¸ü¼Ó¸´ÔÓµÄpic.
intel´Óp3¿ªÊ¼ÒýÈëi/o¸ß¼¶¿É±ä³É¿ØÖÆÆ÷£¨APIC£©×é¼þ¡£80x86΢´¦ÀíÆ÷µ±Ç°ËùÓеÄcpu¶¼º¬ÓÐÒ»¸ö±¾µØapic¡£Ã¿¸ö±¾µØapic¶¼ÓÐ32λ¼Ä´æÆ÷£¬Ò»¸öÄÚ²¿Ê±ÖÓ£¬Ò»¸ö±¾µØ¶¨ÊÇÉ豸ÒÔ¼°Îª±¾µØapicÖжϱ£ÁôµÄÁ½Ìõ¶îÍâµÄirqÏßlint0ºÍlint1¡£ËùÓб¾µØapic¶¼Á¬½Óµ½Ò»¸öÍⲿi/o apic£¬ÐγÉÒ»¸ö¶àapicϵͳ¡£
i/o apicµÄ×é³É£ºÒ»×é24ÌõirqÏߣ¬Ò»ÕÅ24ÏîµÄÖж϶¨Ïò±í£¨interrupt redirection table£©£¬¿É±à³Ì¼Ä´æÆ÷£¬ÒÔ¼°Í¨¹ýapic×ÜÏß·¢ËͺͽÓÊÕapicÐÅÏ¢µÄÒ»¸öÐÅÏ¢µ¥Ôª£¬ÖжÏÓÅÏȼ¶²¢²»ÓëÒý½ÅºÅÏà¹ØÁª£ºÖжÏÖØ¶¨Ïò±íÖеÄÿһÏî¶¼¿ÉÒÔ±»µ¥¶À±ä³ÉÒÔÖ¸Ã÷ÖжÏÏòÁ¿ºÍÓÅÏȼ¶£¬Ä¿±ê´¦ÀíÆ÷ÒÔ¼°Ñ¡Ôñ´¦ÀíÆ÷µÄ·½Ê½¡£Öض¨Ïò±íÖеÄÐÅÏ¢ÓÃÓÚ°Ñÿ¸öÍⲿirq ÐźÅת»»ÎªÒ»ÌõÏûÏ¢£¬Í¨¹ýapic×ÜÏß°ÑÏûÏ¢·¢Ë͸øÒ»¸ö»òÕß¶à¸ö±¾µØapicµ¥Ôª¡£
À´×ÔÍⲿӲ¼þÉ豸µÄÖжÏÇëÇóÒÔÁ½ÖÖ·½Ê½ÔÚ¿ÉÓÃcpuÖ®¼ä·Ö·¢£º
1¾²Ì¬·Ö·¢£ºirqÐźŴ«µÝ¸øÖض¨Ïò±íÏàÓ¦ÏîÖÐËùÁгöµÄ±¾µØapic¡£ÖжÏÁ¢¼´´«µÝ¸øÒ»¸öÌØ¶¨µÄcpu£¬»òÕßÒ»×écpu,»òÕßËùÓÐcpu.
2¶¯Ì¬·Ö·¢£ºÈç¹û´¦ÀíÆ÷ÕýÔÚÖ´ÐÐ×îµÍÓÅÏȼ¶µÄ½ø³Ì£¬i ......
³õʼ»¯ÖжÏÃèÊö·û±í
ÄÚºËÆôÓÃÖжÏÒÔǰ£¬±ØÐë°Ñidt±íµÄ³õʼµØÖ·×°µ½idtr¼Ä´æÆ÷£¬²¢³õʼ»¯±íÖеÄÿһÏî¡£ÕâÏ×÷ÊÇÔÚ³õʼ»¯ÏµÍ³Ê±Íê³É¡£
intÖ¸ÁîÔÊÐíÓû§Ì¬½ø³Ì·¢³öÒ»¸öÖжÏÐźţ¬ÆäÖµ¿ÉÒÔÊÇ0-255µÄÈÎÒâÒ»¸öÏòÁ¿¡£Òò´Ë¡£ÎªÁË·ÀÖ¹Óû§Í¨¹ýintÖ¸ÁîÄ£Äâ·Ç·¨µÄÖжϺÍÒì³££¬idtµÄ³õʼ»¯±ØÐë·Ç³£Ð¡ÐÄ¡£Õâ¿ÉÒÔͨ¹ý°ÑÖжϻòÕßÏÝÚåÃÅÃèÊö·ûµÄdpl×Ö¶ÎÉèÖóÉ0À´ÊµÏÖ¡£Èç¹û½ø³ÌÊÔͼ·¢³öÆäÖеÄÒ»¸öÖжÏÐźţ¬¿ØÖƵ¥Ôª½«¼ì²é³öcplµÄÊýÖµÓëdplµÄ×Ö¶ÎÓгåÍ»£¬²¢ÇÒ²úÉúÒ»¸ögeneral protectionÒì³£¡£
intelÌṩÁËÈýÖÖÀàÐ͵ÄÖжÏÃèÊö·û£ºÈÎÎñÃÅ£¬ÖжÏÃÅ£¬ÒÔ¼°ÏÝÚåÃÅÃèÊö·û¡£linuxʹÓÃÓëinetl²»Í¬µÄϸĿ·ÖÀàºÍÊõÓ
ÖжÏÃÅ£¨interrupt gate£©ËùÓÐlinuxÖжϴ¦Àí³ÌÐò¶¼Í¨¹ýÖжÏÃż¤»î£¬È«²¿ÏÞÖÆÔÚÄÚºË̬¡£
ϵͳÃÅ£¨system gate£©Óû§Ì¬µÄ½ø³Ì¿ÉÒÔ·ÃÎÊÒ»¸öintelÏÝÚåÃÅdpl×Ö¶ÎΪ3.ͨ¹ýϵͳÃÅÀ´¼¤»îÈý¸ölinuxÒì³£´¦Àí³ÌÐò£¬ÏòÁ¿ÊÇ4,5,128.ÔÚÓû§Ì¬Ï£¬¿ÉÒÔ·¢²¼into,bound,int $0x80ÈýÌõ»ã±àÓïÑÔÖ¸Áî¡£
ϵͳÖжÏÃÅ£¨system interrtup gate£©Äܹ»±»Óû§Ì¬½ø³Ì·ÃÎʵÄintelÖжÏÃÅ£¨ÃŵÄdpl×Ö¶ÎΪ3£©¡£ÓëÏòÁ¿3Ïà¹ØµÄÒì³£´¦Àí³ÌÐòÊÇÓÉϵͳÃÅÖжÏÃż¤»îµÄ£¬ÔÚÓû§Ì¬Ï£¬¿ÉÒÔʹÓûã±àÓïÑÔÖ¸Áîint3.
ÏÝÚåà ......
IDTµÄ³õ²½³õʼ»¯
ÔÚʵģʽʱ£¬idt±»³õʼ»¯²¢ÓÉbiosÀý³ÌʹÓá£Ò»µ©linux½Ó¹Ü£¬idt¾Í±»ÒƵ½ramµÄÁíÒ»¸öÇøÓò£¬²¢½øÐеڶþ´Î³õʼ»¯£¬ÒòΪlinuxûÓÐÀûÓÃÈκÎbiosÀý³Ì¡£
IDT´æ·ÅÔÚidt_table±íÖУ¬ÓÐ256¸ö±íÏî¡£6×Ö½ÚµÄidt_descr±äÁ¿Ö¸¶¨ÁËidtµÄ´óСºÍËüµÄµØÖ·£¬Ö»Óе±ÄÚºËÓÃlidt»ã±àÖ¸Áî³õʼ»¯idtr¼Ä´æÆ÷ʱ²ÅÓõ½Õâ¸ö±äÁ¿¡£
ÔÚÄں˳õʼ»¯¹ý³ÌÖУ¬setup_idt()»ã±àÓïÑÔº¯ÊýÓÃͬһ¸öÖжÏÃÅ£¨Ö¸Ïòignore_int()Öжϴ¦Àí³ÌÐò£©À´Ìî³äËùÓÐÕâ256¸öidt_table±íÏ
setup_idt:
lea ignore_int,%edx
movl $(__KERNEL_CS << 16),%eax
movw %dx,%ax /* selector = 0x0010 = cs */
movw $0x8E00,%dx /* interrupt gate - dpl=0, present */
lea idt_table,%edi
mov $256,%ecx
rp_sidt: ......
Öжϴ¦ÀíÒÀÀµÓÚÖжÏÀàÐÍ£¬ÓÐÈýÖÖÖ÷ÒªµÄÖжÏÀàÐÍ£º
i/oÖжϣºÄ³Ð©i/É豸ÐèÒª¹Ø×¢£»ÏàÓ¦µÄÖжϴ¦Àí³ÌÐò±ØÐë²éѯÉ豸ÒÔÈ·¶¨Êʵ±µÄ²Ù×÷¹ý³Ì¡£
ʱÖÓÖжϣºÄ³ÖÖʱÖÓ£¨»òÕßÊÇÒ»¸ö±¾µØapicʱÖÓ£¬»òÕßÊÇÒ»¸öÍⲿʱÖÓ£©²úÉúÒ»¸öÖжϣ»ÕâÖÖÖжϸæËßÄÚºËÒ»¸ö¹Ì¶¨µÄʱ¼ä¼ä¸ôÒѾ¹ýÈ¥¡£ÕâЩÖжϴ󲿷ÖÊÇ×÷Ϊi/oÖжÏÀ´´¦ÀíµÄ¡£
´¦ÀíÆ÷¼äÖжϣº¶à´¦ÀíÆ÷ϵͳÖÐÒ»¸öcpu¶ÔÁíÒ»¸öcpu·¢³öµÄÒ»¸öÖжϡ£
I/OÖжϴ¦Àí
i/oÖжϴ¦Àí³ÌÐò±ØÐë×ã¹»Áé»îÒÔ¸ø¶à¸öÉ豸ͬʱÌṩ·þÎñ¡£ÈçÔÚpci×ÜÏßµÄÌåϵ½á¹¹ÖУ¬¼¸¸öÉ豸¿ÉÒÔ¹²Ïíͬһ¸öirqÏß¡£Õâ¾ÍÒâζ׎ö½öÖжÏÏòÁ¿²»ÄÜ˵Ã÷ËùÓÐÎÊÌâ¡£
Öжϴ¦Àí³ÌÐòµÄÁé»îÐÔÒÔÁ½ÖÖ²»Í¬µÄ·½Ê½ÊµÏÖ¡£
irq¹²Ïí£ºÖжϴ¦Àí³ÌÐòÖ´Ðжà¸öÖжϷþÎñÀý³Ì£¨interrupt service routine,ISR£©.ÿ¸öISRÊÇÒ»¸öÓëµ¥¶ÀÉ豸£¨¹²ÏíirqÏߣ©Ïà¹ØµÄº¯Êý¡£ÒòΪ²»¿ÉÔ¤ÏÈÖªµÀÄĸöÌØ¶¨µÄÉ豸²úÉúirq£¬Òò´Ë£¬Ã¿¸öisr¶¼±»Ö´ÐУ¬ÒÔÑéÖ¤ËüµÄÉ豸ÊÇ·ñÐèÒª¹Ø×¢£¬Èç¹ûÊÇ£¬µ±É豸²úÉúÖжÏʱ£¬¾ÍÖ´ÐÐÐèÒªÖ´ÐеÄËùÓвÙ×÷¡£
irq¶¯Ì¬·ÖÅ䣺һÌõirqÏßÔÚ¿ÉÄܵÄ×îºóʱ¿Ì²ÅÓëÒ»¸öÉ豸Çý¶¯³ÌÐòÏà¹ØÁª£»¼´Ê±¼¸¸öÓ²¼þÉ豸²¢²»¹²ÏíirqÏߣ¬Í¬Ò»¸öirqÏòÁ¿Ò²¿ÉÒÔÓÉÕ⼸¸öÉ豸ÔÚ²»Í¬Ê±¿ÌʹÓá£
linux°Ñ½ôËæÖжÏÒªÖ´ÐеIJ٠......
ÿ¸öÖжÏÏòÁ¿¶¼ÓÐ×Ô¼ºµÄirq_desc_tÃèÊö·û£¬ËùÓеÄÕâЩÃèÊö·û×éÖ¯ÔÚÒ»ÆðÐγÉirq_descÊý×é¡£
typedef struct irq_desc {
hw_irq_controller *handler;Ö¸Ïòpic¶ÔÏó£¨hw_irq_controllerÃèÊö·û£©£¬·þÎñÓÚirqÏß
void *handler_data;Ö¸Ïòpic·½·¨ËùʹÓõÄÊý¾Ý
struct irqaction *action; /* IRQ action list */±êʶµ±³öÏÖirqʱҪµ÷ÓõÄÖжϷþÎñÀý³Ì¡£¸Ã×Ö¶ÎÖ¸ÏòirqµÄirqactionÃèÊö·ûÁ´±íµÄµÚÒ»¸öÔªËØ¡£
unsigned int status; /* IRQ status */ÃèÊöirqÏß״̬µÄÒ»×é±êÖ¾
unsigned int depth; /* nested irq disables */Èç¹ûirqÏß±»¼¤»î£¬ÔòÏÔʾ0£»Èç¹ûirqÏß±»½ûÖ¹Á˲»Ö¹Ò»´Î£¬ÔòÏÔʾһ¸öÕýÊý
unsigned int irq_coun ......
ÐźÅÖ¸¶¨´¦Àíº¯Êý
void (*signal (int signum,void (*handle)(int)))(int);ÉèÖÃij¸öÐźŵĴ¦Àí·½·¨
int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact);ÓÃÓÚ¼ì²é»ò¸Ä±ä½ø³ÌÔÚ½Óµ½ÐźÅʱµÄ¶¯×÷
Ðźż¯²Ù×÷º¯Êý
static inline void sigaddset(sigset_t *set,int _sig);
static inline void sigdelset(sigset_t *set,int _sig);
static inline void sigismember(sigset_t *set,int _sig);
static inline void sigfindinword(unsigned long word);
static inline void sigemptyset(sigset_t *set);
static inline void sigfillset(sigset_t *set);
ÐźÅ×èÈû
int sigprocmask(int how,const sigset_t *set,sigset_t *oldset);
int sigpending(sigset_t *set);
int siguspend(const sigset_t *mask);
ÏûÏ¢¹ÜÀíº¯Êý
int msgget(key_t,int flag);
int msgrcv(int msqid,struct msgbuf *msgp,int msgsz,long mtype,int msgflg);
int msgsnd(int msqid,struct msgbuf *msgp,int msgz,int msgflg);
int msgctl(int msgqid,int cmd,struct msqid_ds *buf);
Ï̲߳Ù×÷º¯Êý
Ï̵߳Ĵ´½¨
int pthread_create(pthread_t *thread,pthrea ......