Explorar o código

磁盘请求在处理时,切换进程

fslongjin %!s(int64=2) %!d(string=hai) anos
pai
achega
39dd802ff1

+ 59 - 39
kernel/driver/disk/ahci/ahci.c

@@ -1,9 +1,13 @@
 #include "ahci.h"
 #include "../../../common/kprint.h"
 #include "../../../mm/slab.h"
+#include <syscall/syscall.h>
+#include <syscall/syscall_num.h>
 
 struct pci_device_structure_header_t *ahci_devs[MAX_AHCI_DEVICES];
 
+struct block_device_request_queue ahci_req_queue;
+
 uint32_t count_ahci_devices = 0;
 
 uint64_t ahci_port_base_vaddr;     // 端口映射base addr
@@ -27,20 +31,20 @@ void ahci_init()
 {
     kinfo("Initializing AHCI...");
     pci_get_device_structure(0x1, 0x6, ahci_devs, &count_ahci_devices);
-    
+
     if (count_ahci_devices == 0)
     {
         kwarn("There is no AHCI device found on this computer!");
         return;
     }
     // 映射ABAR
-    kdebug("phys_2_virt(ahci_devs[0])= %#018lx",(ahci_devs[0]));
-    kdebug("((struct pci_device_structure_general_device_t *)phys_2_virt(ahci_devs[0])))->BAR5= %#018lx",((struct pci_device_structure_general_device_t *)(ahci_devs[0]))->BAR5);
+    kdebug("phys_2_virt(ahci_devs[0])= %#018lx", (ahci_devs[0]));
+    kdebug("((struct pci_device_structure_general_device_t *)phys_2_virt(ahci_devs[0])))->BAR5= %#018lx", ((struct pci_device_structure_general_device_t *)(ahci_devs[0]))->BAR5);
     uint32_t bar5 = ((struct pci_device_structure_general_device_t *)(ahci_devs[0]))->BAR5;
 
-    mm_map_phys_addr(AHCI_MAPPING_BASE, (ul)(bar5) & PAGE_2M_MASK, PAGE_2M_SIZE, PAGE_KERNEL_PAGE | PAGE_PWT | PAGE_PCD);
+    mm_map_phys_addr(AHCI_MAPPING_BASE, (ul)(bar5)&PAGE_2M_MASK, PAGE_2M_SIZE, PAGE_KERNEL_PAGE | PAGE_PWT | PAGE_PCD);
     kdebug("ABAR mapped!");
-     for (int i = 0; i < count_ahci_devices; ++i)
+    for (int i = 0; i < count_ahci_devices; ++i)
     {
         // kdebug("[%d]  class_code=%d, sub_class=%d, progIF=%d, ABAR=%#010lx", i, ahci_devs[i]->Class_code, ahci_devs[i]->SubClass, ahci_devs[i]->ProgIF, ((struct pci_device_structure_general_device_t *)(ahci_devs[i]))->BAR5);
         //  赋值HBA_MEM结构体
@@ -54,10 +58,10 @@ void ahci_init()
     kdebug("ahci_port_base_vaddr=%#018lx", ahci_port_base_vaddr);
     ahci_probe_port(0);
     port_rebase(&ahci_devices[0].hba_mem->ports[0], 0);
-    
+
     // 初始化请求队列
     ahci_req_queue.in_service = NULL;
-    list_init(&(ahci_req_queue.queue_list));
+    wait_queue_init(&ahci_req_queue.wait_queue_list, NULL);
     ahci_req_queue.request_count = 0;
     kinfo("AHCI initialized.");
 }
@@ -278,6 +282,8 @@ static bool ahci_read(HBA_PORT *port, uint32_t startl, uint32_t starth, uint32_t
     kdebug("slot=%d", slot);
     port->ci = 1 << slot; // Issue command
 
+    sched_cfs();
+    int retval = AHCI_SUCCESS;
     // Wait for completion
     while (1)
     {
@@ -288,7 +294,8 @@ static bool ahci_read(HBA_PORT *port, uint32_t startl, uint32_t starth, uint32_t
         if (port->is & HBA_PxIS_TFES) // Task file error
         {
             kerror("Read disk error");
-            return E_TASK_FILE_ERROR;
+            retval = E_TASK_FILE_ERROR;
+            break;
         }
     }
 
@@ -296,10 +303,10 @@ static bool ahci_read(HBA_PORT *port, uint32_t startl, uint32_t starth, uint32_t
     if (port->is & HBA_PxIS_TFES)
     {
         kerror("Read disk error");
-        return E_TASK_FILE_ERROR;
+        retval = E_TASK_FILE_ERROR;
     }
-
-    return AHCI_SUCCESS;
+    enter_syscall_int(SYS_AHCI_END_REQ, 0, 0, 0, 0, 0, 0, 0, 0);
+    return retval;
 }
 
 static bool ahci_write(HBA_PORT *port, uint32_t startl, uint32_t starth, uint32_t count,
@@ -352,6 +359,10 @@ static bool ahci_write(HBA_PORT *port, uint32_t startl, uint32_t starth, uint32_
     cmdfis->counth = count >> 8;
     //    printk("[slot]{%d}", slot);
     port->ci = 1; // Issue command
+
+    sched_cfs();
+    int retval = AHCI_SUCCESS;
+
     while (1)
     {
         // In some longer duration reads, it may be helpful to spin on the DPS bit
@@ -361,16 +372,18 @@ static bool ahci_write(HBA_PORT *port, uint32_t startl, uint32_t starth, uint32_
         if (port->is & HBA_PxIS_TFES)
         { // Task file error
             kerror("Write disk error");
-            return E_TASK_FILE_ERROR;
+            retval = E_TASK_FILE_ERROR;
+            break;
         }
     }
     if (port->is & HBA_PxIS_TFES)
     {
         kerror("Write disk error");
-        return E_TASK_FILE_ERROR;
+        retval = E_TASK_FILE_ERROR;
     }
-
-    return AHCI_SUCCESS;
+    
+    enter_syscall_int(SYS_AHCI_END_REQ, 0, 0, 0, 0, 0, 0, 0, 0);
+    return retval;
 }
 
 // Find a free command list slot
@@ -410,32 +423,33 @@ long ahci_close()
  * @param port_num ahci控制器端口号
  * @return struct block_device_request_packet*
  */
-static struct block_device_request_packet *ahci_make_request(long cmd, uint64_t base_addr, uint64_t count, uint64_t buffer, uint8_t ahci_ctrl_num, uint8_t port_num)
+static struct ahci_request_packet_t *ahci_make_request(long cmd, uint64_t base_addr, uint64_t count, uint64_t buffer, uint8_t ahci_ctrl_num, uint8_t port_num)
 {
-    struct block_device_request_packet *pack = (struct block_device_request_packet *)kmalloc(sizeof(struct block_device_request_packet), 0);
+    struct ahci_request_packet_t *pack = (struct ahci_request_packet_t *)kmalloc(sizeof(struct ahci_request_packet_t), 0);
 
-    list_init(&pack->list);
+    wait_queue_init(&pack->blk_pak.wait_queue, current_pcb);
+    pack->blk_pak.device_type = BLK_TYPE_AHCI;
 
     // 由于ahci不需要中断即可读取磁盘,因此end handler为空
     switch (cmd)
     {
     case ATA_CMD_READ_DMA_EXT:
-        pack->end_handler = NULL;
-        pack->cmd = ATA_CMD_READ_DMA_EXT;
+        pack->blk_pak.end_handler = NULL;
+        pack->blk_pak.cmd = ATA_CMD_READ_DMA_EXT;
         break;
     case ATA_CMD_WRITE_DMA_EXT:
-        pack->end_handler = NULL;
-        pack->cmd = ATA_CMD_WRITE_DMA_EXT;
+        pack->blk_pak.end_handler = NULL;
+        pack->blk_pak.cmd = ATA_CMD_WRITE_DMA_EXT;
         break;
     default:
-        pack->end_handler = NULL;
-        pack->cmd = cmd;
+        pack->blk_pak.end_handler = NULL;
+        pack->blk_pak.cmd = cmd;
         break;
     }
 
-    pack->LBA_start = base_addr;
-    pack->count = count;
-    pack->buffer_vaddr = buffer;
+    pack->blk_pak.LBA_start = base_addr;
+    pack->blk_pak.count = count;
+    pack->blk_pak.buffer_vaddr = buffer;
 
     pack->ahci_ctrl_num = ahci_ctrl_num;
     pack->port_num = port_num;
@@ -446,8 +460,10 @@ static struct block_device_request_packet *ahci_make_request(long cmd, uint64_t
  * @brief 结束磁盘请求
  *
  */
-static void ahci_end_request()
+void ahci_end_request()
 {
+    ahci_req_queue.in_service->wait_queue.pcb->state = PROC_RUNNING;
+    ahci_req_queue.in_service->wait_queue.pcb->flags |= PROC_NEED_SCHED;
     kfree((uint64_t *)ahci_req_queue.in_service);
     ahci_req_queue.in_service = NULL;
 
@@ -458,27 +474,31 @@ static void ahci_end_request()
 
 static long ahci_query_disk()
 {
-    struct block_device_request_packet *pack = container_of(list_next(&ahci_req_queue.queue_list), struct block_device_request_packet, list);
-    ahci_req_queue.in_service = pack;
-    list_del(&(ahci_req_queue.in_service->list));
+    wait_queue_node_t *wait_queue_tmp = container_of(list_next(&ahci_req_queue.wait_queue_list.wait_list), wait_queue_node_t, wait_list);
+    struct ahci_request_packet_t *pack = (struct ahci_request_packet_t *)container_of(wait_queue_tmp, struct block_device_request_packet, wait_queue);
+
+    ahci_req_queue.in_service = (struct block_device_request_packet *)pack;
+    list_del(&(ahci_req_queue.in_service->wait_queue.wait_list));
     --ahci_req_queue.request_count;
 
     long ret_val;
 
-    switch (pack->cmd)
+    
+    switch (pack->blk_pak.cmd)
     {
     case ATA_CMD_READ_DMA_EXT:
-        ret_val = ahci_read(&(ahci_devices[pack->ahci_ctrl_num].hba_mem->ports[pack->port_num]), pack->LBA_start & 0xFFFFFFFF, ((pack->LBA_start) >> 32) & 0xFFFFFFFF, pack->count, pack->buffer_vaddr);
+        ret_val = ahci_read(&(ahci_devices[pack->ahci_ctrl_num].hba_mem->ports[pack->port_num]), pack->blk_pak.LBA_start & 0xFFFFFFFF, ((pack->blk_pak.LBA_start) >> 32) & 0xFFFFFFFF, pack->blk_pak.count, pack->blk_pak.buffer_vaddr);
         break;
     case ATA_CMD_WRITE_DMA_EXT:
-        ret_val = ahci_write(&(ahci_devices[pack->ahci_ctrl_num].hba_mem->ports[pack->port_num]), pack->LBA_start & 0xFFFFFFFF, ((pack->LBA_start) >> 32) & 0xFFFFFFFF, pack->count, pack->buffer_vaddr);
+        ret_val = ahci_write(&(ahci_devices[pack->ahci_ctrl_num].hba_mem->ports[pack->port_num]), pack->blk_pak.LBA_start & 0xFFFFFFFF, ((pack->blk_pak.LBA_start) >> 32) & 0xFFFFFFFF, pack->blk_pak.count, pack->blk_pak.buffer_vaddr);
         break;
     default:
-        kerror("Unsupport ahci command: %#05lx", pack->cmd);
+        kerror("Unsupport ahci command: %#05lx", pack->blk_pak.cmd);
         ret_val = E_UNSUPPORTED_CMD;
         break;
     }
-    ahci_end_request();
+
+    // ahci_end_request();
     return ret_val;
 }
 
@@ -487,9 +507,9 @@ static long ahci_query_disk()
  *
  * @param pack
  */
-static void ahci_submit(struct block_device_request_packet *pack)
+static void ahci_submit(struct ahci_request_packet_t *pack)
 {
-    list_append(&(ahci_req_queue.queue_list), &(pack->list));
+    list_append(&(ahci_req_queue.wait_queue_list.wait_list), &(pack->blk_pak.wait_queue.wait_list));
     ++ahci_req_queue.request_count;
 
     if (ahci_req_queue.in_service == NULL) // 当前没有正在请求的io包,立即执行磁盘请求
@@ -509,7 +529,7 @@ static void ahci_submit(struct block_device_request_packet *pack)
  */
 static long ahci_transfer(long cmd, uint64_t base_addr, uint64_t count, uint64_t buf, uint8_t ahci_ctrl_num, uint8_t port_num)
 {
-    struct block_device_request_packet *pack = NULL;
+    struct ahci_request_packet_t *pack = NULL;
 
     if (cmd == ATA_CMD_READ_DMA_EXT || cmd == ATA_CMD_WRITE_DMA_EXT)
     {

+ 129 - 132
kernel/driver/disk/ahci/ahci.h

@@ -6,16 +6,16 @@
 
 /**
  * @todo 加入io调度器(当操作系统实现了多进程之后要加入这个)
- * 
+ *
  */
-#define AHCI_MAPPING_BASE SPECIAL_MEMOEY_MAPPING_VIRT_ADDR_BASE+AHCI_MAPPING_OFFSET
+#define AHCI_MAPPING_BASE SPECIAL_MEMOEY_MAPPING_VIRT_ADDR_BASE + AHCI_MAPPING_OFFSET
 
 #define MAX_AHCI_DEVICES 100
 
-#define HBA_PxCMD_ST    0x0001
-#define HBA_PxCMD_FRE   0x0010
-#define HBA_PxCMD_FR    0x4000
-#define HBA_PxCMD_CR    0x8000
+#define HBA_PxCMD_ST 0x0001
+#define HBA_PxCMD_FRE 0x0010
+#define HBA_PxCMD_FR 0x4000
+#define HBA_PxCMD_CR 0x8000
 
 #define ATA_DEV_BUSY 0x80
 #define ATA_DEV_DRQ 0x08
@@ -23,11 +23,11 @@
 #define ATA_CMD_READ_DMA_EXT 0x25
 #define ATA_CMD_WRITE_DMA_EXT 0x30
 
-#define HBA_PxIS_TFES   (1 << 30)       /* TFES - Task File Error Status */
+#define HBA_PxIS_TFES (1 << 30) /* TFES - Task File Error Status */
 
-#define AHCI_SUCCESS 0  // 请求成功
-#define E_NOEMPTYSLOT 1 // 没有空闲的slot
-#define E_PORT_HUNG 2   // 端口被挂起
+#define AHCI_SUCCESS 0      // 请求成功
+#define E_NOEMPTYSLOT 1     // 没有空闲的slot
+#define E_PORT_HUNG 2       // 端口被挂起
 #define E_TASK_FILE_ERROR 3 // 任务文件错误
 #define E_UNSUPPORTED_CMD 4 // 不支持的命令
 
@@ -210,169 +210,164 @@ typedef struct tagFIS_DMA_SETUP
 
 typedef volatile struct tagHBA_PORT
 {
-	uint64_t clb;		// 0x00, command list base address, 1K-byte aligned
-	uint64_t fb;		// 0x08, FIS base address, 256-byte aligned
-	uint32_t is;		// 0x10, interrupt status
-	uint32_t ie;		// 0x14, interrupt enable
-	uint32_t cmd;		// 0x18, command and status
-	uint32_t rsv0;		// 0x1C, Reserved
-	uint32_t tfd;		// 0x20, task file data
-	uint32_t sig;		// 0x24, signature
-	uint32_t ssts;		// 0x28, SATA status (SCR0:SStatus)
-	uint32_t sctl;		// 0x2C, SATA control (SCR2:SControl)
-	uint32_t serr;		// 0x30, SATA error (SCR1:SError)
-	uint32_t sact;		// 0x34, SATA active (SCR3:SActive)
-	uint32_t ci;		// 0x38, command issue
-	uint32_t sntf;		// 0x3C, SATA notification (SCR4:SNotification)
-	uint32_t fbs;		// 0x40, FIS-based switch control
-	uint32_t rsv1[11];	// 0x44 ~ 0x6F, Reserved
-	uint32_t vendor[4];	// 0x70 ~ 0x7F, vendor specific
+    uint64_t clb;       // 0x00, command list base address, 1K-byte aligned
+    uint64_t fb;        // 0x08, FIS base address, 256-byte aligned
+    uint32_t is;        // 0x10, interrupt status
+    uint32_t ie;        // 0x14, interrupt enable
+    uint32_t cmd;       // 0x18, command and status
+    uint32_t rsv0;      // 0x1C, Reserved
+    uint32_t tfd;       // 0x20, task file data
+    uint32_t sig;       // 0x24, signature
+    uint32_t ssts;      // 0x28, SATA status (SCR0:SStatus)
+    uint32_t sctl;      // 0x2C, SATA control (SCR2:SControl)
+    uint32_t serr;      // 0x30, SATA error (SCR1:SError)
+    uint32_t sact;      // 0x34, SATA active (SCR3:SActive)
+    uint32_t ci;        // 0x38, command issue
+    uint32_t sntf;      // 0x3C, SATA notification (SCR4:SNotification)
+    uint32_t fbs;       // 0x40, FIS-based switch control
+    uint32_t rsv1[11];  // 0x44 ~ 0x6F, Reserved
+    uint32_t vendor[4]; // 0x70 ~ 0x7F, vendor specific
 } HBA_PORT;
 typedef volatile struct tagHBA_MEM
 {
-	// 0x00 - 0x2B, Generic Host Control
-	uint32_t cap;		// 0x00, Host capability
-	uint32_t ghc;		// 0x04, Global host control
-	uint32_t is;		// 0x08, Interrupt status
-	uint32_t pi;		// 0x0C, Port implemented
-	uint32_t vs;		// 0x10, Version
-	uint32_t ccc_ctl;	// 0x14, Command completion coalescing control
-	uint32_t ccc_pts;	// 0x18, Command completion coalescing ports
-	uint32_t em_loc;		// 0x1C, Enclosure management location
-	uint32_t em_ctl;		// 0x20, Enclosure management control
-	uint32_t cap2;		// 0x24, Host capabilities extended
-	uint32_t bohc;		// 0x28, BIOS/OS handoff control and status
- 
-	// 0x2C - 0x9F, Reserved
-	uint8_t  rsv[0xA0-0x2C];
- 
-	// 0xA0 - 0xFF, Vendor specific registers
-	uint8_t  vendor[0x100-0xA0];
- 
-	// 0x100 - 0x10FF, Port control registers
-	HBA_PORT	ports[32];	// 1 ~ 32
+    // 0x00 - 0x2B, Generic Host Control
+    uint32_t cap;     // 0x00, Host capability
+    uint32_t ghc;     // 0x04, Global host control
+    uint32_t is;      // 0x08, Interrupt status
+    uint32_t pi;      // 0x0C, Port implemented
+    uint32_t vs;      // 0x10, Version
+    uint32_t ccc_ctl; // 0x14, Command completion coalescing control
+    uint32_t ccc_pts; // 0x18, Command completion coalescing ports
+    uint32_t em_loc;  // 0x1C, Enclosure management location
+    uint32_t em_ctl;  // 0x20, Enclosure management control
+    uint32_t cap2;    // 0x24, Host capabilities extended
+    uint32_t bohc;    // 0x28, BIOS/OS handoff control and status
+
+    // 0x2C - 0x9F, Reserved
+    uint8_t rsv[0xA0 - 0x2C];
+
+    // 0xA0 - 0xFF, Vendor specific registers
+    uint8_t vendor[0x100 - 0xA0];
+
+    // 0x100 - 0x10FF, Port control registers
+    HBA_PORT ports[32]; // 1 ~ 32
 } HBA_MEM;
- 
 
 // There are four kinds of FIS which may be sent to the host by the device as indicated in the following structure declaration.
-// 
+//
 typedef volatile struct tagHBA_FIS
 {
-	// 0x00
-	FIS_DMA_SETUP	dsfis;		// DMA Setup FIS
-	uint8_t         pad0[4];
- 
-	// 0x20
-	FIS_PIO_SETUP	psfis;		// PIO Setup FIS
-	uint8_t         pad1[12];
- 
-	// 0x40
-	FIS_REG_D2H	rfis;		// Register – Device to Host FIS
-	uint8_t         pad2[4];
- 
-	// 0x58
-	//FIS_DEV_BITS	sdbfis;		// Set Device Bit FIS
- 
-	// 0x60
-	uint8_t         ufis[64];
- 
-	// 0xA0
-	uint8_t   	rsv[0x100-0xA0];
+    // 0x00
+    FIS_DMA_SETUP dsfis; // DMA Setup FIS
+    uint8_t pad0[4];
+
+    // 0x20
+    FIS_PIO_SETUP psfis; // PIO Setup FIS
+    uint8_t pad1[12];
+
+    // 0x40
+    FIS_REG_D2H rfis; // Register – Device to Host FIS
+    uint8_t pad2[4];
+
+    // 0x58
+    // FIS_DEV_BITS	sdbfis;		// Set Device Bit FIS
+
+    // 0x60
+    uint8_t ufis[64];
+
+    // 0xA0
+    uint8_t rsv[0x100 - 0xA0];
 } HBA_FIS;
 
 typedef struct tagHBA_CMD_HEADER
 {
-	// DW0
-	uint8_t  cfl:5;		// Command FIS length in DWORDS, 2 ~ 16
-	uint8_t  a:1;		// ATAPI
-	uint8_t  w:1;		// Write, 1: H2D, 0: D2H
-	uint8_t  p:1;		// Prefetchable
- 
-	uint8_t  r:1;		// Reset
-	uint8_t  b:1;		// BIST
-	uint8_t  c:1;		// Clear busy upon R_OK
-	uint8_t  rsv0:1;		// Reserved
-	uint8_t  pmp:4;		// Port multiplier port
- 
-	uint16_t prdtl;		// Physical region descriptor table length in entries
- 
-	// DW1
-	volatile
-	uint32_t prdbc;		// Physical region descriptor byte count transferred
- 
-	// DW2, 3
-	uint64_t ctba;		// Command table descriptor base address
- 
-	// DW4 - 7
-	uint32_t rsv1[4];	// Reserved
+    // DW0
+    uint8_t cfl : 5; // Command FIS length in DWORDS, 2 ~ 16
+    uint8_t a : 1;   // ATAPI
+    uint8_t w : 1;   // Write, 1: H2D, 0: D2H
+    uint8_t p : 1;   // Prefetchable
+
+    uint8_t r : 1;    // Reset
+    uint8_t b : 1;    // BIST
+    uint8_t c : 1;    // Clear busy upon R_OK
+    uint8_t rsv0 : 1; // Reserved
+    uint8_t pmp : 4;  // Port multiplier port
+
+    uint16_t prdtl; // Physical region descriptor table length in entries
+
+    // DW1
+    volatile uint32_t prdbc; // Physical region descriptor byte count transferred
+
+    // DW2, 3
+    uint64_t ctba; // Command table descriptor base address
+
+    // DW4 - 7
+    uint32_t rsv1[4]; // Reserved
 } HBA_CMD_HEADER;
 
 typedef struct tagHBA_PRDT_ENTRY
 {
-	uint64_t dba;		// Data base address
-	uint32_t rsv0;		// Reserved
- 
-	// DW3
-	uint32_t dbc:22;		// Byte count, 4M max
-	uint32_t rsv1:9;		// Reserved
-	uint32_t i:1;		// Interrupt on completion
-} HBA_PRDT_ENTRY;
+    uint64_t dba;  // Data base address
+    uint32_t rsv0; // Reserved
 
+    // DW3
+    uint32_t dbc : 22; // Byte count, 4M max
+    uint32_t rsv1 : 9; // Reserved
+    uint32_t i : 1;    // Interrupt on completion
+} HBA_PRDT_ENTRY;
 
 typedef struct tagHBA_CMD_TBL
 {
-	// 0x00
-	uint8_t  cfis[64];	// Command FIS
- 
-	// 0x40
-	uint8_t  acmd[16];	// ATAPI command, 12 or 16 bytes
- 
-	// 0x50
-	uint8_t  rsv[48];	// Reserved
- 
-	// 0x80
-	HBA_PRDT_ENTRY	prdt_entry[1];	// Physical region descriptor table entries, 0 ~ 65535
+    // 0x00
+    uint8_t cfis[64]; // Command FIS
+
+    // 0x40
+    uint8_t acmd[16]; // ATAPI command, 12 or 16 bytes
+
+    // 0x50
+    uint8_t rsv[48]; // Reserved
+
+    // 0x80
+    HBA_PRDT_ENTRY prdt_entry[1]; // Physical region descriptor table entries, 0 ~ 65535
 } HBA_CMD_TBL;
 
 struct ahci_device_t
 {
-    uint32_t type;  // 设备类型
-    struct pci_device_structure_header_t * dev_struct;
-    HBA_MEM * hba_mem;
-}ahci_devices[MAX_AHCI_DEVICES];
+    uint32_t type; // 设备类型
+    struct pci_device_structure_header_t *dev_struct;
+    HBA_MEM *hba_mem;
+} ahci_devices[MAX_AHCI_DEVICES];
 
+#define SATA_SIG_ATA 0x00000101   // SATA drive
+#define SATA_SIG_ATAPI 0xEB140101 // SATAPI drive
+#define SATA_SIG_SEMB 0xC33C0101  // Enclosure management bridge
+#define SATA_SIG_PM 0x96690101    // Port multiplier
 
-#define	SATA_SIG_ATA	0x00000101	// SATA drive
-#define	SATA_SIG_ATAPI	0xEB140101	// SATAPI drive
-#define	SATA_SIG_SEMB	0xC33C0101	// Enclosure management bridge
-#define	SATA_SIG_PM	0x96690101	// Port multiplier
- 
 #define AHCI_DEV_NULL 0
 #define AHCI_DEV_SATA 1
 #define AHCI_DEV_SEMB 2
 #define AHCI_DEV_PM 3
 #define AHCI_DEV_SATAPI 4
- 
+
 #define HBA_PORT_IPM_ACTIVE 1
 #define HBA_PORT_DET_PRESENT 3
 
-
-
-struct block_device_request_queue ahci_req_queue;
-
-
-
-
+struct ahci_request_packet_t
+{
+    struct block_device_request_packet blk_pak; // 块设备请求包
+    uint8_t ahci_ctrl_num;                      // ahci控制器号, 默认应为0
+    uint8_t port_num;                           // ahci的设备端口号
+};
 
 /**
  * @brief 初始化ahci模块
- * 
+ *
  */
 void ahci_init();
 
 /**
  * @brief 检测端口连接的设备的类型
- * 
+ *
  * @param device_num ahci设备号
  */
 static void ahci_probe_port(const uint32_t device_num);
@@ -402,4 +397,6 @@ static bool ahci_read(HBA_PORT *port, uint32_t startl, uint32_t starth, uint32_t
  * @return false failed
  */
 static bool ahci_write(HBA_PORT *port, uint32_t startl, uint32_t starth, uint32_t count,
-               uint64_t buf);
+                       uint64_t buf);
+
+void ahci_end_request();

+ 5 - 4
kernel/driver/disk/block_device.h

@@ -2,7 +2,9 @@
 
 #include "../../common/glib.h"
 #include "stdint.h"
+#include <process/semaphore.h>
 
+#define BLK_TYPE_AHCI 0
 struct block_device_operation
 {
     long (*open)();
@@ -22,11 +24,10 @@ struct block_device_request_packet
     uint32_t count;
     uint64_t buffer_vaddr;
 
-    uint8_t ahci_ctrl_num;  // ahci控制器号, 默认应为0
-    uint8_t port_num;   // ahci的设备端口号
+    uint8_t device_type;    // 0: ahci
     void (*end_handler)(ul num, ul arg);
 
-    struct List list;
+   wait_queue_node_t wait_queue;
 };
 
 /**
@@ -35,7 +36,7 @@ struct block_device_request_packet
  */
 struct block_device_request_queue
 {
-    struct List queue_list;
+    wait_queue_node_t wait_queue_list;
     struct block_device_request_packet * in_service;    // 正在请求的结点
     ul request_count;
 };

+ 2 - 0
kernel/driver/timers/HPET/HPET.c

@@ -57,9 +57,11 @@ void HPET_handler(uint64_t number, uint64_t param, struct pt_regs *regs)
     case 0: // 定时器0中断
         ++timer_jiffies;
 
+        /*
         // 将HEPT中断消息转发到ap:1处理器
         ipi_send_IPI(DEST_PHYSICAL, IDLE, ICR_LEVEL_DE_ASSERT, EDGE_TRIGGER, 0xc8,
                      ICR_APIC_FIXED, ICR_ALL_EXCLUDE_Self, true, 0);
+                     */
 
         // 若当前时间比定时任务的时间间隔大,则进入中断下半部
         if (container_of(list_next(&timer_func_head.list), struct timer_func_list_t, list)->expire_jiffies <= timer_jiffies)

+ 2 - 0
kernel/exception/entry.S

@@ -53,6 +53,7 @@ Restore_all:
     popq %rax
     addq $0x10, %rsp // 弹出变量FUNC和errcode
     
+    sti
     iretq
 
 ret_from_exception:
@@ -169,6 +170,7 @@ ENTRY(ret_from_system_call)
     popq %rax
     addq $0x10, %rsp // 弹出变量FUNC和errcode
 
+    sti
     iretq
 
     

+ 1 - 0
kernel/exception/irq.h

@@ -80,6 +80,7 @@ extern void (*syscall_intr_table[1])(void);
 	
 	
 0x80		system call
+0x81		system interrupt 系统中断
 
 150 ~   200	Local APIC
 	150	CMCI

+ 1 - 1
kernel/exception/softirq.c

@@ -52,7 +52,7 @@ void do_softirq()
         }
     }
 
-    
+    cli();
 }
 
 void softirq_init()

+ 20 - 20
kernel/exception/trap.c

@@ -12,7 +12,7 @@ void do_divide_error(struct pt_regs *regs, unsigned long error_code)
     kerror("do_divide_error(0),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\t CPU:%d\n", error_code, regs->rsp, regs->rip, proc_current_cpu_id);
 
     while (1)
-        ;
+        hlt();
 }
 
 // 1 #DB 调试异常
@@ -23,7 +23,7 @@ void do_debug(struct pt_regs *regs, unsigned long error_code)
     printk(" ] do_debug(1),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\t CPU:%d\n", error_code, regs->rsp, regs->rip, proc_current_cpu_id);
 
     while (1)
-        ;
+        hlt();
 }
 
 // 2 不可屏蔽中断
@@ -35,7 +35,7 @@ void do_nmi(struct pt_regs *regs, unsigned long error_code)
     printk(" ] do_nmi(2),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\t CPU:%d\n", error_code, regs->rsp, regs->rip, proc_current_cpu_id);
 
     while (1)
-        ;
+        hlt();
 }
 
 // 3 #BP 断点异常
@@ -47,7 +47,7 @@ void do_int3(struct pt_regs *regs, unsigned long error_code)
     printk(" ] do_int3(3),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\t CPU:%d\n", error_code, regs->rsp, regs->rip, proc_current_cpu_id);
 
     while (1)
-        ;
+        hlt();
 }
 
 // 4 #OF 溢出异常
@@ -59,7 +59,7 @@ void do_overflow(struct pt_regs *regs, unsigned long error_code)
     printk(" ] do_overflow(4),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\t CPU:%d\n", error_code, regs->rsp, regs->rip, proc_current_cpu_id);
 
     while (1)
-        ;
+        hlt();
 }
 
 // 5 #BR 越界异常
@@ -69,7 +69,7 @@ void do_bounds(struct pt_regs *regs, unsigned long error_code)
     kerror("do_bounds(5),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\t CPU:%d\n", error_code, regs->rsp, regs->rip, proc_current_cpu_id);
 
     while (1)
-        ;
+        hlt();
 }
 
 // 6 #UD 无效/未定义的机器码
