操作系统内核实现
小小路边草
喜欢尝试各种编程语言,喜欢研究各种技术
展开
-
win32 api读写磁盘物理扇区
最近打算开发一个工具,将我自制的os内核安装到物理磁盘中运行,毕竟在虚拟机上运行与在真实的物理机上运行还是有差别的。因此前期需要验证一下可行性。本来尝试用C语言的fopen,fread,fwrite,fclose这一套函数来编写的,但是fwrite老是不成功,最后换成了win32的文件操作api: CreateFill, WriteFile,ReadFile竟然成功了。本次实验分为3部分,先读取磁盘的第一个扇区并打印内容,然后从磁盘第一个扇区开始,写入制作好包含系统内核镜像的img文件,最后再读取磁盘的第原创 2020-11-05 23:44:25 · 2887 阅读 · 1 评论 -
基于X86架构的OS内核设计之杂记(五)
解决前一篇博文所述问题,execve在释放与父进程的页表共享关系时导致内核重启问题(顺便纠正一下前一篇博文的描述,是我的内核出现了重启,并不是bochs重启了)。先说明一下,内核在启动分页之前,把内核虚拟地址0xC0000000-0xC0800000映射到0x00000000-0x0080000(物理内存前8M),此后内核想要访问内存最前端的8M地址,必须通过页表转换机制。而我们的进程在execve时,将0-3GB的进程空间全部解除映射,即进程页目录表的前768项清零,如果execve此时访问0-3GB原创 2020-11-03 00:55:36 · 181 阅读 · 1 评论 -
基于X86架构的OS内核设计之杂记(四)
创建子进程fork与执行新程序execve时页表复制的问题在os内核中,我通过fork系统调用创建新进程,在fork调用中,创建了新进程的tcb结构和内核态堆栈,通过mm_copy为新进程创建了独立的页目录和页表,这些页目录和页表映射到父进程相同的物理页上。/** * the one just the return address for sys_call0_for() * int do_fork(int nr,unsigned long stack_start) */int do_fork(u原创 2020-11-01 15:02:16 · 172 阅读 · 0 评论 -
基于X86架构的OS内核设计之杂记(一)
在使用BIOS INT 13H扩展调用时,发现使用LBA方式读取的最大扇区数在不同的BIOS会有不同的结果,bochs虚拟机上一次可以读取128个扇区,而VMware上一次只能读取127个扇区。...原创 2019-07-30 23:25:09 · 214 阅读 · 0 评论 -
基于X86架构的OS内核设计之杂记(二)
在用户shell进程通过系统调用read()读取按键键值时,第一次读取键值0,而内核空间中明确返回值非零,通过debug和分析汇编文件:read系统调用代码如下:int gets(char *buf){ int ch, r, i = 0; do{ r = read(fd_keyboard,(char*)&ch, 1); if ( ch == '\n') break; ...原创 2019-07-30 23:27:33 · 245 阅读 · 0 评论 -
基于X86架构的OS内核设计之杂记(三)
GCC编译静态库目前已经实现一个简单的用户进程,可以使用open,read,write等系统调用,我打算将该进程作为一个简单的交互进程"shell",她从键盘接收命令并执行,所以我们需要另外一个进程,"shell"进程通过fork和exec系统调用,执行这个新的进程,后续还要实现更多的基础命令,因此大部分c库函数如strlen,sprintf和系统调用如open,read,write等都需要重新...原创 2019-07-31 23:52:54 · 187 阅读 · 0 评论