Skip to content

Commit

Permalink
cmt
Browse files Browse the repository at this point in the history
  • Loading branch information
unknown committed Apr 18, 2019
1 parent 21bc6be commit 7dccfa6
Show file tree
Hide file tree
Showing 11 changed files with 472 additions and 3 deletions.
1 change: 1 addition & 0 deletions 大三下/操作系统/exam/readme.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
所有考卷在 http://os.cs.tsinghua.edu.cn/oscourse/ 上都能找到
158 changes: 158 additions & 0 deletions 大三下/操作系统/exam/期中/2014ans.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
1.
a)4
b)4096

2.
a)T
处理完异常后回不到触发异常处
b)T
无法正确切换堆栈
c)F

d)T
恢复不到正常运行状态
e)F


3. B

4. ???
A->1 A->1 无变化
缺页异常 缺页异常 无变化
缺页异常 缺页异常 无变化 无变化
缺页异常 缺页异常 无变化



1)
a)管理一个内核线程的线程控制块数据结构为proc_struct
bcd)pid kstack mm cr3

2)
a)不会
b)是

3)

4)
不需要
需要
不需要
需要

在fork之后exec之前两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,
也就是说,两者的虚拟空间不同,但其对应的物理空间是同一个。
当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间,
如果不是因为exec,内核会给子进程的数据段、堆栈段分配相应的物理空间(至此两者有各自的进程空间,互不影响),
而代码段继续共享父进程的物理空间(两者的代码完全相同)。而如果是因为exec,由于两者执行的代码不同,子进程的代码段也会分配单独的物理空间。

在网上看到还有个细节问题就是,fork之后内核会通过将子进程放在队列的前面,以让子进程先执行,以免父进程执行导致写时复制,而后子进程执行exec系统调用,因无意义的复制而造成效率的下降。

1)
位于磁盘第一个扇区不超过512

MBR特征:

启动代码446字节: 检查分区表正确性,加载并跳转到磁盘上的引导程序

硬盘分区表:64字节,描述分区状态和位置,每个分区描述信息占据16字节

结束标志字:2字节(55AA),主引导记录的有效标志

2)
bootasm.S第16行cli

61行

使得80386的全部32根地址线有效,可寻址高达4G字节的线性地址空间和物理地址空间

3)
语句((void (*)(void))(ELFHDR->e_entry & 0xFFFFFF))();
跳转至ELF header中存储的ucore入口地址

(1)
功能:
fork() 创建一个继承的子进程,复制父进程的所有变量和内存,复制父进程的所有CPU寄存器(有一个寄存器例外)

调用接口

子进程的fork()返回0,父进程的fork()返回子进程标识符
无参数
(2)



(1)
函数调用: 返回地址压栈,跳转至函数入口
返回指令: 弹出栈顶并跳转至该值
(2)
记有n个参数:arg1...argn
argn,arg(n-1),...,arg1依次压入栈

(3)

void print_stackframe(void) {
uint32_t ebp = read_ebp();
uint32_t eip = read_eip();

for (int i = 0; i < STACKFRAME_DEPTH && ebp; ++ i) {
cprintf("ebp:0x%08x eip:0x%08x args:", ebp, eip);

for (int j = 0; j < 4; ++ j) {
cprintf("0x%08x ", ((uint32_t *)ebp+2)[j]);
}

cprintf("\n");
print_debuginfo(eip - 1);
eip = ((uint32_t *)ebp)[1];
ebp = ((uint32_t *)ebp)[0];
}
}





1)
硬件中断: 来自硬件设备的处理请求
软件中断: int指令触发的中断
系统调用:应用程序主动向操作系统发出的服务请求

2)
硬件将(SS,EFLAGS),CS,EIP,CS中断号压栈,切换堆栈,跳转到中断服务例程

软件:
关中断
保存断点,保护现场(通用寄存器,ds,es,fs,gs)
开中断
执行中断服务程序
关中断
恢复断点,恢复现场
开中断
返回断点

硬件将(SS,EFLAGS),CS,EIP,CS,中断号出栈

硬件 宿主机 虚拟机