@@ -79,7 +79,7 @@ void do_undefined_opcode(struct pt_regs *regs, unsigned long error_code)
     kerror("do_undefined_opcode(6),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\t CPU:%d", error_code, regs->rsp, regs->rip, proc_current_cpu_id);
 
     while (1)
-        ;
+        hlt();
 }
 
 // 7 #NM 设备异常(FPU不存在)
@@ -89,7 +89,7 @@ void do_dev_not_avaliable(struct pt_regs *regs, unsigned long error_code)
     kerror("do_dev_not_avaliable(7),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\t CPU:%d\n", error_code, regs->rsp, regs->rip, proc_current_cpu_id);
 
     while (1)
-        ;
+        hlt();
 }
 
 // 8 #DF 双重错误
@@ -101,7 +101,7 @@ void do_double_fault(struct pt_regs *regs, unsigned long error_code)
     printk(" ] do_double_fault(8),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\t CPU:%d\n", error_code, regs->rsp, regs->rip, proc_current_cpu_id);
 
     while (1)
-        ;
+        hlt();
 }
 
 // 9 协处理器越界(保留)
@@ -111,7 +111,7 @@ void do_coprocessor_segment_overrun(struct pt_regs *regs, unsigned long error_co
     kerror("do_coprocessor_segment_overrun(9),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\t CPU:%d\n", error_code, regs->rsp, regs->rip, proc_current_cpu_id);
 
     while (1)
-        ;
+        hlt();
 }
 
 // 10 #TS 无效的TSS段
