From c470b80bceb5a7b15f22d2a6017d9603bf41282d Mon Sep 17 00:00:00 2001 From: wwf2023 <1092923610@qq.com> Date: Thu, 7 Nov 2024 22:34:37 +0800 Subject: [PATCH] commit swap.c --- labcodes/lab3/kern/driver/ide.c | 32 ++++++++++++++++++++++++++++++- labcodes/lab3/kern/mm/swap.c | 17 ++++++++++++---- labcodes/lab3/kern/mm/swap_fifo.c | 3 +++ 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/labcodes/lab3/kern/driver/ide.c b/labcodes/lab3/kern/driver/ide.c index 271cfa80..68a78679 100644 --- a/labcodes/lab3/kern/driver/ide.c +++ b/labcodes/lab3/kern/driver/ide.c @@ -64,46 +64,73 @@ static struct ide_device { unsigned char model[41]; // Model in String } ide_devices[MAX_IDE]; +/** + * 等待IDE设备就绪 + * + * 此函数通过检查IDE设备的状态寄存器,等待设备完成操作或进入就绪状态 + * 它主要用于避免在设备忙时进行数据访问,以防止数据错误或设备损坏 + * + * @param iobase IDE设备的I/O基址,用于与设备进行通信 + * @param check_error 指示是否需要检查设备错误的标志如果设置为true, + * 函数会在设备忙状态解除后检查错误位如果设置为false, + * 函数不会进行错误检查 + * @return 返回0表示设备成功进入就绪状态,-1表示设备在操作中检测到了错误 + */ static int ide_wait_ready(unsigned short iobase, bool check_error) { int r; + // 循环检查IDE设备的状态寄存器,直到忙状态位清除 while ((r = inb(iobase + ISA_STATUS)) & IDE_BSY) /* nothing */; + // 如果需要检查错误,并且状态寄存器中的错误位被设置,则返回错误 if (check_error && (r & (IDE_DF | IDE_ERR)) != 0) { return -1; } + // 设备就绪,无错误,返回0 return 0; } +/** + * 初始化IDE设备。 + * + * 此函数初始化所有IDE设备,设置设备状态,读取设备信息,并启用IDE设备中断。 + */ void ide_init(void) { + // 确保扇区大小是4的倍数,以满足后续数据访问的对齐要求 static_assert((SECTSIZE % 4) == 0); unsigned short ideno, iobase; for (ideno = 0; ideno < MAX_IDE; ideno ++) { + // 假设此处没有设备 /* assume that no device here */ ide_devices[ideno].valid = 0; iobase = IO_BASE(ideno); /* wait device ready */ + // 等待设备准备好 ide_wait_ready(iobase, 0); /* step1: select drive */ + // 第一步:选择驱动器 outb(iobase + ISA_SDH, 0xE0 | ((ideno & 1) << 4)); ide_wait_ready(iobase, 0); /* step2: send ATA identify command */ + // 第二步:发送ATA识别命令 outb(iobase + ISA_COMMAND, IDE_CMD_IDENTIFY); ide_wait_ready(iobase, 0); /* step3: polling */ + // 第三步:轮询 if (inb(iobase + ISA_STATUS) == 0 || ide_wait_ready(iobase, 1) != 0) { continue ; } - + // 设备正常 /* device is ok */ ide_devices[ideno].valid = 1; + // 读取设备的识别空间 /* read identification space of the device */ unsigned int buffer[128]; insl(iobase + ISA_DATA, buffer, sizeof(buffer) / sizeof(unsigned int)); @@ -111,6 +138,7 @@ ide_init(void) { unsigned char *ident = (unsigned char *)buffer; unsigned int sectors; unsigned int cmdsets = *(unsigned int *)(ident + IDE_IDENT_CMDSETS); + // 判断设备使用48位还是28位寻址 /* device use 48-bits or 28-bits addressing */ if (cmdsets & (1 << 26)) { sectors = *(unsigned int *)(ident + IDE_IDENT_MAX_LBA_EXT); @@ -122,6 +150,7 @@ ide_init(void) { ide_devices[ideno].size = sectors; /* check if supports LBA */ + // 检查是否支持LBA assert((*(unsigned short *)(ident + IDE_IDENT_CAPABILITIES) & 0x200) != 0); unsigned char *model = ide_devices[ideno].model, *data = ident + IDE_IDENT_MODEL; @@ -137,6 +166,7 @@ ide_init(void) { } // enable ide interrupt + // 启用IDE中断 pic_enable(IRQ_IDE1); pic_enable(IRQ_IDE2); } diff --git a/labcodes/lab3/kern/mm/swap.c b/labcodes/lab3/kern/mm/swap.c index 6f38077c..54645d79 100644 --- a/labcodes/lab3/kern/mm/swap.c +++ b/labcodes/lab3/kern/mm/swap.c @@ -30,24 +30,33 @@ static void check_swap(void); int swap_init(void) { + // 初始化交换文件系统 swapfs_init(); + // 检查最大交换偏移量是否在合法范围内 if (!(1024 <= max_swap_offset && max_swap_offset < MAX_SWAP_OFFSET_LIMIT)) - { + { + // 如果最大交换偏移量不合法,输出错误信息并panic panic("bad max_swap_offset %08x.\n", max_swap_offset); } - + // 选择并设置交换管理器为FIFO(先进先出)策略 sm = &swap_manager_fifo; + + // 调用选定交换管理器的初始化函数 int r = sm->init(); - + + // 如果交换管理器初始化成功 if (r == 0) { + // 标记交换空间初始化为成功 swap_init_ok = 1; + cprintf("SWAP: manager = %s\n", sm->name); + // 检查交换空间状态 check_swap(); } - + // 返回初始化结果 return r; } diff --git a/labcodes/lab3/kern/mm/swap_fifo.c b/labcodes/lab3/kern/mm/swap_fifo.c index cd96a03d..9e37e3b7 100644 --- a/labcodes/lab3/kern/mm/swap_fifo.c +++ b/labcodes/lab3/kern/mm/swap_fifo.c @@ -33,9 +33,12 @@ list_entry_t pra_list_head; static int _fifo_init_mm(struct mm_struct *mm) { + //初始化一个链表头 pra_list_head list_init(&pra_list_head); + //将 mm 结构中的 sm_priv 字段指向这个链表头 mm->sm_priv = &pra_list_head; //cprintf(" mm->sm_priv %x in fifo_init_mm\n",mm->sm_priv); + //返回 0 表示成功 return 0; } /* -- Gitee