想读这本书是因为发现自己计算机组成原理真的学得不行,当时这个和汇编是一个课,基本上基础不牢地动山摇,非常裂开,学了和没学一样,为了让自己不那么文盲,最近在看这本书。我是属于一看书就头大,静不下心集中不了注意力的人,所以还有在听南京大学袁春风老师的计算机系统基础(跳着看的)。
别人整理的《深入理解计算机系统》中文电子版,但是这个只有部分章节。
笔记比较零散,很多问题可能也很低级,如果看得完这本书可能会后期再整理一遍,因为最近无心学习,所以看的很慢很慢。
笔记
Linux执行可执行文件
如果该命令行的第一个单词不是一个内置的 shell 命令,那么 shell 就会假设这是一个可执行文件的名字,它将加载并运行这个文件。
这句话让我重新思考了类似”./hello”这样的一条简单命令,我发现我很少想去了解一件事件为什么这样,一直秉着能用就行的态度,学习东西不精也不专。
首先是很多可执行文件第一行声明的解释器,例如\#!/usr/bin/python
、\#!/bin/bash
,在直接使用文件名运行可执行文件的时候,系统确实不知道是哪一种脚本语言,系统默认使用shell,感觉这里声明的其实就是一个环境变量。
另一种执行方法则类似python hello
、bash hello
,我就寻思为什么之前的命令要加./
,
菜鸟教程中解释了这一点,因为Linux 执行可执行文件的时候不会搜索当前目录,而是在PATH 环境变量的路径中去搜索程序文件,所以需要./
指明在当前目录下。Windows会搜索PATH和当前路径。
内存寻址
有保护模式、实地址模式两种寻址方式,一般都是保护模式,实地址模式更多的是为了兼容。
保护模式下有四种寻址方式:立即寻址、寄存器寻址、存储器操作数寻址、相对寻址
线性地址 = 段基址 + 有效地址(偏移)
下图是寻址的举例。
对于简单的变量,寻址方式就是它的位移。这个地方比较特别的是b[i][j],访问存储器中的数组,2是比例因子(short型数组),ebp中存放的是基址,esi 变址寄存器中存放的变址值。
所以b[i][j]的地址是 基址 + 比例变址 + 位移。
栈
之前对栈的了解停留在:从最高地址分配空间,从高地址向低地址增长。
那么现在有了更多的疑问。
- 小端存储时,栈中的内容是怎么样存放的呢?
还是一样的,数据在栈中存放的时候低字节数据存放在低地址(栈顶)。
- 函数调用的时候栈的变化
首先是返回地址入栈,重新push ebp 这个时候epb存放的是调用函数的ebp(便于后续还原),然后再将esp移到ebp,相当于给被调用函数开辟了一个新的栈空间。
从栈中的变化来看swap函数,就是一个调换原函数中的变量(根据地址找到的),一个只调换了入口参数(只改变了形参)
传参压入栈的时候从右往左
递归开销大,因为不断地生成新的栈帧,压栈出栈 ,所以时间空间开销都大。
游泳日常
最后到了最期待的写一下最近的游泳日常。
游了三四天了,游泳真的使我快乐,然后每天运动一下也还不错,就是游泳池开放时间是分段的,然后游泳+洗澡+吹头发+收拾基本上要两个小时的样子,所以就很尴尬,基本上游泳的话晚上直接不用工作了,不能可持续发展,所以准备国庆之前狂游。
那为什么会记录在博客里面呢,因为游玩之后边上有个救生员说我游泳像绣花一样(以前学车教练也说我打方向盘像绣花一样),我当时就忍不住翻了个白眼,然后因为该死的胜负欲回去看了一晚上蛙泳手视频。
我真的天天在b站学习呢,主要是看的双旭教游泳这个up,然后做了一点笔记,真的比我看书认真多了。
初级版
先划手换气再蹬腿,手和腿之间等待时间不要太久,漂浮两秒。漂浮很关键,是动作之间的停顿,蛙泳和其他泳姿不一样的地方就是其他的比较连续,蛙泳手腿各种有停顿、节奏。
核心就是:蹬完腿飘一会儿再划手,划手速度可以慢一点,但是一定要标准,先推水再抱水,换气是推水的时候头起来。蛙泳的大腿不用怎么动。
进阶版
手部动作快完成的时候,收腿,概括一下就是伸手收腿。
目前问题
手部动作变形 ,这个属于历史遗留问题了,手一直不太行,这个要靠练,但是改的时候可能会把本身的节奏打乱
蹬腿反应快过手部,教练的建议是单独练习手部动作,腿夹A字板打直,但是我没A字板,而且泳池也太深了
国庆之后估计就要忙起来了,学习生活回归正轨,这个月真的过的比较滋润,太飘了。不过希望日常也能多运动,对身体好。