@@ -142,7 +142,7 @@ void do_invalid_TSS(struct pt_regs *regs, unsigned long error_code)
     printk("\n");
 
     while (1)
-        ;
+        hlt();
 }
 
 // 11 #NP 段不存在
@@ -152,7 +152,7 @@ void do_segment_not_exists(struct pt_regs *regs, unsigned long error_code)
     kerror("do_segment_not_exists(11),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\t CPU:%d\n", error_code, regs->rsp, regs->rip, proc_current_cpu_id);
 
     while (1)
-        ;
+        hlt();
 }
 
 // 12 #SS SS段错误
@@ -162,7 +162,7 @@ void do_stack_segment_fault(struct pt_regs *regs, unsigned long error_code)
     kerror("do_stack_segment_fault(12),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\t CPU:%d\n", error_code, regs->rsp, regs->rip, proc_current_cpu_id);
 
     while (1)
-        ;
+        hlt();
 }
 
 // 13 #GP 通用保护性异常
@@ -187,7 +187,7 @@ void do_general_protection(struct pt_regs *regs, unsigned long error_code)
 
     printk_color(RED, BLACK, "Segment Selector Index:%#010x\n", error_code & 0xfff8);
     while (1)
-        ;
+        hlt();
 }
 
 // 14 #PF 页故障
