期中总结

       如白驹过隙,学期已经过半。

       《深入理解计算机系统》的课程的基础部分已经学完,虽然仅仅短短的半个学期,但也让我受益匪浅。

        在第一章计算机系统漫游中,我们知道了计算机系统是由硬件和软件组成的,它们是共同工作来运行应用程序的。而信息就是位+上下文,程序也能被不同的程序翻译成不同的格式,也让我们知道了编译系统如何工作是大有益处,以及处理器如何读并解释存储在存储器中的指令的。计算机内部的信息被表示为一组组的位,它们根据上下文有不同的解释方式。程序被其他程序翻译成不同的形式,开始时时ASCII文本,然后被编译器和连接器翻译成二进制可执行文件。

       处理器读取并解释存放在主存的二进制的指令。因为计算机把大量的时间用于存储器和I/O设备和CPU寄存器之间复制数据,所以将系统中的存储设备划分为层次结构--CPU寄存器在顶部,接着是多层的硬件高速缓存存储器和DRAM主存和磁盘存储器。

       操作系统的内核也是应用程序和硬件之间。它提供了三个基本的抽象:1.文件是对I/0设备的抽象;2.虚拟存储器是对主存和磁盘的抽象;3.进程是对处理器和主存和I/O设备的抽象。

       这章的最后说了,网络提供了计算机系统之间的通信手段。从特殊的角度来看,网络就是一种I/O设备。

       在第二章信息的表示和处理中,我知道了计算机将信息按位编码,通常组织成字节序列。用不同的编码方式表示整数和实数和字符串。不同的计算机的模型在编码数字和多字节数据中的字节排列时使用不同的约定。

       C语言的设计可以包容多种不同的字长和数字编码的实现。虽然高端机器逐渐开始使用64位字长,但是目前大多数机器还使用着32位字长。

       在相同长度的无符号和有符号的整数之间进行强制类型的转换的时候,大多数C语言实现遵循的原则是底层的位的模式不变。在补码机器上,对于一个W位的值,这种行为是由函数T2Uw和U2Tw来描述的。

      由于编码的长度有限,与传统整数和实数运算相比,计算机运算具有完全不同的属性。

      对于浮点运算,我们必须非常小心的使用浮点运算,因为浮点运算只有有限的范围和精度,而且不遵守普遍的算术属性,比如结合性。

      在第三章程序的机器级表示中,窥视了C语言提供的抽象层下面的东西,以了解机器级编程。通过让编译器产生机器级程序的汇编代码表示,我们了解了编译器以及其优化能力,以及机器,数据类型和指令集。

      机器级程序和它们的汇编代码表示,与C程序的差别很大。在汇编语言中,各种程序类型之间的差别很小。程序是以指令序列来表示的,每条指令都完成一个单独的操作。部分程序的状态,如寄存器和运行时栈,对程序员而言都是显而易见的。

      对于大多数语言和机器组合来说是类似的,C到IA32和X86-64的映射。用 字节代码作为程序的低级表示,优点是相同的代码可以在不同的机器上执行,而本章谈到的代码只能在X86机器上运行。

      在第四章处理器体系结构中,可以看到指令集体系结构,即ISA,在处理器行为(就指令集集合及其编码而言)和如何实现处理器之间提供了一层抽象。ISA提供了程序执行的一种顺序说明,也就是一条指令执行完了,下一条指令才会开始执行。 

      从IA32开始,大大简化数据类型和地址模式和指令编码,我们定义了Y86指令集。得到的ISA既有RISC指令集得属性,也有CISC指令集的属性。然后,将不同组织放到五个阶段中处理。

     流水线化通过让不同的阶段并行操作,改进了系统的吞吐量的性能。

     管理复杂性是个首要问题;我们不需要直接实现ISA,硬件设计人员必须非常谨慎和小心。

     在第六章存储器层次结构中,让我知道了基于存储技术包括随机存储器(RAM)和非易性存储器(ROM)和磁盘。RAM有两种基本类型。静态RAM(SRAM)快一些,但是也贵一些,它既可以用做CPU芯片上的高速缓存,也可以用做芯片下的高速缓存。动态RAM(DRAM)慢一些,也便宜一些,用做主存和图形帧缓冲区。

     一般而言,较快的存储技术每个位的价格会很更高,而且容量较小。这些技术的价格和性能属性正在以显著不同的速度变化着。

     程序员可以通过编写具有良好空间和时间局部性的程序来显著地改进程序的运行时间。利用基于SRAM的高速缓存存储器特别重要。

     在第七章链接中,链接可以在编译时由经他编译器完成,也可以在加载时和运行时由动态链接器来完成。链接器处理可以为目标文件的二进制文件,它有三种不同的形式:可重定位和可执行和共享的。

     链接器的两个主要的任务是符号解析和重定位,符号解析将文件中的每个全局符号都绑定到一个唯一的定义,而重新定位确定每个符号的最终存储器地址,修改对那些目标的引用。

     静态链接是由像GCC这样的编译驱动器调用的。

     多个目标文件可以被绒映射到存储器中,并运行这个程序。

     加载器将可执行文件的内容映射到存储器,并运行这个程序。

     被编译为位置无关代码的共享库可以加载到任何地方,也可以在运行时被多个进程共享。为了加载和链接和访问共享库的函数和数据,应用程序还可以在运行时使用动态的链接器。

     通过《深入理解计算机系统》的课后习题,也使自己很多不足的地方得到了弥补,一些平时的课题检测题也是非常有帮助的,特别是对于自己不会那些习题。

      在第三周的检测题中知道了:Linux中没有C盘,D盘,其文件系统的目录是由(FHS)标准规定好的;                                       

                                          Linux Bash中,cat -n 和 nl 命令功能等价;

                                          Linux Bash中,source 和 . 命令功能等价;

                                           Linux Bash中,使用wc统计hello.c共有几行代码的的命令是( wc -l hello.c);

                                           col 命令的-h参数可以将Tab换成对等数量的空格建。x  , 空格换tab;

      在第四周的检测题中知道了:cheat 填空:To list the content of /path/to/foo.tgz archive using tar ( tar -jtvf /path/to/foo.tgz );

                                          grep 填空:查找宏 STDIN_FILENO 的值的命令是(grep -nr XXX /usr/include);

                                          C语言中,全局变量是强符号。(X);

                                          Linux中,反汇编.text节中的二进制指令使用的工具是(d)A ar B strings C readelf D objdump;

                                          期中总结

                                         

                                      1. 在vi中,查看scanf和printf man pages(帮助文档)的命令分别是?(2分)
                                       K 3K
                                      2. 编译和运行以上代码的命令(2分) 
                                      gcc *.c -o main 
                                      ./main
                                      3. 使用GDB调试以上代码:编译代码的命令是?main.c中如何给main函数设置断点?如何在第六行设置断点?(3分)
                                      gcc -g *.c -o main 
                                      b main 
                                      b 6
                                      4. 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.a静态库?main.c如何使用                                                 mymath.a?(3分)
                                      gcc -c add.c sub.c mul.c div.c
                                      ar rcvs libmymath.a add.o sub.o mul.o div.o
                                      gcc main.c -o main -L. -lmymath (or gcc main.c ./libmymath.a -o main)
                                      5. 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用                                               mymath.so?(4分)
                                      gcc -fPIC -c add.c sub.c mul.c div.c
                                      gcc -shared -o libmymath.so add.o sub.o mul.o div.o
                                      gcc -o main main.c -L. -lmymath
                                      libmymath.so 要拷贝到/lib or /usr/lib
                                     6. 写出编译上面代码的makefile,编译出来的目标文件为testmymath, 只用显式规则就可以.(4分)
                                     testmymath: main.o add.o sub.o mul.o div.o 
                                     gcc main.o add.o sub.o mul.o div.o -o testmymath
                                     main.o: main.c head.h
                                     gcc -c main.c
                                     add.o: add.c head.h
                                     gcc -c add.c
                                     sub.o: sub.c head.h
                                     gcc -c sub.c
                                     mul.o: mul.c head.h
                                     gcc -c mul.c
                                     div.o: div.c head.h
                                     gcc -c div.c

       在第五周的检测中知道了:cheat 填空:使用du命令对当前目录下的目录或文件按大小排序 的命令是( du -sk *| sort -rn );

                                        find: 填空:查找当前目录下2天前被更改过的文件 (find . -mtime +2 -type f -print);

                                        CH04 填空:Y86中对于PC值p=100,指令包括一个寄存器指示符字节和,常数1,增加器产生值(106);

       在第六周的检测中知道了:CH06 判断:EEPROM可以用紫外线进行擦除。(x);

                                        CH06 判断:存储器山中山脊代表空间局部性。(x);

       对于娄老师的课程,个人觉得还是很不错的。这种“健身式”的学习方法,虽然给我造成很大的压力,但是也能驱走我们的惰性,老师就像是教练,不懂的就去问。课余的时间自己去想自己去做,虽然时间上可能是会很占课后时间,但是,我们是一个学生,什么叫学生,就是去学习知识然后去社会上生存。所以对于娄老师的授课方法我觉得很赞同,不懂的课上老师可以点播,课下也可以去办公室找老师,也拉近了学生与老师的距离,而且,娄老师不仅是在授课方面教会了很多,也在课上说一些生活和工作上的道理,总之,让我非常受益匪浅,也非常感谢娄老师的授课。