
操作系统
文章平均质量分 80
小白起步
每天都要学到新东西
展开
-
一. bochs环境部署
配置要求一台linux操作系统的机器即可,最好是32位的。因为我们实现的小kernel是32位的,在64的机器上进行编译和链接可能会出现某些问题。笔者这里使用的是Ubuntu16.4环境配置bochs安装与配置安装我们自制的操作系统也是运行在一个虚拟机中的,这里我们用的是bochs,bochs本身也是基于x86架构的,这也是我之前说我们的小kernel也是32位的原因 bochs下载地址 点击链接原创 2018-04-23 15:34:31 · 557 阅读 · 0 评论 -
十二. 实现用户进程
TSS单核CPU想要实现多任务,唯一的方案就是多个任务共享同一个CPU,也就是让CPU在多个任务间轮转。CPU执行任务时,需要把任务运行所需要的数据加载到寄存器、栈和内存中,因为CPU只能直接处理这些数据,这是CPU在设计上就直接决定的。任务的数据和指令是CPU的处理对象,任务的执行会占用寄存器和内存。内存相对于CPU来说是低速设备,里面的数据往往被加载到高速寄存器之后被CPU处理,再将结果写到内存原创 2018-05-07 06:15:40 · 459 阅读 · 0 评论 -
十三. 实现系统调用
系统调用简介关于系统调用前面有过简单的介绍,这里将真正实现系统调用现代的操作系统中,用户的权限是有限的,它不能随意的访问系统中的资源。操作系统屏蔽了用户直接访问硬件的能力,这样做的原因主要是为了安全考虑。但是如果我们想控制显卡打印字符怎么呢,那就需要通过操作系统提供的接口来完成了,我们调用操作系统提供的接口,然后操作系统去操控硬件,比如说这里的显卡,打印出字符来。我们使用的c语言里面的printf函原创 2018-05-07 06:14:20 · 355 阅读 · 0 评论 -
十一. 线程同步
乱序输出前面完成了多线程之后,那么肯定会涉及到线程的同步问题。因为线程的执行是随机的,乱序的。虽然我们这个小kernel实现的调度器算法比较简陋,它的随机性没那么强,但是每次进行线程切换的时候,还是有可能产生问题。并且问题已经产生了。int main(void){ put_str("I am kernel\n"); init_all(); thread_start("thr原创 2018-05-07 06:13:28 · 227 阅读 · 0 评论 -
pipe
进程同步看一下上一节写的调用外部shell的方法。memset(final_path, 0, sizeof(final_path));int32_t pid = fork();if (pid){ while(1);}else{ make_clear_abs_path(argv[0], final_path); argv[0] = final_pa...原创 2018-05-19 17:41:51 · 566 阅读 · 0 评论 -
exec
exec在linux的bash shell中,执行外部命令时,该shell会fork一个子进程,这个子进程调用exec从磁盘上加载外部命令对应的程序。这是exec的一个应用。通过它的应用来看原理exec会把一个可执行文件的绝对路径作为参数,把当前正在运行的用户进程的进程体用该可执行文件的进程体替换,从而实现新进程的执行,而进程的pid是不变的。可以这样认为,exec并没有创建新的进程,只是...原创 2018-05-19 17:40:24 · 1774 阅读 · 0 评论 -
二十一. elf文件格式解析
elf文件格式我们的程序是通过gcc编译的,在linux下,gcc编译出来的可执行文件是elf格式的二进制文件。那么肯定要elf文件进行解析才能正确的得到进程可执行数据的位置。下面介绍一下elf格式的几个基本概念一个程序中最重要的部分是段和节,他们是真正的程序体,存储程序执行所需要的数据,程序中有很多段,常见的有代码段和数据段,段是由节组成的。多个节经过链接之后被合并成一个段。段和...原创 2018-05-19 17:39:27 · 1621 阅读 · 0 评论 -
shell1
路径解析转换路径有绝对路径和相对路径之分,在平常使用linux的过程中,我们在输入命令和参数的时候,往往使用的都是相对路径。相对路径是基于当前的工作路径的出的。当前工作路径 + 相对路径 = 绝对路径比如说当前工作路径为 /home/work 此时输入 ls file,那么file所在的绝对路径就是 /home/work/file 了。因为这个kernel比较简单,如果路径以根目录...原创 2018-05-19 17:38:28 · 249 阅读 · 0 评论 -
shell
fork的原理先通过下面这段代码简单的介绍一下fork这个函数,了解一下它的功能#include <unistd.h>#include <stdio.h>int main(){ int pid = fork(); if (pid == -1) return -1; if (pid) { ...原创 2018-05-19 17:37:46 · 197 阅读 · 0 评论 -
十八. 文件系统四(文件的读写与删除)
写入文件文件的数据都是记录在inode中的文件块中,在该文件系统的设计中,只用了12个直接块和一个间接块来存储文件,所以一个文件最大可以存放 140 * 512字节的数据。写文件的过程对文件块和扇区的分配过程,根据当前要写入的数据量大小,来判断是否需要分配新的数据块。如果12个直接块不够存储该数据,就分配间接块来存储,当所需的数据块分配好了之后,就会逐块的往硬盘上写入数据,知道所有的数据被...原创 2018-05-19 17:36:33 · 1051 阅读 · 2 评论 -
filesystem3
文件描述符在之前介绍的概念中,inode是用来表示一个文件的,用于描述文件的存储信息,文件的权限等。但这个inode结构是操作系统为自己的文件系统准备的数据结构,仅供其内部使用,与用户的关系不大,接下来要介绍的文件描述符才是用户能够使用的结构。在linux系统中,读写文件的本质是先通过文件的inode找到文件数据块的扇区地址,随后对这些扇区的数据进行读写,从而实现了文件的读写。对用户进...原创 2018-05-19 17:35:57 · 337 阅读 · 0 评论 -
filesystem2
在前面一节中介绍了文件系统的基本概念,接下来就要准备开始实现我们的文件系统,下面是为管理文件系统提供的几个基础数据结构。超级块的结构/* 超级块 */struct super_block{ uint32_t magic; // 用来标识文件系统类型,支持多文件系统的操作系统通过此标志来识别文件系统类型 uint32_t sec_cnt; ...原创 2018-05-19 17:35:20 · 236 阅读 · 0 评论 -
filesystem
磁盘的基础概念扇区:它是磁盘读写的基本单位。在我们个人的pc上,他的大小通常为512byte块:在windows中,称为簇。一个块由多个扇区组成,磁盘在进行读写数据的时候,不可能有一扇区的数据就读或写一次,而是等数据累计到一定量后,在统一进行读写,而这个数据量就叫块。在对磁盘进行格式化分区的时候可以选择块的大小,默认的是4kb。因为每次进行读写的数据量都是一块为单位,所以在磁盘上数据的存储...原创 2018-05-19 17:34:40 · 6728 阅读 · 0 评论 -
malloc&free
之前的内容中已经实现过内存分配的功能,但之前的内存管理模块中只是实现了内核空间的内存分配,而且每次分配的空间都是已页为单位,也就是只能分配页的整数倍的空间。已页为单位的内存确实是最利于操作系统管理的,但是当只需要小块内存区域的时候,之前的内存管理模块就无法完成了。所以在这里要完善之前的内存管理模块,使其能够支持小块内存的分配。有了底层的内存管理模块的支撑之后,malloc和free的实现就非常容易...原创 2018-05-19 17:33:58 · 361 阅读 · 0 评论 -
八. 内存池规划
bitmap简介计算机中一些资源的数量非常庞大,比如内存容量和硬盘容量。为了使用这些资源,必须涉及到一套管理这些资源的方法,而方法中必须要构建数据结构来存储管理数据,这些数据本身也是需要占用内存的计算机中最小的单位是位,那么用一组二进制位串来管理其他单位大小的资源是很自然的,这组二进制位中的每一位与其他资源的数据单位是一一对应的关系,这实际是一种映射关系,于是这组二进制位便有了一个名字—-位图位图与原创 2018-04-27 19:34:15 · 305 阅读 · 0 评论 -
九. 内核的内存分配
前面已经准备好了内存池,这里就要正式实现内存的分配了。因为到目前为止,还没有用户进程,所以这里只实现内核中的动态内存分配。内存分配的过程如下: 1. 在虚拟内存池中申请n个虚拟页 2. 在物理内存池中分配物理页 3. 在页表中添加虚拟地址与物理地址的映射关系接下来就是一步步完成这三步申请虚拟页// 在虚拟内存池中申请pg_cnt个虚拟页static void *vaddr_get(enum原创 2018-04-27 19:33:05 · 421 阅读 · 0 评论 -
十. 内核线程
实现线程函数观察一下这段c语言代码void threadFunc(void *arg){ printf("thread function\n");}int main(){ printf("main function\n"); _beginthread(threadFunc, 0, NULL); return 0;}这里只是举个简单的例子,没有考虑错误处理和资源回收。在原创 2018-04-30 00:00:58 · 300 阅读 · 0 评论