Kaiyun(中国)开云·官方网站

开云 开云体育平台《深入理解计算机系统》这本书需要什么水平能看懂? | 开云(Kaiyun.com)
× 快速导航
新闻资讯
分类
开云 开云体育平台《深入理解计算机系统》这本书需要什么水平能看懂?
发布日期:2023-10-05 12:05:57

  我从大一之初就接触了这本书,那个时候觉得它相当棒,能看的出来是一本好书,但是我阅读的速度真的很慢。读的过程可谓是充满了绝望,因为我不知道自己什么时候才能把它读完。但是我一直也没有放弃读完它的想法。学校里不开这门课,但是当我学完了很多计算机课程后,我发现能把它读完了。读完后我很舒服,觉得自己成长了。后来反过头来去看,其实中文版翻译的不是很好,为了领悟得更透彻,我基本上还是利用电子词典翻看了英文版的大部分。

  这本书即讲了硬件也讲了软件,算是把两者很好地融合在了一起,这是本书对于绝大多数读者来说最惊艳的地方。其实就我的口味而言,我先是更关注硬件,因为这是基础,先把硬件搞明白了,才能做好软件的优化。如果让我建议的话,先把硬件的看明白,看的透透的。多看、多读几遍。

  读不完,读不懂,没关系,完全可以暂时放一放。这不是一本一下子就能完全读懂读透的书,希望你不断地学习,不断的去读。这样或许是读这本书的最好状态。

  说实话,有时我觉得读书这东西充满了悖论,懂的东西你不用去读,不懂的东西才需要去读,但是不懂的话能读的明白吗?特别是有些东西是超越生活实践经验的,在平时你可能根本接触不到CPU、内存等等这些的构造,你编起程序来也根本从不用考虑编译器是怎么工作的,但是现在突然要告诉你这些东西的原理、构造,很难想象,也很难接受,这些都正常。不过说实话,以我的经验来看,越是难以读懂的书,恰恰正是说明你知识的短板,读懂后回报很大,所以加油。

  人的提高,把不懂的书读懂就是一个很重要的途径,有时甚至是唯一的途径,这是读书的中心所在,也是你思考的所在,祝好。

  开云体育 开云官网

  配合我之前写的一系列日志应该可以比较轻松读下去 -【读薄 CSAPP】零 系列概览

  我看深入理解计算机系统时,找到了cousera上南京大学的计算机系统基础课程,发现基本就是CSAPP的内容,讲解的非常通俗易懂,看书不明白的地方,看视频就懂了!强烈推荐!!!!!!!

  所有书中和手册中不理解的概念或者原理,在书中具体代码的实际验证操作中都可以找到可以观测的答案。

  听南京大学计算机系统和操作系统MOOC课,并将本书作为学习计算机专业一个学习索引,同时做南京大学的计算机系统和操作系统实验。

  本书包含:汇编语言设计,到组成原理,最后到操作系统,围绕程序的编译链接加载运行将几门课关联贯穿的有机组成在一起。

  C语言源程序,经过编译汇编链接变成ELF(可重定位文件--可执行目标文件),在硬盘中经过加载器进入内存变成为进程。整个过程涉及了编译链接加载,涉及的学科是OS的虚拟内存,组成原理的cpu结构,但是核心概念地址重定位。上述整个过程就是《深入理解计算机系统》的一条主线。

  朋友和我说:计算机学科从创建之初,就打上深深的人为设计的烙印,它是工科,很多没有道理可言。。。

  适用于初学者,属于计算机整个专业学习的第一环。书和相应的cmu213课程构成了讲解机器cpu的工作原理和C语言程序怎么运行起来的---编译链接执行为主线的课程。如果不继续学习操作系统和编译原理,可以这么说,这本书和谭浩强的C语言一样,对于应用编程或者常规程序员毫无用处。

  本书一方面是有很陡的学习曲线,指针原理和使用----机器实现,机器语言-汇编语言没有指针!而是寄存器保存内存的地址;C语言函数调用的汇编是使用栈,中断处理和异常处理--int或者ecall指令实现,内存管理 ----页表和MMU翻译,进程的地址空间和虚拟内存;都是平常写java之类高级语言感知不到的,学的时候不知所云,平时也用不到摸不着。

  同时,书的阅读过程中需要得系统思维:有两章比较难理解:链接和虚拟内存,书讲解的都是一个个知识点,但是最终都形成了一个完整的实用系统,需要系统性思维方式的阅读;其次,在书中,要区分,内核和应用程序,硬件与os的工作,同时也要思考他们的合作,这个特别是在虚拟内存章节中表现。

  另一方面本书中很多原理例如中断,地址转换,fork的实现都high level的讲解。如果不读操作系统源码,无法感知-----很多机制和数据结构都是对用户程序透明的。

  最后还有一个就是这本书和《编译原理》的关系,你可以将链接部分往前到机器语言部分以及优化,都看做是编译器的后端,书中三个不容易理解的地方就特别好思考:汇编:函数调用—栈式计算机;链接—构建符号表和构建ELF文件格式;多线程—非确定性状态机。南京大学计算机系统基础实验要求写的模拟器nemu本质属于编译原理里一种通用程序,或者是机器指令解释器。

  linux 源码:gcc手册,ld手册 ,更深入的学习当然是阅读手册和完成实验。

  程序怎么运行起来的?这本书的目标显然没有达到,因为太多的概念与原理都是high level的讲解

  C语言是一门很难的编程语言,不懂编译原理、操作系统和计算机体系结构根本不可能学明白;编译器、链接器和C语言的语法有密切的关系,不了解编译器、链接器的工作原理,也不可能真正掌握C的语法。

  真正的能够讲解程序运行本质的必须结合操作系统的源码和intel手册的书并听老师讲解原理最后动手实践才能完全理解,如果在时间有限的情况下,推荐阅读

  链接:ELF文件格式;shell的实现,动态内存分配,web服务器的实现,虚拟地址的地址转换等等很全面,对于初学者平时无感知,具体到系统编程又极端重要的点

  缺少了系统级的cpu寄存器和指令的讲解,特别是段寄存器,CR0-CR3,等等,特权指令:int,iret指令的讲解;需要去阅读i386 intel手册

  对于初学者而言,完全头晕的一段,因为平时只是写程序,编译链接由自动完成,是无感知的;

  书中ELF文件布局的概念讲解的缺少了,其实,elf文件的布局是为了让loader找到起始地址和代码的位置:

  缺少了ld脚本的讲解-----做os必备的一个技能包,这个才将链接的本质讲出来合并和重定位的概念讲清楚

  其最主要的信息是告诉链接器各输入文件的各section应该怎么组合:应该从哪个地址开始放,各个section以什么顺序放,分别怎么对齐等等,最终组成输出文件的各section。除此之外,linker script还可以定义各种符号(如.text、.data、.bss等),形成最终生成的一堆符号的列表(符号表),每个符号包含了符号名字,符号所引用的内存地址,以及其他一些属性信息。符号实际上就是一个地址的符号表示,其本身不占用的程序运行的内存空间。

  使用high level的语言,根本无法理解,关键的是缺少了手册的系统级编程指令和寄存器,缺少了软中断的指令int

  只是知道现象,为什么子进程返回值是零,从运行结果和概念本身是不能理解的,这个需要读源码

  开云体育 开云官网

  讲解了内核的管理内存的一堆数据结构,这个需要阅读linux源码去学,要不一脸懵,因为平时使用根本看不到也用不到这些内核数据结构--无法感知的,所以,mmap写了如何,但是还是无法理解。可以看看

  但是,你把这本书的遇到的问题,结合操作系统学习,你就能发现这本书提供了你一个学习操作系统和其他学科的一个基础。

  学语言是不够的,学这本书也是不够的,更要学习操作系统,编译原理,组成结构。。。

  从图灵机—状态机的角度思考程序怎么运行的示意图—可以参考蒋炎岩老师的B站视屏和相关讲义去学习。

  而我自己在大二之前就看过了,可以说这本书重点章节我看了两三遍,实验也做了,还算有一点经验。

  如果你都还不太具备,那么我建议你先把我之前组织的《C语言训练营》里进阶部分内容学习完,再来看,这样效果会更好。

  深入理解计算机这本书看了两遍以上,每次看都有新收获,我多次推荐给了小伙伴们,但是很多读者反映看不太懂,今天聊聊该如何阅读这本书吧:

  这次我在我的知识星球里也组织了「CSAPP共读」活动,并且给大家分享了以下该如何去看这本书,这里也给各位知乎的小伙伴分享下:

  大二时,在上一些无聊的课时,我总把这本书带着,每节课可能会翻个几页,那时候看到里面的汇编、内存管理、存储器层次我是真的云里雾里,因为还没学操作系统,C 语言也学得很差。

  如果你都还不太具备,那么我建议你先把我之前组织的《C语言训练营》里进阶部分内容学习完,再来看,这样效果会更好。

  如果你看过以下书籍,那么看 csapp 的难度会低很多(画外音:最好先去看下)

  强烈推荐:南京大学袁春风老师的 计算机系统基础课(一、二、三、四),这个是视频课程

  同时也可以去B站搜索 CMU 大学老师讲的,不过似乎是机翻,大家自己去B站搜索即可

  南大袁春风老师的课程基本可以看做是以这不本书为蓝本的,强烈推荐大家去看下:

  看视频和看书一定要结合着来,最近整理了一份「深入理解计算机系统从零进阶」的一整套书籍,这是我看完的,包括csapp、汇编语言、南大计算机基础课件等

  对于想深入理解计算机的同学帮助非常大,且十分系统,最难得的是还是全彩和带书签的,真的很棒:

  网上也有非常多的题解,可以说这几个lab是这本书的精华,如果只看书,大概能学到四成,看书+ 做lab 才可能学到七八成。

  所以大家一定要去完成lab,而且这些lab都是非常有趣的,比如拆炸弹、缓冲区溢出攻击、代理服务器等。

  第二章是关于二进制的,这部分内容会在数字逻辑这类课里学到,都比较熟悉,但是csapp里确实我见过关于进制讲得最透彻的书,不像其它书都是一句线。

  这章的里有不少关于二进制的技巧,做一遍作业对于二进制的各种操作绝对会比较熟悉,最经典的就是不用临时变量交换两个数。

  链接这部分内容篇幅不多,原理上讲的很简洁,文件节和符号解析表只是给出了几个图示,并没有过多的关注其实现,链接相关可以看看《程序员自我修养》

  比较有特色的是讲解了 C 语言中的一些语法,类似 for、switch、函数调用在汇编层是如何做的。

  这本书是在大一逛知乎听大佬们说起的,大一暑假有大四学长学姐在学校广场摆摊卖书,我也买了些,其中有一本就是被称为计算机专业神书的 CSAPP。

  大二时,在上一些无聊的课时,我总把这本书带着,每节课可能会翻个几页,那时候看到里面的汇编、内存管理、存储器层次我是真的云里雾里,因为还没学操作系统,C 语言也学得很差。

  所以断断续续的看了几章,说不上学到了什么,但让我对这种枯燥的基础知识第一次产生了兴趣,有一种想彻底搞懂它们的想法。

  后来在知乎大佬的指引下,为了看懂这本书,去看了王爽那本《汇编语言》,在下图。

  重学了 C 语言(主要是指针和内存),由于已经学了汇编,指针对我再也不是问题了,同时看完了《C和指针》、《C专家编程》、《C陷阱与缺陷》,对 C 语言使用得也愈加的熟练。

  (csapp放在最上面了,不过这些书在我毕业的时候大部分都卖了,不好带走)

  同时,在大二、大三上陆续学习了操作系统、计算机组成原理、数字逻辑等,其实熟悉的同学就知道,这已经涵盖了csapp书里的绝大部分内容。

  值得一提的是,大三我们学院有门 System Programing 的课,教材就是使用的 CSAPP,因此我之前大二草草看完的书,得以再次翻开,这一次我把附带的是个实验也挨着挨着做了,收获良多,有位运算各种奇技淫巧,有 Bomb lab 刺激的打怪通关、也知道了buffer overflow attack.... 还有实现基本的内存管理等等。

  印象最深的便是做 bomb lab,一个个 phase 的通过真的很让人兴奋,我几乎是熬夜连着把这几个 phase 过掉的,当然头发也没少掉。

  Malloc Lab:实现一个类似C语言的malloc函数,主要学习内存管理

  Attack Lab:缓存区溢出攻击,主要学习Linux下函数调用过程和堆栈等

  读一本书,尤其是专业技术类,决定你能否看下去的一个重要因素就是你是否具备前置知识。

  那这本书的前置知识,我认为你需要具备一些 C 语言知识、以及系统知识,比如 Unix、Linux基本操作,有 C 语言背景最好,如果完全没学过 C 的话,那么前几章看起来会比较吃力。

  第一种是学习过操作系统、计算机组成等,所以看起来应该不存在很大的难度,从头到尾一章章啃,看完一章一定要做一些课后的作业和配套的lab,lab可以算这本书的精华之一了。

  开云体育 开云官网

  第二种是按需学习,之前说过,这本书涵盖了计算机学科主要的知识,将整个线串起来了,所以在这里面你能找到链接&加载,也能找到内存管理、还有语言的机器级表示汇编等,所以当你学习内存管理时你就去看看第九章虚拟内纯,学到C&C++编译链接时,可以去看看第七章链接,学习到存储的时候,可以去看看第六章存储器层次结构。 是的,每一章都是比较独立的,因此你完全可以跳着挑自己感兴趣的去学习开云 开云体育平台开云 开云体育平台