0%

rCore_Tutorial_CP5

第五章,进程
看之前感觉好像没什么东西,看到一半感觉还是非常牛逼的

进程概念及重要系统调用

这里面阐述了任务(Task)和进程(Process)之间的区别
说实话很多地方还是觉得很抽象,按照本科期间的说法,进程就是一个运行的二进制程序,但这么说似乎和任务没什么区别。从本章提到的内容上来说,感觉任务是计算机依次加载的一系列程序,以规定的顺序运行,而进程则是通过fork和exec系统调用,在用户的交互下进行,可以选择执行的二进制程序

并且进程间存在父子关系,子进程由父进程fork产生,linux中所有进程均由pid为1的初始进程产生,以前我以为pid为1的进程就是操作系统,现在看来,似乎操作系统(内核)运行在更下一层,而pid为1的进程是内核创建出来对所有进程进行管理并提供用户交互的初始进程

阅读全文 »

rCore_Tutorial_CP4

摸了几天继续看一下,第四章要实现究极虚拟内存,这非常关键,也是操作系统中的一个很核心的部分。之前的批处理和多道处理系统虽然实现了硬件特权的限制和系统调用,但是并没有对应用空间进行隔离,导致用户应用必须以规定的形式分布在内存中,并且还可以读取和修改其他用户程序,甚至是内核数据的内容,并不能认为是一个足够安全的系统。

本章的目标就是实现虚拟内存的分配,内存分页和页表映射,实现内核与各用户进程间的隔离。通过一层虚拟地址,使得操作系统获得了对实际物理内存访问的完全控制,用户程序只能访问由操作系统提供的虚拟地址,进而实现内存空间的完全隔离

实现还是经典的页表,段表难维护碎片多。进程对内存的访问一般来说就是通过load等汇编指令进行的,在硬件层面提供一个MMU,并通过内核维护应用程序的页表,MMU访问页表对虚拟地址进行解析,顺便还能对页进行rwx等权限控制,进一步加强保护

SV39多级页表的硬件机制

阅读全文 »

rCore_Tutorial_CP3

完成一个多道分时系统

多道程序放置与加载

由于没有文件系统和内存隔离,这里的许多操作还是以较为原始的方式进行,相较于CP2的批处理系统,多道分时操作系统可以同时将多个任务加载到内存,并在其中进行时间片轮转的操作。然而因为没有文件系统,各个程序仍然是直接以纯二进制数据的形式与操作系统编译到数据段,运行时直接加载二进制指令到系统约定的位置

但即使对于存在文件系统的操作系统而言,多道程序的运行在没有实现虚拟内存的情况下(且程序为位置相关程序),仍然需要预先与操作系统约定程序的加载地址,否则出现多个程序加载地址一致的情况则无法顺利运行。

阅读全文 »

rCore_Tutorial_CP2

这一章的文件结构略微的复杂了一点,需要开始之前先稍微强化一下对rust mod use等关键字的认知。。。

rust mod/use/extern

Packages and Crates rust认为src下的main.rs是二进制crate的主文件,而lib.rs则是库crate的主文件,所以这里的lib.rs是主文件,和cargo.toml中的name赋值为user_lib并无关联。。。

When we entered the command, Cargo created a Cargo.toml file, giving us a package. Looking at the contents of Cargo.toml, there’s no mention of src/main.rs because Cargo follows a convention that src/main.rs is the crate root of a binary crate with the same name as the package. Likewise, Cargo knows that if the package directory contains src/lib.rs, the package contains a library crate with the same name as the package, and src/lib.rs is its crate root. Cargo passes the crate root files to rustc to build the library or binary.

阅读全文 »

rCore_Tutorial_CP1

第一章:应用程序与基础环境

gdb调试指令

一些可能用到的 gdb 指令:

x/10i 0x80000000 : 显示 0x80000000 处的10条汇编指令。
x/10i $pc : 显示即将执行的10条汇编指令。
x/10xw 0x80000000 : 显示 0x80000000 处的10条数据,格式为16进制32bit。
info register: 显示当前所有寄存器信息。
info r t0: 显示 t0 寄存器的值。
break funcname: 在目标函数第一条指令处设置断点。
break *0x80200000: 在 0x80200000 处设置断点。
continue: 执行直到碰到断点。
si: 单步执行一条汇编指令。

内核第一条指令(实践篇)

阅读全文 »