@@ -224,7 +224,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long error_code)
 	printk_color(RED,BLACK,"CR2:%#018lx\n",cr2);
 
     while (1)
-        ;
+        hlt();
 }
 
 // 15 Intel保留,请勿使用
@@ -236,7 +236,7 @@ void do_x87_FPU_error(struct pt_regs *regs, unsigned long error_code)
     kerror("do_x87_FPU_error(16),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\t CPU:%d\n", error_code, regs->rsp, regs->rip, proc_current_cpu_id);
 
     while (1)
-        ;
+        hlt();
 }
 
 // 17 #AC 对齐检测
@@ -246,7 +246,7 @@ void do_alignment_check(struct pt_regs *regs, unsigned long error_code)
     kerror("do_alignment_check(17),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\t CPU:%d\n", error_code, regs->rsp, regs->rip, proc_current_cpu_id);
 
     while (1)
-        ;
+        hlt();
 }
 
 // 18 #MC 机器检测
@@ -256,7 +256,7 @@ void do_machine_check(struct pt_regs *regs, unsigned long error_code)
     kerror("do_machine_check(18),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\t CPU:%d\n", error_code, regs->rsp, regs->rip, proc_current_cpu_id);
 
     while (1)
-        ;
+        hlt();
 }
 
 // 19 #XM SIMD浮点异常
