# Draft-OS-80386 **Repository Path**: jianglin998/draft-os-80386 ## Basic Information - **Project Name**: Draft-OS-80386 - **Description**: 基于80386的OS - **Primary Language**: Unknown - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-11-02 - **Last Updated**: 2023-11-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Draft-OS ## 更新记录 ### 2023-11-02 #### 17:46 - 完成mbr - 从第2个扇区拷贝4个扇区的loader数据到0x900的位置 - 跳转loader一去不复返 - 完成loader - 完成读取dram内存容量功能,通过e820或者88子功能号去bios中读取 - 完成对GDT的定义 - 进入保护模式 - 完成内存分页 - 完成从第9个扇区复制200个扇区的kernel elf文件到0x70000的位置 - 完成elf文件分析并复制段到实际地址 - 进入kernel的main函数 - 完成stdint的定义 - 完成内核库print.S - 完成put_char函数 - 完成put_int_x函数 - 完成put_str函数 - 完成8259A的设置,并只开启IRQ0的时钟中断 - 构建IDT表,并对每个中断都分配通用入口函数 - 完成8253中定时器0的设置,让中断频率提升到100hz #### 21:20 - 修改主函数为int返回类型 - 更改文件结构 build文件夹放中间结果 output文件夹放最终结果 - 增加makefile文件 - 支持clean清除build中间结果 - 支持distclean深层次清理最终结果 - 支持mbr - 支持loader - 支持kernel - 支持write - 支持run - 支持all ### 2023-11-03 #### 16:42 - 修改kernel/[src/inc]/interrupt - 实现查询中断状态函数,即查看IF标志位状态 - 实现关中断函数 - 实现开中断函数 - 实现设置中断状态函数 - 增加kernel/[src/inc]debug - 添加ASSERT断言 ### 2023-11-04 #### 14:13 - 增加lib/kernel/string - 实现memset - 实现memcpy - 实现memcmp - 实现strcpy - 实现strlen - 实现strcmp - 实现strchr - 实现strrchr - 实现strcat - 增加lib/kernel/[src/inc]/bitmap位图库 - 实现bitmap_init位图初始化 - 实现bitmap_scan_test测试位图中某位的值 - 实现bitmap_scan查找位图中连续个cnt可用的位 - 实现bitmap_set设置位图中某个位的值 #### 15:40 - 增加kernel/[src/inc]/memory内存管理 - 实现内核和用户物理内存池的初始化 - 实现内核虚拟地址池的初始化 ### 2023-11-05 #### 13:08 - 修复lib/kernel/[src/inc]/bitmap位图库中bitmap_scan多次调用卡死的bug - 对kernel/[src/inc]/memory内存管理增加功能 - 增加pte_ptr函数,通过虚拟地址获取pte地址 - 增加pde_ptr函数,通过虚拟地址获取pde地址 - 增加malloc_page函数,可选择从用户内存池或者内核内存池获取以4K即1页为粒度的内存 - 增加get_kernel_pages函数,这是对malloc_page的封装,仅从内核内存池获取以4K即1页为粒度的内存 #### 19:17 - 增加thread/[src/inc]/thread线程功能 - 增加thread_start函数,目前只能启动一个线程去运行,属于start之后就跳到该线程函数运行了,但本质已经发生了变化 #### 20:01 - 增加lib/kernel/[src/inc]/list双向链表功能 - 完成list_init链表初始化功能 - 完成list_insert_before在之前插入链表元素功能 - 完成list_remove移除链表元素功能 - 完成list_push链表元素压入功能 - 完成list_pop链表元素弹出功能 - 完成list_append链表元素追加功能 - 完成list_empty检查链表是否为空功能 - 完成list_len检查链表长度功能 - 完成list_traversal检查链表中符合条件的链表元素功能 - 完成elem_find在链表中查找链表元素是否存在功能 ### 2023-11-06 #### 20:12 - 修复kernel.S可能引发的不知名bug - kernel/[inc/src]/interrupt - 增加intr_register_callback注册中断回调函数 - device/[inc/src]/timer - 注册定时器中断回调函数并在回调函数里判断线程时间片是否执行完毕,若执行完毕则调度 - thread/[inc/src]/thread - 增加thread_init初始化线程调度函数 - 增加schedule调度函数 - 完善task_struct结构体,并在内部函数中补充初始化 - 增加thread/src/switch.S - 增加switch_to切换任务函数 - 完成多线程RR调度机制 ### 2023-11-07 #### 14:49 - 修改global.h - 修改中断描述符表类型为0x0e,原来写的是0x0f,导致了cpu误认为这是个陷阱门,所以没有修改if标志位 - 修改kernel/src/interrupt.c - 修改主pic起始中断号为0x20 - 修改次pic起始中断号为0x28 - 修改device/src/timer.c - 修改注册systick的中断号为0x20 - 修改kernel/src/kernel.S - 取消cli和sti这对组合,原因见global.h #### 18:39 - 找出引发GP的原因:在多线程对于共享资源显卡操作时,光标位置出现错误,在线程A写完高字节光标时,选通了低字节光标,此时线程B执行,一直执行到选通高字节光标,此时线程A又得到执行,直接写入低字节光标,此时被选通的是高字节光标,所以出现了光标越界的情况 - ![gp_error_problem](./image/gp_error_probelm.png) ### 2023-11-08 #### 14:34 - 修改kernel/[src/inc]/interrupt - 修复intr_get_status获取错误的bug - 修复了一些错误的命名 - 修改thread/[src/inc]/thread - 修复thread_tag类型错误可能会导致的bug - 增加thread_block锁定线程函数 - 增加thread_unblock解锁线程函数 - 增加thread/[src/inc]/sync - 增加sema_init信号量初始化函数 - 增加lock_init锁初始化函数 - 增加sema_down信号量获取函数 - 增加sema_up信号量释放函数 - 增加lock_acquire锁获取函数 - 增加lock_release锁释放函数 - 增加device/[src/inc]/console - 增加console_init控制台初始化函数 - 增加console_put_str控制台打印字符串函数 - 增加console_put_char控制台打印字符函数 - 增加console_put_int_x控制台打印十六进制数函数 - 增加console_put_int_d控制台打印十进制数函数 - 增加锁机制并修复对于共享资源显卡访问的问题 #### 20:43 - 修改kernel/src/kernel.S - 将全部外部中断的中断入口加入 - 修改kernel/src/interrupt.c - 修改中断数量为0x30 - 修改主PIC中断屏蔽为0xfd,即除了键盘中断其他中断都屏蔽掉 - 增加device/[src/inc]/keyboard - 增加keyboard_init函数 - 注册0x21键盘中断处理函数并在该函数中打印出8042的扫描码 ### 2023-11-09 #### 15:34 - 修改device/src/keyboard.c - 增加对控制键ctrl,alt,shift,caps-lock的支持 - 增加对主功能键区的支持 - 增加输出键盘输入到屏幕上的支持 #### 17:36 - 增加lib/kernel/[src/inc]/ioqueue - 增加ioqueue_init初始化环形队列函数 - 增加ioqueue_empty获取环形队列是否为空函数 - 增加ioqueue_full获取环形队列是否为满函数 - 增加ioqueue_get_char获取环形队列一个字节函数 - 增加ioqueue_put_char写入环形队列一个字节函数 - 修改device/src/keyboard.c - 增加每次读取到字母会写入环形队列缓冲区功能 - main函数中增加两个线程读取环形队列 ### 2023-11-10 #### 17:00 - 修改kernel/inc/global.h - 增加了一些定义 - 增加userprog/[src/inc]/tss - 增加tss_init初始化函数 - 实现了分配优先级3级的代码段描述符和数据段描述符以及优先级0级的tss描述符 - 添加了一些image资源 ### 2023-11-13 #### 19:11 - 修改thread/[src/inc]/thread - 修改thread.h中task_struct结构体成员ready_tag为general_tag - 修改kernel/[src/inc]/memory - get_vaddr内部函数增加对于用户虚拟池的获取 - 增加get_user_pages函数,获取用户池n个4k大小粒度的内存 - 增加get_a_page,可实现指定虚拟地址获取内存 - 修改kernel/inc/global.h - 增加了向上取整除法宏 - 增加了eflags的一些宏 - 修改userprog/[src/inc]/tss - 增加update_tss_esp函数,更新tss中esp0的值 - 增加userprog/[src/inc]/process - 实现start_process函数,此函数用于启动进程,会被作为thread.c中kernel_thread函数的参数运行 - 增加process_activate函数,用于设置cr3寄存器的值和更新tss中esp0的值 - 增加create_page_dir函数,创建页表 - 增加create_user_vaddr_bitmap创建用户虚拟地址池函数 - 增加process_execute启动进程函数 - 修改kernel/src/main.c - 增加对于进程的测试 - 进程测试遇见bug,调度进程时会复位,问题出现在:(0).[21570770] [0x000000001d38] 0008:c0001d38 (unk. ctxt): pop ss ; 17 ### 2023-11-14 #### 18:31 - 调整kernel.S里面进入中断入栈和出栈顺序,严格遵守thread.h中定义的intr_stack顺序,取消掉ss入栈出栈,即可解决pop ss的错误问题 - 解决(0).[21570770] [0x000000001d38] 0008:c0001d38 (unk. ctxt): pop ss ; 问题 - 又来了个问题:[0x000000001d36] 0008:c0001d36 (unk. ctxt): pop fs ## TODO - [ ] 实现更细粒度的内存申请函数 - [ ] 实现内存释放函数 - [ ] 完善内存管理中的回滚机制 - [ ] 完善内存管理中对用户的虚拟地址分配部分 - [ ] 修复print.S中put_int_d函数不能打印超过2的16次方-1大小的数的bug - [x] 修复pop ss出问题的错误 - [ ] 解决pop fs出问题的错误