• 鹏 置顶
    2019-10-25
    宫老师讲的真好!一直以来,都有一种强烈的信念!要学编译原理,要学这种在日新月异的信息技术领域里“亘古不变”的技术原理,以不变应万变。上半年学习了极客时间出的“深入浅出计算机组成原理”,在这一节正好排上用场,对程序运行时机制有了更深入的理解。

    作者回复: 对的。
    计算机的组成原理、编译器的基本架构等等内容,其实半个世纪也没有太大的变化,是比较稳定的。并且,真正做一些深入的工作的时候,这些知识仍然非常有价值。

    
     3
  • Gopher
    2019-10-09
    写的真好,一下子就听懂了( ̄∀ ̄)

    内存布局:
    指令数据,分而治之;
    自下而上,由静至动;
    栉比鳞次,序从中来。
    展开

    作者回复: 你不光代码写得好,文采也很好。
    新东方的三驾马车之一的王强说到,好的代码就像诗歌一样优美。写完代码要站在远处欣赏一下 :-)

    
     6
  • 曾经瘦过
    2019-10-09
    使用的java 语言。java是运行在jvm虚拟机里面的,是便以为jvm所需的机器码 基本的过程和这个是差不多的。看了这一篇专栏之后 发现基础知识的用处真的很多,操作系统 组成原理 用处真多。

    作者回复: 对呀。既然学计算机嘛,就搞到根本上去,心里会比较踏实。而且说实话,基础原理并不多,也不易变。反倒上层各种类库、框架,层出不穷,天天更新。这两头哪边学起来更辛苦,真不一定!

    
     2
  • 刘強
    2019-11-05
    文章里说操作系统还会自动维护栈。
    但我觉得栈的维护是有程序或者编译器来维护的。操作系统只是给程序(进程)分配了栈的起始地址而已,剩下的进栈和出栈操作,都是预先编译好的push和pop指令来完成的。不知理解的对不对。

    作者回复: 栈这个东西,如果深入看一下,其实涉及得还挺多的。

    操作系统的介入,主要原因是内存管理。因为你的程序所使用的内存,并不是物理内存,都是虚拟出来的。在你使用栈的时候,操作系统要帮你把逻辑的内存映射到物理的内存上去。只不过这个过程对程序是透明的。是CPU和操作系统之间协作完成的。

    具体细节是:当你push一个新的变量到栈里的时候,如果超出了当前可用的物理内存,CPU会产生一个page fault(缺页错误),操作系统这个时候介入,调度一页新的物理内存过来。

    你可以查看Intel的手册,看看push指令的说明,里面有介绍。关于page fault,你可以参考https://en.wikipedia.org/wiki/Page_fault

    当然,如果你的程序直接运行在裸机上,没有使用操作系统,那就没有操作系统什么事了。直接在裸机上编程叫做bare metal programming,在有些领域很有用。

    总结起来,栈的管理,与CPU、内存和你的代码都有关。

     1
     1
  • 唔多志
    2020-01-08
    太赞了,老师一文道破计算机专业本科生四年需要学的 70% 专业领域的知识,底层知识扎实很重要。
    
    
  • 风
    2019-10-19
    怎么没提push和pop呢

    作者回复: 在22讲,汇编语言的部分就有。

    
    
  • d
    2019-10-10
    有些汇编的语法和上面的是反着的,比如 指令:寄存器 ,源操作数/地址

    作者回复: 是的。我们用的都是GNU汇编的语法。第22讲正式讲汇编的时候特别做了说明。看看是不是在21讲提到汇编时也注释一下。

    
    
我们在线,来聊聊吧