Project 1-环境搭建与系统设计

实验目标 本节主要是搭建开发环境并完成系统整体设计,为后续实验打下基础。 详细任务 环境搭建 1.安装JDK17 步骤:​​ 访问Java Archive Downloads - Java SE 17.0.12 and earlier 或 OpenJDK 17(自行寻找网站下载) 下载对应操作系统的安装包(Windows选.exe,macOS选.dmg,Linux选.tar.gz) ​Windows/macOS​:运行安装向导,按提示完成安装 ​Linux​: tar -xzf jdk-17_linux-x64_bin.tar.gz sudo mv jdk-17 /opt/ 配置环境变量: ​Windows​: 新增系统变量 JAVA_HOME = C:\Program Files\Java\jdk-17 编辑 Path 添加 %JAVA_HOME%\bin ​macOS/Linux​: echo 'export JAVA_HOME=/opt/jdk-17' >> ~/.bashrc # 或 ~/.zshrc echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc source ~/.bashrc 验证: java -version # 应显示 "java version "17.x.x" 2.安装Maven3.8+ 步骤:​​ 访问 Download Apache Maven – Maven 下载 Binary zip 包(如 apache-maven-3.8.6-bin.zip) 解压到本地目录(如 C:\Program Files\apache-maven-3.8.6 或 /opt/maven) 配置环境变量 Windows 新增 MAVEN_HOME = C:\Program Files\apache-maven-3.8.6 编辑 Path 添加 %MAVEN_HOME%\bin macOS/Linux echo 'export MAVEN_HOME=/opt/maven' >> ~/.bashrc echo 'export PATH=$MAVEN_HOME/bin:$PATH' >> ~/.bashrc source ~/.bashrc 验证 mvn -v # 应显示 Apache Maven 3.8.x 3.安装 MySQL 8.0 步骤: ...

July 8, 2025 · 2 min · Theme PaperMod

Project #0 - 实验准备

不要公开你的代码 Overview 本课程所有的代码都是在基于java进行编写的,在完成该项目之前首先需要确保你有足够的Java基础。本项目只需要一些简单的javaweb知识进行实现。 除此之外整个项目的交互逻辑严格按照OAuth2.0的协议标准实现,理解OAuth 2.0 - 阮一峰的网络日志具体的可以参考上述博客,本项目主要是基于其中的授权码模式,可以着重了解授权码模式的工作原理。 你的任务 本实验采用类似于“完形填空”的形式,你只需要在理解项目的基础上实现几个关键的函数跑通测试就可以完成,每个实验需要完成的函数在后续的实验指南中我都会详细的注明并且给出相应的提示。 本项目因为个人的精力和时间有限,无法编写完整的测试样例,所以需要自己完成后进行测试,具体的测试工具和测试方法我会在每个实验的指南中详细的说明。 因为没有非常完备的测试评分系统这就需要同学们更加自觉,以学到知识为目的,评分什么的不必过于执着,随他去吧,把这些问题留给老师。 编程作业 1.阅读材料 我在学的过程中参考网络上现有单点登录登录系统比较多,所以本实验的主要阅读材料以网络博客的形式居多 todo todo 2.浏览实验网站 浏览该网站对应的内容,包括: 第一个项目中详细的指导信息 实验的概述 参考资料 3.配置好编程环境 理论上来说,java是跨平台通用的,但是我的手头之后win和Linux的机器,所以对于MAC使用过程中可能遇到的问题不是很懂。 准备好一个可用的环境,这个环境将伴随整个整个实验 确保环境中包含必要的软件,编译器,git,编辑器等 确保你可以在这个环境中编辑,编译和调试java代码。 在实验进行的过程中出现任何问题我都建议先去读官方的文档,即使是英文的我也建议用翻译来看,相较于在各个博客之间来回跳转,这会极大的提升你的效率。在学习的过程中我希望大家能够养成一种定制自己工具的习惯,这会在今后的工作当中让你受益匪浅。 此外,我还有一些其他的建议: 如果你在这个过程中遇到到了问题却不知道该如何做的时候,你首先应该读文档,然后去问搜索引擎(最好是Google,通常会得到 StackOverflow 上的答案),当然你好可以去问市面上各种人工智能的模型。 在你向其他人提问之前最好已经经过了如上努力,比如“我在网上搜过了类似的问题,但是没有的到解决,我的报错是这样的………”并且附上报错截图或者报错的详细信息,这样有助于被求助者更快的解决你的问题。 要坚信机器是对的,人可能出错这以准则,当出现问题的时候首先自己的看自己的代码,特别是自己想当然的部分。 最后希望同学问能够在这一段大概六周的时间里收获 相关的知识,扎实自己的专业基础。 其他问题 每个人的问题都不尽相同,如果出现了相对应的问题的话可以在github上提Issue我看到了或者同学看到了都会为你解答的。