001D1A70 55 push ebp
001D1A71 8B EC mov ebp,esp
001D1A73 81 EC CC 00 00 00 sub esp,0CCh
001D1A79 53 push ebx
001D1A7A 56 push esi
001D1A7B 57 push edi
001D1A7C 8D BD 34 FF FF FF lea edi,[e
....
80 changes: 80 additions & 0 deletions 大三下/操作系统/exam/期中/2016ans.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
#16

by 杨乐

## 1.判断

1. F,会被init收养
2. T
3. F
4. F,还是会有,参见15年的题目
5. T
6. T
7. T
8. F,访问TLB也可以吧
9. F
10. T

## 2.填空

11. 逻辑、线性、物理、逻辑、线性
12. 时间、空间
13. 运行、就绪、等待、就绪、等待、等待、运行、等待、结束
14. CPL、DPL、RPL、CPL、RPL、DPL、CPL、DPL、RPL、DPL

## 3. 问答

15. 1)不再简述

2)Buddy System采用best-fit方法。
```
a. [A=256][256][512]
b. [A=256][B=128][128][512]
c. [A=256][B=128][C=64][64][512]
d. [A=256][B=128][C=64][64][D=256][256]
e. [A=256][128][C=64][64][D=256][256]
f. [256][128][C=64][64][D=256][256]
g. [256][E=128][C=64][64][D=256][256]
h. [256][E=128][128][D=256][256]
i. [512][D=256][256]
j. [1M]
```

16.

1) 缺页率页面替换算法属于全局页面替换算法。
工作原理:保持系统一定的缺页率。具体来说,确定一常数T,当两次发生缺页的时间t<=T,则直接置入页面;当t>T,则置出[t-T,t]时间段内未访问过的页面。

2) 缺页5次。
```
2 0 3 2 3 2 1 2 3 5 2
-----------------------------------
0 x x x x x
1 x x x
2 x x x x x x x x x x x
3 x x x x x x x x x
5 x x
P P P P P
t 1 1 1 4 3
```

17.
1)以页划分逻辑与物理空间。提高内存利用效率和管理灵活性。
2)图就大家自己画吧,注意位数。
3)

va: 0xc7384bac
pa: 0x07141bac

pde_idx: 0x31c
pde_ctx: 0x0001f003
pte_idx: 0x384
pte_ctx: 0x07141003

va: 0xcaeded27
pa: 0x07919d27

pde_idx: 0x32b
pde_ctx: 0x0002e003
pte_idx: 0x2de
pte_ctx: 0x07919003
76 changes: 76 additions & 0 deletions 大三下/操作系统/exam/期中/2017ans.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
## 2017zyw

by 张益玮

###

1. x address物理内存地址
2. x frame pointer是为了debug的时候能够trace,没有也行
3. x 不共享寄存器
4. v
5. v
6. x 子进程0 父进程childPID
7. v
8. v
9. x 硬件只设置TLB 页表由操作系统设置
10. x 先段表后页表
11. v
12. x 时钟中断
13. v
14. v 必须有MMU
15. x x86IDT存着段描述符
16. v
17. x 不是一定段页式
18. x 用户态有没有异常处理机制,没有就杀死
19. v
20. v

###

1. CPL \<= DPL\[] & CPL >= DPL\[];MAX(CPL, RPL)\<=DPL\[]
2. 创建;就绪;运行;等待;退出;挂起;等待挂起;就绪挂起

###

1. (1) a.尽可能减少页面的换入换出次数 b.将未来不再访问或者短期内不访问的页面换出

(2) 在页表项中增加访问位,用来记录页面访问情况。页面换入内存时,将访问位初始化为0,访问页面的时候将访问为置为1,缺页时,从指针当前位置开始顺序检查环形链表,访问位为0则置换该页,为1则将访问位置0并将指针移动到下一个页面。

(3) LRU:7 CLOCK:7

(4) LRU、OPT有 CLOCK、FIFO没有

2. (1)不返回,`exit()`,结束进程

(2)1个返回值,`fork()`,用来将一个进程复制为2个进程,子进程的`fork()`返回0,父进程的`fork()`返回子进程的PID

(3)2个返回值,`ssize_t read(int fd, void *buf, size_t count)`,用来从一个文件中读取指定字节数的数据,buf中返回了读取的数据,同时返回了实际读取的字节数

3. (1)虚拟地址为15位,最低5位是页内偏移。从PDBR中获得页目录表的基地址,加上虚拟地址的最高5位得到了对应的1Byte的页目录项地址。该页目录项中的VALID位为1,则将页目录项中的低7位左移5位,得到对应的页表基地址;VALID位为0进行缺页异常处理。该基地址加上虚拟地址的中间5位得到了对应的1Byte的PTE的地址。该PTE中的VALID位为1,则将该页表项的第7位左移5位得到物理页帧号,物理页帧号加上页内偏移就得到了物理地址;VALID位为0进行缺页异常处理。

