备战2020校招日记----4.13

0.背景----我太菜了

  • 最近打算全身心投入复习,个人感觉,相比考研来说,不用复习数学英语,只用考虑专业课就行了,而专业课之间是相通的。我比较喜欢这种比较集中的学习。准备投C++后端。
  • 一个人在家,为了防止自己不自觉地懈怠,打算以后每天睡前花半小时“闭卷”写一篇日记发出来,仅仅是一种自我监督,或者说假想的群体监督,不作为技术博客。记录我每一个笨蛋且执着的一天。

1. 今日学习内容

今天主要看了《深入理解计算机系统》中的“程序的机器级表示”的后面几个章节,主要看了过程调用的概念及其实现。

过程调用

过程有很多名字,例如函数、方法、例程等等,实现原理都是类似的。 ----------- 就是栈帧。

栈帧

通过前两天看第一章里面说的,进程是建立在指令集架构和虚拟内存的基础上的,由于我现在对于进程还没有较为具体准确的认知,我暂且认为进程和过程是一样的。
那么过程就是建立在指令集架构虚拟内存的基础上的。栈就是虚拟的内存。
栈帧是如何实现过程调用的呢?
过程调用主要需要完成3件事情:

  1. 控制转移。 – 讲的是call指令和ret指令做了什么。前者是将下一条指令地址入栈,然后进入过程代码(也就是将call指定的地址放入PC中),后者是将刚才入栈的地址pop到PC中。
  2. 参数和返回值传递。参数传递是用特定的寄存器的,怎么个特定?就是通过参数的位置+参数大小(类型)来规定使用的寄存器,也就是说编译器会遵循某一套规则。返回值的话,也一样,就是通过特定的一个寄存器,%rax。
  3. 局部变量分配。这个和第二点似乎有一些重合,主要讲述在连续发生若干个过程调用的时候,如何做到寄存器之间互不干扰。因为从参数和返回值的传递中我们可以看到,不同的过程是共享一套寄存器的,子过程对于寄存器的操作,对于主过程是直接可见的,例如%rax就是典型。但是寄存器的数量是有限的,如何做到互不干扰呢?如何做到逻辑上我们常说的:不同的函数有自己的空间?x86-64对这个问题的解决办法是:栈+区分不同的寄存器。因为我们一旦将一个寄存器作为目标数,那么就一定会对其造成覆盖,那么原来的值需要保存吗?如何保存?

根据寄存器的不同,划分为两种方案:
- 由调用者保存,也就是说在call之前,将我关心的寄存器入栈保存(或者也可以不保存,总之这些寄存器的修改由调用者自己负责),这样的话子过程可以直接覆盖,子过程也知道,这个寄存器的保存不归我管。
- 由被调用者保存,也就是说我在使用一个寄存器之前,必须先将其入栈保存,用完之后在将其恢复,也就是说子过程需要保证这些寄存器的恢复。
- 总之,就是某些寄存器是需要子过程恢复的,而另一些则大家随便用,谁用谁负责,自己对自己负责。

以上,主要就学了这么点,书上还有很多细节。已经想不起来了。明天加油。

明日目标

  1. 明天需要做两道算法题。
  2. 偶数天的上午看视频,侯捷的C++。
  3. Linux使用扫盲视频。
  4. 晚上看完《深入理解计算机系统》第三章的最后两节,数组和结构体。任务很重,尽量完成,至少看完一个数组吧。

写了快50分钟,赶紧洗漱睡觉!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值