@@ -266,7 +266,7 @@ void do_SIMD_exception(struct pt_regs *regs, unsigned long error_code)
     kerror("do_SIMD_exception(19),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\t CPU:%d\n", error_code, regs->rsp, regs->rip, proc_current_cpu_id);
 
     while (1)
-        ;
+        hlt();
 }
 
 // 20 #VE 虚拟化异常
@@ -276,7 +276,7 @@ void do_virtualization_exception(struct pt_regs *regs, unsigned long error_code)
     kerror("do_virtualization_exception(20),\tError Code:%#18lx,\tRSP:%#18lx,\tRIP:%#18lx\t CPU:%d\n", error_code, regs->rsp, regs->rip, proc_current_cpu_id);
 
     while (1)
-        ;
+        hlt();
 }
 
 // 21-21 Intel保留,请勿使用

+ 5 - 3
kernel/main.c

@@ -151,7 +151,9 @@ void system_initialize()
     // process_init();
     current_pcb->cpu_id = 0;
     current_pcb->preempt_count = 0;
+    process_init();
     HPET_init();
+
 }
 
 //操作系统内核从这里开始执行
@@ -178,7 +180,7 @@ void Start_Kernel(void)
 
     system_initialize();
 
-    /*
+    
     uint64_t buf[100];
     ahci_operation.transfer(ATA_CMD_READ_DMA_EXT, 0, 1, (uint64_t)&buf, 0, 0);
     kdebug("buf[0]=%#010lx",(uint32_t)buf[0]);
@@ -187,7 +189,7 @@ void Start_Kernel(void)
 
     ahci_operation.transfer(ATA_CMD_READ_DMA_EXT, 0, 1, (uint64_t)&buf, 0, 0);
     kdebug("buf[0]=%#010lx",(uint32_t)buf[0]);
-    */
+    
     // show_welcome();
     // test_mm();
 
