add a brief conclusion on cod chp1, and update self-mapping in lab2 report.

This commit is contained in:
Shine wOng
2019-11-20 20:11:18 +08:00
parent b107db4c97
commit 84d5cc4b05
3 changed files with 46 additions and 3 deletions

24
cod/chp1.md Normal file
View File

@@ -0,0 +1,24 @@
计算机组成原理第一章知识脉络
=========================
本章讨论的主要内容是数据通路(data path)的设计关键在于如果实现一个ALU。
为了实现一个计算机(computing machine),首要的当然是要能够实现基本的计算功能。而为了实现计算功能,首先需要将数据在计算机中表示,这包括字符型数据,定点数(整数)以及浮点数,这里主要讨论定点数的表示。将定点数在计算机中表示,最简单直白的方法就是直接将它的二进制形式存储在计算机中,新增一位符号位来表示它的正负,这就是原码表示法。然而原码表示法具有一些致命性的缺陷,比如原码的计算不服从加法性质;为了构造一种复合加法性质的表示法,就产生了反码。反码的确是可以进行加法和减法运算的,但是在反码表示法下,`0`将具有两种反码表示,可以将反码简单加`1`来规避这种情况,这就是补码表示法。现代计算机中数据的存储几乎都是采用补码。
成功将数据在计算机中表示后,紧接着就需要讨论如何实现计算的问题。首先是最简单的加法运算,可以首先构造一个一位的全加器,其中加法的结果`S`和进位位`C1`都可以表达成两个输入`X, Y`以及上一位的进位`C0`的简单组合逻辑;通过将多个这样一位的全加器组合起来,就可以形成多位的全加器。然而,这样的全加器在计算的效率上存在缺陷,因为每一位必须等到前一位的进位计算完毕之后才可以开始计算,为了改进改进这种缺陷,产生了`超前进位`的策略,实际中采用的是分组的超前进位。
利用补码的运算法则,可以方便地通过全加器实现减法运算。由于
```
(x - y)补 = (x)补 + (-y)补
```
因此可以通过求被减数的相反数的补码,将减法转化成加法来进行。为此,只需要将被减数逐位取反再加一,再添加一些控制逻辑即可。
乘法和除法的实现则稍显复杂。对于乘法,是通过多次的加法和移位操作来实现的。乘法器的设计具有三个版本,需要把握三个版本的不同,以及优化的思想。而补码的乘法,是通过`布斯算法`来实现的。除法的逻辑电路和乘法几乎相同,只是在一些细节上有所改变,除法的实现主要有`恢复余数法``加减交替法`两种方法,后者是前者的一种改进策略,其正确性要能够证明。补码的除法的运行算法也有有所了解。
实现了基本的算术运算与逻辑运算就可以着手进行ALU的搭建。构造ALU的方法与前面的加法器是类似的首先建立一位的ALU确立其输入与输出以及必要的控制信号通过算术逻辑给出真值表从而搭建起组合逻辑电路。将多个一位的ALU组合起来即可得到多位的ALU了。
最后讨论浮点数的表示与运算。浮点数的表示分为两个部分即阶码与尾数两个部分都有自己的符号位。浮点数的表示遵循IEEE754标准为了理解这个标准关键在于各个部分的位数以及它们的位置以及相应的表示方法比如阶码采用移码表示而尾数则采用原码并且省略了规范后首位的`1`。此外IEEE754还保留了两个部分一些特殊的值来表示一些特殊情况比如`0`的表示,无穷的表示,`NaN`的表示以及非规范化浮点数的表示。此外,浮点数的加减法与乘除法的实现,也需要有一定的了解,比方说由于浮点数本身的特点,浮点加法并不满足结合律,两个浮点数之间也不能判等。
最后的最后还有一些内容,(我觉得和计算机组成真的没有什么关系),是检错纠错码。这里主要是讨论了两种检错纠错码,即奇偶检验码和汉明校验码,两种的编码方式都要非常熟悉。对于汉明校验码,其关键在于理解数据数位`k`和检验数位`r`之间满足的两个不等式关系。这里还需要把握码距的概念。

View File

@@ -258,7 +258,7 @@ page_init(void) {
* | Free Memory (*) |
* | |
* freemem -------------> +---------------------------------+
* | Struct Page *pages |
* | Struct Page *pages |
* pages ---------------> +---------------------------------+
* | Invalid Memory (*) |
* end kern ------------> +---------------------------------+
@@ -613,4 +613,22 @@ boot_pgdir[0] = boot_pgdir[PDX(KERNBASE)];
## 自映射机制
可以查看实验指导书吧,我不想写了......还是非常巧妙的,值得一看。
自映射机制的思想是为了使操作系统(和用户程序)方便快捷地查看当前的页目录表项以及页表项。为了查看页目录表和页表的全部内容,一种方法是从页目录表的起始地址,逐个遍历其中的表项,我是觉得这种方法挺好的,但是老师觉得不太行......
为了方便地查看页表中的所有页表项,可以人为设定一个虚拟地址`VPT`其低20位为零并且在页目录表中添加一项将该虚拟地址对应的页表映射为页目录表本身。即
```c
boot_pgdir[PDX(VPT)] = PADDR(boot_pgdir) | PTE_W | PTE_P;
```
这样,整个页目录表成为了该虚拟地址的页表,而全局的页表,则成为了该虚拟地址对应的页帧。这样,通过访问`VPT[n]`,就可以访问全局页表中的第`n`个页表项了。
同理,还可以设置`vpd = PGADDR(PDX(VPT), PDX(VPT), 0)`,这样整个页目录表就成为了虚拟地址`vpd`对应的物理页帧,通过访问`vpd[n]`就可以访问第`n`个页目录表项。
同样的机制也可以用于用户程序当中。比如某个用户程序希望知道自己当前页表的结构,但是页表是由操作系统维护的,此时设置用户虚拟地址`UVPT`,并且将它对应的页表映射到用户程序的页目录表,即
```c
user_pgdir[PDX(UVPT)] = user_pgdir | PTE_P | PTE_U; //no PTE_W
```
用户程序就可以通过虚拟地址`UVPT`访问到它自己的页表项了。需要注意的是,这里不能给`写权限`

View File

@@ -1857,6 +1857,7 @@ Some Words
> (adj)a deductible expense is a cost that you can subtract from the earnings on which you have to pay income tax.</br>
> (n)a part of the cost of an accident, injury etc that you agree to pay yourself when you buy insurance.
- Expenses like office phone bills are tax-deductible.
- Customers can lower insurance premiums by taking higher deductibles.
+ odds
@@ -1902,6 +1903,6 @@ Some Words
> (v)to work hard</br>
> (n)hard work, especially work that makes you feel physically tired.
- People who toiled in dim factores were too exhausted to enjoy their family life.
- People who toiled in dim factories were too exhausted to enjoy their family life.
- Well, after a day's toil in the office I like to relax a little.