0%

CSAPP阅读笔记

想读这本书是因为发现自己计算机组成原理真的学得不行,当时这个和汇编是一个课,基本上基础不牢地动山摇,非常裂开,学了和没学一样,为了让自己不那么文盲,最近在看这本书。我是属于一看书就头大,静不下心集中不了注意力的人,所以还有在听南京大学袁春风老师的计算机系统基础(跳着看的)。

别人整理的《深入理解计算机系统》中文电子版,但是这个只有部分章节。

笔记比较零散,很多问题可能也很低级,如果看得完这本书可能会后期再整理一遍,因为最近无心学习,所以看的很慢很慢。

笔记

Linux执行可执行文件

如果该命令行的第一个单词不是一个内置的 shell 命令,那么 shell 就会假设这是一个可执行文件的名字,它将加载并运行这个文件。

这句话让我重新思考了类似”./hello”这样的一条简单命令,我发现我很少想去了解一件事件为什么这样,一直秉着能用就行的态度,学习东西不精也不专。

首先是很多可执行文件第一行声明的解释器,例如\#!/usr/bin/python\#!/bin/bash,在直接使用文件名运行可执行文件的时候,系统确实不知道是哪一种脚本语言,系统默认使用shell,感觉这里声明的其实就是一个环境变量。

另一种执行方法则类似python hellobash hello,我就寻思为什么之前的命令要加./

菜鸟教程中解释了这一点,因为Linux 执行可执行文件的时候不会搜索当前目录,而是在PATH 环境变量的路径中去搜索程序文件,所以需要./指明在当前目录下。Windows会搜索PATH和当前路径。

内存寻址

有保护模式、实地址模式两种寻址方式,一般都是保护模式,实地址模式更多的是为了兼容。

保护模式下有四种寻址方式:立即寻址、寄存器寻址、存储器操作数寻址、相对寻址

线性地址 = 段基址 + 有效地址(偏移)

下图是寻址的举例。

对于简单的变量,寻址方式就是它的位移。这个地方比较特别的是b[i][j],访问存储器中的数组,2是比例因子(short型数组),ebp中存放的是基址,esi 变址寄存器中存放的变址值。

所以b[i][j]的地址是 基址 + 比例变址 + 位移。

之前对栈的了解停留在:从最高地址分配空间,从高地址向低地址增长。

那么现在有了更多的疑问。

  1. 小端存储时,栈中的内容是怎么样存放的呢?

还是一样的,数据在栈中存放的时候低字节数据存放在低地址(栈顶)。

  1. 函数调用的时候栈的变化

首先是返回地址入栈,重新push ebp 这个时候epb存放的是调用函数的ebp(便于后续还原),然后再将esp移到ebp,相当于给被调用函数开辟了一个新的栈空间。

从栈中的变化来看swap函数,就是一个调换原函数中的变量(根据地址找到的),一个只调换了入口参数(只改变了形参)

传参压入栈的时候从右往左

递归开销大,因为不断地生成新的栈帧,压栈出栈 ,所以时间空间开销都大。

游泳日常

最后到了最期待的写一下最近的游泳日常。

游了三四天了,游泳真的使我快乐,然后每天运动一下也还不错,就是游泳池开放时间是分段的,然后游泳+洗澡+吹头发+收拾基本上要两个小时的样子,所以就很尴尬,基本上游泳的话晚上直接不用工作了,不能可持续发展,所以准备国庆之前狂游。

那为什么会记录在博客里面呢,因为游玩之后边上有个救生员说我游泳像绣花一样(以前学车教练也说我打方向盘像绣花一样),我当时就忍不住翻了个白眼,然后因为该死的胜负欲回去看了一晚上蛙泳手视频。

我真的天天在b站学习呢,主要是看的双旭教游泳这个up,然后做了一点笔记,真的比我看书认真多了。

初级版

先划手换气再蹬腿,手和腿之间等待时间不要太久,漂浮两秒。漂浮很关键,是动作之间的停顿,蛙泳和其他泳姿不一样的地方就是其他的比较连续,蛙泳手腿各种有停顿、节奏。

核心就是:蹬完腿飘一会儿再划手,划手速度可以慢一点,但是一定要标准,先推水再抱水,换气是推水的时候头起来。蛙泳的大腿不用怎么动。

进阶版

手部动作快完成的时候,收腿,概括一下就是伸手收腿。

目前问题

  1. 手部动作变形 ,这个属于历史遗留问题了,手一直不太行,这个要靠练,但是改的时候可能会把本身的节奏打乱

  2. 蹬腿反应快过手部,教练的建议是单独练习手部动作,腿夹A字板打直,但是我没A字板,而且泳池也太深了

国庆之后估计就要忙起来了,学习生活回归正轨,这个月真的过的比较滋润,太飘了。不过希望日常也能多运动,对身体好。