(2)0x4a10:对应物理页:0xcd0, pde_index:0x12, pde_content:0xa7, pte_index:0x10, pte_content:0xe6

0x1ebe:对应物理页:无(非法), pde_index:0x7, pde_content:0xe8, pte_index:0x15, pte_content:0x7f

0x135c:对应物理页:0x4bc, pde_index:0x4, pde_content:0xe2, pte_index:0x1a, pte_content:0xa5

(3)

```c
char translate(int16 virtualAddr){
int16 offset = virtualAddr&0x1f;
int16 pteIndex = virtualAddr&0x3e0;
int16 pdeIndex = virtualAddr&0x7c00;
char pdeContents = memory[PDBR+pdeIndex];
if(pdeContents&0x80 == 0)
return 0x81;
int16 pageTableBase = (pdeContents&0x7f)<<5;
int16 pteContents = memory[pageTableBase+pteIndex];
if(pteContents&0x80 == 0)
return 0x80;
return (pteContents&0x7f)<<5+offset;
}

```
53 changes: 53 additions & 0 deletions 大三下/操作系统/exam/期中/2018ans.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
## 2018

by 张益玮

###

1. x 页表不切换,使用共享的0xc0000000到0xffffffff内和空间
2. v
3. x 可以
4. v
5. x 时钟中断
6. v
7. x 缺页异常
8. x 同一特权级
9. v
10. v

###

1.1 pwd;gcc;qemu

1.2 实;GDT;保护;IDT;门;段

1.3 CR3;4k;4k;4k;CR2

1.4 0;20

1.5 用户;内核;PCB;就绪;等待;运行;就绪挂起;等待挂起

###

3.1 1024;死循环调用fork()被称为fork()炸弹,这会导致进程数以指数级别增加,使有进程数限制的系统无法创建新的进程,而没有进程数限制的系统会死机。会大量占用CPU和内存资源,导致系统进程表饱和。因为fork创建的新进程会不断尝试获取资源,即使关闭一个这样的进程也会马上被同样的进程代替。对于使用了Copy-on-write技术的现代操作系统,由于不立即为子进程分配新的物理空间,内存资源不会被耗尽。

3.2 1. 不需要,因为由用户线程管理库函数来实现,不需要用到内核权限。

2. 不需要,因为线程之间共享地址和文件,线程切换需要保存和恢复的只有PC、栈帧和寄存器和其他的一些PID之类的信息,不需要进入内核态。而进程切换需要访问PCB,所以需要进入内核态。

3. <http://www.it.uu.se/education/course/homepage/os/vt18/module-4/implementing-threads/>

可以,一个用户态线程可以通过显式地调用yield()方法或者隐式地访问被占用的锁而放弃运行机会从而让用户态线层管理库选择一个已经就绪的用户态线程继续运行;也可以由内核态接到时钟中断之后将控制权交给用户态线程管理库,从而实现线程的调度与切换。

3.3 2362h:10+100+100=210ns 1565h:10+100+10^7+10+100=10,000,220ns(替换出第0页) 25A5h:10+100=110ns

​ 123565h

3.4 34位物理地址可以寻址16G的内存空间

​ 实际上是伪二级页表,需要通过控制位判断是PDE还是直接就是PTE,注意小端

​ 0x3A69A4D2:VPN[1]=0xE9 VPN[0]=0x29A offset=0x4D2 PDE index=0x900003A4 PDE contents=0x28000001 观察控制位,是valid,并且是PDE 则PTE index=0xA0000A68 PTE contents=0x37AB6C09 观察控制位,是valid,并且类型是execute-only page 物理地址是0xDEADB4D2

​ 0x3A8EB00C:VPN[1]=0xEA VPN[0]=0xEB offset=0xC PDE index=0x900003A8 PDE contents=0x3EB0000F 观察控制位,是valid,并且类型是Read-write-excute page 物理地址是0xFACEB00C
(这里需要注意的是,因为在一级页表就找到了对应的物理页,所以VPN[0]=0xEB也需要算入offset当中)
Loading

0 comments on commit 7dccfa6

Please sign in to comment.