rCore Lab-1
实验一: 中断
实验题:
1.原理:在rust_main函数中,执行ebreak命令后至函数结束前,sp寄存器的值是怎样变化的?
在rust_main函数中执行ebreak进入中断,首先需要在栈上开辟Context所需空间,即将栈顶(即sp寄存器)减去 34*8 bits。随后在__restore中恢复了sp寄存器中位置。
2.分析:如果去掉 rust_main 后的 panic 会发生什么,为什么?
去掉rust_main后的panic后程序将不会立刻返回。执行ebreak函数后进入到interrupt_handler函数中,判断为断点后进入breakpoint函数进行处理,在breakpoint函数中打印出断点位置并将sepc寄存器+2后返回,调用__restore函数恢复所有寄存器,并跳转至Context中sepc的位置上,即会回到entry.asm中,此时entry.asm函数后并未做任何处理。
3.实验:
I. 如果程序访问不存在的地址,会得到 Exception::LoadFault。模仿捕获 ebreak 和时钟中断的方法,捕获 LoadFault(之后 panic ...
一个关于C语言内存分配的误区
起源
事情是这样的,我在编写一段Unicode解析的代码时,需要先判断输入的Unicode后面从’\u’后是否为4位16进制数,如果是的话,就将这几位复制到一段字符串中并进行解析,如果不是的话则抛出异常。
这段代码如下:
123456789char *high = NULL, *low = NULL; p = charcpy(p, high); if(!p)return NULL; if(*p == '\\'){ p++; p = charcpy(p, low); if(!p)return NULL; }
其中,charcpy函数的代码如下:
1234567891011121314151617static const char* charcpy(const char* p, char* target){ target = (char *)malloc(5 * sizeof(char)); int len; for(len = 0; len < 4; len++ ...
xv6 Bigger Files
Introduction
In this assignment you’ll increase the maximum size of an xv6 file. Currently xv6 files are limited to 140 sectors, or 71,680 bytes. This limit comes from the fact that an xv6 inode contains 12 “direct” block numbers and one “singly-indirect” block number, which refers to a block that holds up to 128 more block numbers, for a total of 12+128=140. You’ll change the xv6 file system code to support a “doubly-indirect” block in each inode, containing 128 addresses of singly-indirect bl ...
xv6 System Call
Part One: System call tracing
Introduction:
Your first task is to modify the xv6 kernel to print out a line for each system call invocation. It is enough to print the name of the system call and the return value; you don’t need to print the system call arguments.
When you’re done, you should see output like this when booting xv6:
1234567...fork -> 2exec -> 0open -> 3close -> 0write -> 1write -> 1
That’s init forking and execing sh, sh making sure only two file descriptors are ...
我为什么讨厌考试
为什么我讨厌考试?这似乎是一句吃不到葡萄说葡萄酸的话,说这句话的人,大多数会被认为是懒惰的,因为他们对待学习不努力以及不思进取所以才会抱怨考试无聊,表示自己其实有学习的能力,只不过不愿意学罢了。在我上大学之前,我也是这么认为的。作为一名中流985大学的学生,我甚至可以说我是考试的受益者,毕竟我也是通过高考选拔上来的。
然而,上了大学,我发现一切都变了,大部分的考试变得无趣又无意义,甚至许多课程本身就毫无意义可言,一门毫无意义的课程,却占着很高的学分,毕业和保研的命脉掌握在它们的手中,你不去学就意味着你就冒着挂科的风险,一旦有一门挂科,就意味着大部分的评奖评优和保研完全没戏了。
虽然一直对大学的课程不太满意,但真正使我决定写下这篇文章的是在我复习《算法设计与分析》这门课的时候。作为一门实践性很强的科目,上课的时候居然连一些实践的作业都没有,唯一的实践机会是在小组组队实现算法的时候。而在我复习的时候在做往年试卷的时候,其中有一道题是,用两种状态空间树的方法来表示回溯法和分支限界法的解空间,我当时是极其愤怒的,这种题目,不就像是孔乙己在问别人,茴字的写法有几种吗?像这种无聊又无用的题目在不同 ...
NEMU PA3
段描述符:
1.CR0寄存器(control register 0): PE位。计算机可以决定自己留在哪个世界
2.GDT(Global Descriptor Table, 全局描述符表), 数组的一个元素就是一个段描述符。这样一来就可以通过下标索引的方法来找到所有的段描述符。于是在 80386 的世界里, 原来的段寄存器就用来存放段描述符的索引, 另外还包含了一些属性, 这样的一个结构叫段选择符(Selector)
3.在 80386 中引入一个寄存器 GDTR, 专门用来存放 GDT 的首地址和长度。需要注意的是, 这个首地址是线性地址, 使用这个地址的时候不需要再次经过分段机制的地址转换。最后 80386 和操作系统约定, 让操作系统事先把GDT 准备好, 然后通过一条特殊的指令把 GDT 的首地址和长度装载到 GDTR 中, 计算机就可以开启上述的分段机制了。
4.在段描述符中含有一个 DPL 域(Descriptor Privilege Level), 它描述了一个段所在的特权级。
5.在段选择符中含有一个 RPL 域(Requestor’s Privilege Level ...
LeetCode307-区域和检索
Description
给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。
update(i, val) 函数可以通过将下标为 i 的数值更新为 val,从而对数列进行修改。
Examples
12345Given nums = [1, 3, 5]sumRange(0, 2) -> 9update(1, 2)sumRange(0, 2) -> 8
Thought
Segement Tree(线段树)
一颗线段树的构造就是根据区间的性质的来构造的, 如下是一棵区间[0, 3]的线段树,每个[start, end]都是一个二叉树中的节点。
graph TD;
A["[0,3]"] --> B["[0,1]"];
A["[0,3]"] --> C["[2,3]"];
B --> D["[0,0]"];
B --> E["[1,1]"];
C --> F["[2,2]"];
C --> G["[3,3]"];
区间划分大概就是上述的区间划分。可以看出每次都将区间的长度一分为二,数列长度 ...
LeetCode416-分割等和子集
Description
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
Examples
12345输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11].
12345输入: [1, 2, 3, 5]输出: false解释: 数组不能分割成两个元素和相等的子集.
Thought
由于所给数组的规模不确定,所要分成的数组的规模的大小,所以不能使用循环嵌套的方法遍历所有可能性,即不能在多项式时间内解决(NP问题)。如果使用贪心则只能求得局部最优解而不能取得全局的解。因此此题需要使用记忆性搜索或者动态规划的方法来解决。
考虑到对于任意一个数我们都有选择或者不选这两种选择,因为我们可以开一个二维数组dp[n][target+1],其中n表示nums数组中的数据大小。target表示将nums数组中的数据进行累计求和后得到的和sum2\frac{sum}{2}2sum,对于数组中的任意位置dp[i][j],表示的是当选择到第i个数的时候是否可以达到j的值。
在进行动态规划之前我们应当去考虑 ...
NEMU
Get Started 起步
Description 描述
PA讲述的是一个"先驱创造计算机"的故事。
本实践课程所要设计的“NEMU”一款经过简化的 x86 全系统模拟器。
PA0
寄存器结构体
在框架的源码中,为了考察我们寄存器的结构,作者故意地使用了错误的数据结构来描述寄存器。使用结构体来描述寄存器的内部结构,会错误地计算寄存器的地址空间。因此我们首先需要将结构体改为联合体来描述寄存器的地址。
在include\cpu\reg.h文件里修改寄存器的描述
123456789101112131415161718typedef struct { union { union{ uint32_t _32; uint16_t _16; uint8_t _8[2]; }gpr[8]; struct { uint32_t eax, ecx, edx, ebx, esp, ebp, esi, edi; }; }; //store swaddr_t eip;} ...
魏晋之际的政治格局简论
关于东晋之际的门阀政治体系,被视为变态、畸形发展的政治体系,但其出现并非空穴来风。
其一,东汉末年,士人清议之风盛起,出现了匹夫抗愤,处士横议的局面,士人之间互相品题、共相标榜成为一时风气,普通士人一旦为名士所赞赏、品题,便如登龙门,身价倍增,千里求名之举亦不鲜见。尽管汉末党锢之祸对于士人清议进行了严酷镇压,但却加强了士人群体身份的认同,构成汉晋时代“士的觉醒”的重要面向。后来随着一系列事件,此时进入三国鼎立时代。其时曹魏举荐人才的主要方式之一便是名士品评、提携同郡士人,例如当时司马懿曾被同郡河内杨俊、清河崔琰所举荐。通过互相的举荐和品评,可以加强同乡同郡之间的家族关系,并且品评人和被品评人也可以在朝廷中为自己增加政治资源。例如,《三国志.杨俊传》中写道:
黄初三年,车驾至宛,以市不丰乐,发怒收(杨)俊。尚书仆射司马宣王、常侍王象、荀纬请俊,叩头流血,帝不许。俊曰:“吾知罪矣。”遂自杀,众冤痛之。
司马懿、王象、荀纬三人皆为河内人,自然不是一种巧合,体现出同乡官僚在政治上互相支持与提携。其时家族之间的互相品评、联姻,来上升或者加固大族的地位并且由此进行入仕,这无疑可以看做是魏晋时 ...