@@ -216,7 +218,7 @@ void Start_Kernel(void)
 
     // ipi_send_IPI(DEST_PHYSICAL, IDLE, ICR_LEVEL_DE_ASSERT, EDGE_TRIGGER, 0xc8, ICR_APIC_FIXED, ICR_No_Shorthand, true, 1);  // 测试ipi
 
-    int last_sec = rtc_now.second;
+    //int last_sec = rtc_now.second;
     /*
     while (1)
     {

+ 4 - 4
kernel/sched/sched.c

@@ -50,11 +50,11 @@ void sched_cfs_enqueue(struct process_control_block *pcb)
  */
 void sched_cfs()
 {
-    
+
     current_pcb->flags &= ~PROC_NEED_SCHED;
     struct process_control_block *proc = sched_cfs_dequeue();
 
-    if (current_pcb->virtual_runtime >= proc->virtual_runtime) // 当前进程运行时间大于了下一进程的运行时间,进行切换
+    if (current_pcb->virtual_runtime >= proc->virtual_runtime || current_pcb->state != PROC_RUNNING) // 当前进程运行时间大于了下一进程的运行时间,进行切换
     {
 
         if (current_pcb->state = PROC_RUNNING) // 本次切换由于时间片到期引发,则再次加入就绪队列,否则交由其它功能模块进行管理
@@ -107,8 +107,8 @@ void sched_cfs()
  */
 void sched_update_jiffies()
 {
-    if(current_pcb->cpu_id == 0)
-        return;
+    //if (current_pcb->cpu_id == 0)
+    //    return;
     switch (current_pcb->priority)
     {
     case 0:

+ 5 - 0
kernel/smp/smp.c

@@ -153,8 +153,13 @@ void smp_ap_start()
     current_pcb->preempt_count = 0;
     sti();
 
+    while(1)
+        hlt();
+
+/*
     if (proc_current_cpu_id == 1)
         process_init();
+        */
     while (1)
     {
         printk_color(BLACK, WHITE, "CPU:%d IDLE process.\n", proc_current_cpu_id);

+ 7 - 0
kernel/syscall/syscall.c

@@ -2,6 +2,7 @@
 #include "../process/process.h"
 #include <exception/gate.h>
 #include <exception/irq.h>
+#include<driver/disk/ahci/ahci.h>
 
 // 导出系统调用入口函数,定义在entry.S中
 extern void system_call(void);
@@ -85,6 +86,12 @@ ul sys_printf(struct pt_regs *regs)
     return 0;
 }
 
+ul sys_ahci_end_req(struct pt_regs *regs)
+{
+    ahci_end_request();
+    return 0;
+}
+
 // 系统调用的内核入口程序
 void do_syscall_int(struct pt_regs *regs, unsigned long error_code)
 {

+ 5 - 2
kernel/syscall/syscall.h

@@ -5,7 +5,7 @@
 #include "../process/ptrace.h"
 
 // 定义最大系统调用数量
-#define MAX_SYSTEM_CALL_NUM 128
+#define MAX_SYSTEM_CALL_NUM 256
 
 #define ESYSCALL_NOT_EXISTS 1
 
@@ -53,6 +53,8 @@ ul system_call_not_exists(struct pt_regs *regs)
  */
 ul sys_printf(struct pt_regs *regs);
 
+ul sys_ahci_end_req(struct pt_regs *regs);
+
 // 系统调用的内核入口程序
 void do_syscall_int(struct pt_regs *regs, unsigned long error_code);
 
@@ -60,4 +62,5 @@ system_call_t system_call_table[MAX_SYSTEM_CALL_NUM] =
     {
         [0] = system_call_not_exists,
         [1] = sys_printf,
-        [2 ... MAX_SYSTEM_CALL_NUM - 1] = system_call_not_exists};
+        [2 ... 254] = system_call_not_exists,
+        [255] = sys_ahci_end_req};

+ 12 - 1
kernel/syscall/syscall_num.h

@@ -1,4 +1,15 @@
 #pragma once
 
+/**
+ * 系统调用说明
+ * 1    printf
+ * 
+ * 
+ * 255  AHCI end_request
+ * 
+ */
+
 #define SYS_NOT_EXISTS 0
-#define SYS_PRINTF 1
+#define SYS_PRINTF 1
+
+#define SYS_AHCI_END_REQ 255