June 22, 2025 · 1 min · Theme PaperMod

Lab1 Xv6 && system calls

Using gdb 平时我们用的调试工具其实都是图形化后的gdb,使用起来非常的方便,但是熟悉原生的gdb会使我们的效率进一步提升。我认为学习好用gdb调试是一项非常重要的技能。 编译并启动 ==make qemu-gdb== 使用上述命令编译项目并且直接以调试模式启动。但是这个项目启动的其实是在本地的一个远程gdb,通过另一个窗口进行调试。 下面有几个关于系统调用的小问题 Looking at the backtrace output, which function called syscall? 显然是usertrap() What is the value of p->trapframe->a7 and what does that value represent? (Hint: look user/initcode.S, the first user program xv6 starts.) 通过提示找到trapframe的地址,在kernel/proc.h中找到a7寄存器对应的偏移地址。 把168换算成16进制 尝试着打印0x87f560a8 这个就是寄存器a7的值。其代表的具体含义通过所给的提示到对应文件中查找之后也是十分的明了。 应该就是系统的调用号。 What was the previous mode that the CPU was in? spp位表示其在什么状态。 通过图示得出,spp在二进制的第8bit. 由图可知8bit是0,所以之前是用户状态 。 System call tracing Attack xv6 这个task主要是利用xv6故意留下的bug然后获取到销毁内存但是保留了脏页的数据。然后通过一些比较hack的手段把字段给找出来。 page组成 上图是一个简化的逻辑页表,下一个实验也会用到,这里理顺一下逻辑有利于分析代码的组成。 上图是地址转化的细节。 页表项(PTE)包含标志位,告诉硬件应该如何使用这些虚拟地址。 这些相关位的定义都在(kernel/riscv.h)中 ...

February 25, 2025 · 1 min · Theme PaperMod

变量

变量的绑定与解构 手动设置可变性 在rust语言中可以手动设置变量的可变性。这是灵活性和安全性的结合。但是这样肯定会在编码的过程中付出更多的思考,但这也是权衡之后做出的选择。 变量绑定 在rust语言中变量和标识符之间是一种绑定关系,直接是所有权的改变。 简单来说任何一块有意义的内存都有所属,而且这个关系是唯一的。 这样就以为这变量和内存之间只能真诚的进行1v1了。 变量可变性 rust语言的变量在默认情况下是不可变的,但是可以通过mut关键字让变量变为可变的。 下面我们进行编码进行实践操作 fn main() { let x = 5; println!("The value of x is: {}", x); x = 6; println!("The value of x is: {}", x); } 我们可以预想的到这样的代码会报错 由于我们对x发生了两次赋值。我们遵循报错给出的建议,使用mut对变量进行修饰。 这样由于显示的规定变量是否可以被修改,在多线程的编程过程中能让我们少死很多脑细胞,对程序员也是一种保护。 let mut x=5; println!("the value of x is:{}",x); x=6; println!("the value of x is:{}",x); 这次非常的顺利运行结果没有任何问题。 使用下划线忽略未使用的变量 在日常编程的过程中经常会发出“变量从未使用”的警告,如果此时你正在设计一个项目,你可能会拥有很多的未使用的变量。此时你可以使用下划线作为变量的开头,屏蔽警告。 fn main() { let _x = 5; let y = 10; } 这样的话就不会对未使用的变形进行警告了。 ...

February 3, 2025 · 1 min · Theme PaperMod

虚拟化--进程管理API:fork, execve, exit

操作系统上的进程 背景回顾:有关状态机、并发和中断的讨论给我们真正理解操作系统奠定了基础,现在我们正式进入操作系统和应用程序的 “边界” 了。让我们把视角回到单线程应用程序,即 “执行计算指令和系统调用指令的状态机”,开始对操作系统和进程的讨论。 本讲内容:操作系统上的进程 操作系统上的第一个进程 UNIX/Linux 进程管理 API: fork, execve, exit fork() 理解 fork(): fork() 会完整复制状态机;新创建的状态机返回值为 0,执行 fork() 的进程会返回子进程的进程号。同时,操作系统中的进程是并行执行的。程序的精确行为并不显然——model checker 可以帮助我们理解它。 在这个例子中,我们还发现执行 ./a.out 打印的行数和 ./a.out | wc -l 得到的行数不同。根据 “机器永远是对的” 的原则,我们可以通过提出假设 (libc 缓冲区影响) 求证、对比 strace 系统调用序列等方式,最终理解背后的原因。标准输入输出的缓冲控制可以通过 setbuf(3) 和 stdbuf(1) 实现。 execve() exit()

February 2, 2025 · 1 min · Theme PaperMod