xv6-lab3 pgtbl
vm.c源码阅读代码框架
12345678910111213141516171819// vm.c|-——kvminit()+___kvmmap()|___mappages()+___walk()|___kvminithart()+___kvmpa()|___uvmcreate()+___uvminit()|___uvmalloc()+___uvmdealloc()|___uvmfree()+___uvmunmap()|___walkaddr()+___uvmcopy()|___uvmclear()+___copyinstr()|___copyout()+___copyin()
kvminit() kvmmap() walk() mappages()初始换内核的直接映射页表,设置内核虚拟内存到物理内存的映射
1234567891011121314151617181920212223242526272829/* * create a direct-map page table for the kernel. */void kvminit() { kernel_pagetabl ...
Rust-learning -- Rustlings(2)
04_primitive_types(ch3.2, ch4.3)Ex 1so eazy,给is_evening随便加个bool值就行
12345678910111213fn main() { // Booleans (`bool`) let is_morning = true; if is_morning { println!("Good morning!"); } let is_evening = false;// Finish the rest of this line like the example! Or make it be false! if is_evening { println!("Good evening!"); }}
Ex 2这个题目中,is_alphabetic()和is_numeric()是字符(char)类型的方法,用于检查字符是否为字母或数字。这些方法属于标准库的一部分练习还是很简单,加 ...
Rust-learning -- Rustlings(1)
Rustlings“Rustlings” 是一个由 Rust 社区维护的开源项目,旨在帮助初学者学习和练习 Rust 编程语言的基础知识。它提供了一系列的小练习。github:https://github.com/rust-lang/rustlings中文参考教材:https://www.rustwiki.org.cn/zh-CN/book/title-page.html
01_varables(ch3.1)Ex 1 变量定义前加 let 1234 fn main() { let x = 5; println!("x has the value {}", x);}
Ex 212345678fn main() { let x = 10; if x == 10 { println!("x is ten!"); } else { println!("x is not ten!"); ...
xv6-lab2 syscall
lab2中,我们将给xv6增加一些新的系统调用
System call tracing (moderate)YOUR JOB添加一个系统调用跟踪功能,该功能可能会在以后调试实验时有所帮助。创建一个新的trace系统调用来控制跟踪。它应该有一个参数,这个参数是一个整数“掩码”(mask),它的比特位指定要跟踪的系统调用。例如,要跟踪fork系统调用,程序调用trace(1 << SYS_fork),其中SYS_fork是kernel/syscall.h中的系统调用编号。如果在掩码中设置了系统调用的编号,则必须修改xv6内核,以便在每个系统调用即将返回时打印出一行。该行应该包含进程id、系统调用的名称和返回值;不需要打印系统调用参数。trace系统调用应启用对调用它的进程及其随后派生的任何子进程的跟踪,但不应影响其他进程。hints
在Makefile的UPROGS中添加$U/_trace
运行make qemu,将看到编译器无法编译user/trace.c,因为系统调用的用户空间存根还不存在:将系统调用的原型添加到user/user. ...
C-learning -- fp/sprintf?
fprintf*int fprintf(FILE stream, const char format[, argument]…)fprintf可以把数据写入文件中,借助的是第一个参数(FILE的指针)fprintf比printf也只多了一个FILE指针,后面两个参数和printf一样写就行fprintf的作用:发送格式化输出到流 stream 中(把数据写入文件)fprintf也能代替printf来使用FILE指针为stdout
sprintf*int fprintf(char buffer, const char format[, argument]…)sprintf只比printf多了一个char 的指针,后面两个参数和printf一样写就行sprintf的作用:sprintf的作用是将一个格式化的字符串输出到一个目的字符串中参数里的buffer指针就是指向目的字符串的简单来说就是把数据输出到一个字符串
12345678int main() { char a[50]; sprintf(a, "%d", 1234); print ...
xv6-lab1 utilties
Lab 1 是让我们在 user 文件夹下编写五个用户程序
Sleep(easy)Implement the UNIX program sleep for xv6; your sleep should pause for a user-specified number of ticks. A tick is a notion of time defined by the xv6 kernel, namely the time between two interrupts from the timer chip. Your solution should be in the file user/sleep.c.这里的目的即是停顿一段时间,时间即是 sleep 后的 ticks 参数Run the program from the xv6 shell:
123456$ make qemu...init: starting sh$ sleep 10(nothing happens for a little while)$
这里只需要使用 sleep 系统调用即可,代码如下:
123 ...
xv6-lab0 环境配置
我使用的环境是VMware虚拟机,系统为Ubuntu20.04
工具链安装软件包1$ sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu
这里有个需要注意的点是之后执行 make qemu 且脚本在
1qemu-system-riscv64 -machine virt -bios none -kernel kernel/kernel -m 128M -smp 3 -nographic -drive file=fs.img,if=none,format=raw,id=x0 -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0
之后出现挂起,则需要卸载该软件包并安装旧版本:
12$ sudo apt-get remove qemu-system-misc$ sudo apt-get install qemu-system-misc=1:4.2 ...
Rust-learning -- ownership(2)
ownership(2)引用&借用下面是如何定义并使用一个(新的)calculate_length 函数,它以一个对象的引用作为参数而不是获取值的所有权:
1234567891011fn main() { let s1 = String::from("hello"); let len = calculate_length(&s1); println!("The length of '{}' is {}.", s1, len);}fn calculate_length(s: &String) -> usize { s.len()}
注意我们传递 &s1 给 calculate_length,同时在函数定义中,我们获取 &String 而不是 String。这些 & 符号就是引用,它们允许你使用值但不获取其所有权。
&s1 语法让我们创建一个指向值 s1 的引用,但是 ...
Rust-learning -- ownership(1)
ownership(1)What is ownership?Rust 的核心功能(之一)是 所有权(ownership)。
所有运行的程序都必须管理其使用计算机内存的方式。一些语言中具有垃圾回收机制,在程序运行时不断地寻找不再使用的内存;在另一些语言中,开发者必须亲自分配和释放内存。Rust 则选择了第三种方式:通过所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。在运行时,所有权系统的任何功能都不会减慢程序
Stack & Heap栈和堆都是代码在运行时可供使用的内存,但是它们的结构不同。栈以放入值的顺序存储值并以相反顺序取出值。这也被称作后进先出(last in, first out)。想象一下一叠盘子:当增加更多盘子时,把它们放在盘子堆的顶部,当需要盘子时,也从顶部拿走。不能从中间也不能从底部增加或拿走盘子!增加数据叫做进栈(pushing onto the stack),而移出数据叫做出栈(popping off the stack)
栈中的所有数据都必须占用已知且固定的大小。在编译时大小未知或大小可能变化的数据,要改为存储在堆上。堆是缺乏组织的:当向堆放入 ...
rCore lab1
sys_task_info()实现一个 sys_task_info 的系统调用,它的主要功能是:
任务控制块相关信息(任务状态)
任务使用的系统调用次数
系统调用时刻距离任务第一次被调度时刻的时长即struct TaskInfo中给我们写好的status、syscall_times和time框架已经给好了123456789101112131415161718///os/src/syscall/process.rs/// Task information#[allow(dead_code)]pub struct TaskInfo { /// Task status in it's life cycle status: TaskStatus, /// The numbers of syscall called by task syscall_times: [u32; MAX_SYSCALL_NUM], /// Total running time of task time: usize,}/// YOUR JOB: Fin ...