From b828622ea6c5c11760c1a6213ecc5353f97460c4 Mon Sep 17 00:00:00 2001 From: fslongjin Date: Mon, 30 May 2022 18:25:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86wait=5Fqueue=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E7=BB=93=E7=82=B9=E6=94=B9=E4=B8=BAkmalloc=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/driver/interrupt/apic/apic.c | 5 +++-- kernel/exception/irq.c | 2 +- kernel/process/wait_queue.c | 32 +++++++++++++++-------------- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/kernel/driver/interrupt/apic/apic.c b/kernel/driver/interrupt/apic/apic.c index 974d7b9c..262b0e64 100644 --- a/kernel/driver/interrupt/apic/apic.c +++ b/kernel/driver/interrupt/apic/apic.c @@ -448,14 +448,15 @@ void apic_init() void do_IRQ(struct pt_regs *rsp, ul number) { - if (number < 0x80) // 以0x80为界限,低于0x80的是外部中断控制器,高于0x80的是Local APIC + if (number < 0x80 && number >= 32) // 以0x80为界限,低于0x80的是外部中断控制器,高于0x80的是Local APIC // 外部中断控制器 { + irq_desc_t *irq = &interrupt_desc[number - 32]; // 执行中断上半部处理程序 - if (irq->handler != NULL) + if (irq != NULL && irq->handler != NULL) irq->handler(number, irq->parameter, rsp); else kwarn("Intr vector [%d] does not have a handler!"); diff --git a/kernel/exception/irq.c b/kernel/exception/irq.c index 41471351..b098ceae 100644 --- a/kernel/exception/irq.c +++ b/kernel/exception/irq.c @@ -207,9 +207,9 @@ void irq_init() init_8259A(); #else + memset((void *)interrupt_desc, 0, sizeof(irq_desc_t) * IRQ_NUM); apic_init(); - memset((void *)interrupt_desc, 0, sizeof(irq_desc_t) * IRQ_NUM); #endif } diff --git a/kernel/process/wait_queue.c b/kernel/process/wait_queue.c index 0890ad2d..acd79f4f 100644 --- a/kernel/process/wait_queue.c +++ b/kernel/process/wait_queue.c @@ -1,6 +1,7 @@ #include "wait_queue.h" #include #include +#include /** * @brief 初始化等待队列 @@ -21,45 +22,46 @@ void wait_queue_init(wait_queue_node_t *wait_queue, struct process_control_block */ void wait_queue_sleep_on(wait_queue_node_t *wait_queue_head) { - wait_queue_node_t wait; - wait_queue_init(&wait, current_pcb); + wait_queue_node_t *wait = (wait_queue_node_t *)kmalloc(sizeof(wait_queue_node_t), 0); + wait_queue_init(wait, current_pcb); current_pcb->state = PROC_UNINTERRUPTIBLE; - list_append(&wait_queue_head->wait_list, &wait.wait_list); + list_append(&wait_queue_head->wait_list, &wait->wait_list); sched_cfs(); } /** * @brief 在等待队列上进行等待(允许中断) - * + * * @param wait_queue_head 队列头指针 */ -void wait_queue_sleep_on_interriptible(wait_queue_node_t * wait_queue_head) +void wait_queue_sleep_on_interriptible(wait_queue_node_t *wait_queue_head) { - wait_queue_node_t wait; - wait_queue_init(&wait, current_pcb); + wait_queue_node_t *wait = (wait_queue_node_t *)kmalloc(sizeof(wait_queue_node_t), 0); + wait_queue_init(wait, current_pcb); current_pcb->state = PROC_INTERRUPTIBLE; - list_append(&wait_queue_head->wait_list, &wait.wait_list); + list_append(&wait_queue_head->wait_list, &wait->wait_list); sched_cfs(); } /** * @brief 唤醒在等待队列的头部的进程 - * - * @param wait_queue_head - * @param state + * + * @param wait_queue_head + * @param state */ -void wait_queue_wakeup(wait_queue_node_t * wait_queue_head, int64_t state) +void wait_queue_wakeup(wait_queue_node_t *wait_queue_head, int64_t state) { - if(list_empty(&wait_queue_head->wait_list)) + if (list_empty(&wait_queue_head->wait_list)) return; - wait_queue_node_t * wait = container_of(list_next(&wait_queue_head->wait_list), wait_queue_node_t, wait_list); + wait_queue_node_t *wait = container_of(list_next(&wait_queue_head->wait_list), wait_queue_node_t, wait_list); // 符合唤醒条件 - if(wait->pcb->state & state) + if (wait->pcb->state & state) { list_del(&wait->wait_list); process_wakeup(wait->pcb); + kfree(wait); } } \ No newline at end of file