系统中所有信息都是由一串位表示的,区分不同数据对象唯一方法是读到这些数据对象时的上下文。
预处理器、编译器、汇编器、链接器
网络编程基础:字节顺序
大端法:高对低,低对高运算
逻辑运算:结果0或1(如果对第一个参数求值就能确定表达式的结果,那么就不会对第二个参数求值)IEEE浮点标准
V=(-1)^s X 2^E X M 来表示一个数舍入
向偶舍入:将数字向上或向下舍入,结果的最低有效数字为偶数。
能用于二进制小数。(默认)
向零舍入:把整数向下舍入,负数向上舍入。
向下舍入:正数和负数都向下舍入。
向上舍入:正数和负数都向上舍入。
ISA指令集体系结构
gcc -s hello.c(产生汇编代码)
gcc -c hello.c(编译并汇编该代码)
objdump -d hello.o(反汇编)
针对指令的使用结合具体的练习进行学习效率会更高。
栈帧结构
栈帧——为每一个过程分配的内存空间,它包含两个特殊的参数,栈指针和帧指针。
栈是向低地址增长的。
帧指针:%ebp,指向栈底。
栈指针:%esp,指向栈顶,栈指针可以移动,来分配或释放空间。
%esp减小——分配空间
%esp增大——释放空间
具体使用结合练习
异常
halt指令、非法指令、访问非法地址
数字系统
组合逻辑、存储器元素、时针信号表达式
AND:&&
OR:||
NOT:!
取指、译码、执行、访存、写回、更新PC
分类:SRAM和DRAM
特点:掉电失忆
SRAM比较DRAM
SRAM:供电不变,不刷新,抗干扰,存取快,贵
分类:根据能被重新编写次数和对其编程所用机制分
PROM:编程一次
EPROM:能被擦除和重编1000次
EEPROM:基于EPROM,达10^5次
flash:一类非易失性存储器
特点:非易失性
访问时间
T(max rotation)=1/RPM * 60secs/1min ——最大旋转延迟时间
T(avg rotation)=1/2 * T(max rotation) ——平均延迟时间
T(avg transfer)=1/RPM * 1/(平均扇区数/磁道) * 60secs/1min ——平均传送时间
T(access)=T(avg seek)+T(avg rotation)+T(avg transfer) ——整个估计的访问时间
总结:访问一个磁盘扇区中512字节主要花在寻道时间和旋转延迟
存储总线
1.并行传递方式。
2.指令和数据向CPU传递时的通道。
3.分三组:数据总线(用于传递数据);
地址总线(用于传递主存储器的地址);
控制总线(用于各种内部控制指令的传递)。
系统总线
1.传送的信息包括数据信息、地址信息、控制信息。
2.数据总线(用于传送数据信息);
地址总线(用来传送地址的地址总线的位数决定了CPU可直接寻址的内存空间大小);
控制总线(用来传送控制信号和时序信号)。
I/O总线
指缆线和连接器系统,用来传输I/O路径技术指定的数据和控制信号。
读写事务
1.重复引用同一个变量从的程序有良好的时间局部性;
2.对于步长为k的引用模式的程序,步长越小,空间局部性越好。具有步长为1的引用模式的程序有很好的空间局部性;
3.对于取指令来说,循环有很好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。
中心思想:每层存储设备都是下一层的缓存。
缓存命中
若需要访问k+1层里的数据块d,如果d已经缓存在第k层,则称缓存命中。
1.若d不在第k层,则是缓存不命中。第k层缓存会从第k+1层缓存中取出包含d的那个块。如果第k层缓存已满,就可能会覆盖现存的一个块。
2.替换策略:1.随机替换策略-随机牺牲一个块。2.最少被使用替换策略LRU-牺牲最后被访问的时间距离现在最远的块。
3.种类
1.强制性不命中(冷不命中)
一个空的缓存称为冷缓存,对任何数据对象的访问都不会命中。通常是短暂事件,不会在反复访问存储器使得缓存暖身之后的稳定状态中出现。
2.冲突不命中
限制性的放置策略——将第k+1层的某个块限制放置在第k层块的一个小的子集中。
3.容量不命中
当工作集的大小超过缓存的大小时,缓存会经历容量不命中,就是说缓存太小了,不能处理这个工作集。
块、行、组
块:一个固定大小的信息包。通用的高速缓存存储器
直接映射高速缓存
三步:组选择、行匹配、字选择(如果缓存不命中还需行替换)
结合以下Linux基础总结
普通模式、插入模式和命令行模式切换:
普通→插入: i 或 a帮助系统
普通模式下按F1打开vim自己预设的帮助文档
命令行模式下输入:h shiftwidth 打开名为shiftwidth的帮助文件
预处理:gcc –E hello.c –o hello.i;gcc –E调用cpp
编 译:gcc –S hello.i –o hello.s;gcc –S调用ccl
汇 编:gcc –c hello.s –o hello.o;gcc -c 调用as
链 接:gcc hello.o –o hello ;gcc -o 调用ld
使用GCC编译时要加“-g”参数,然后才能够用gdb调试
启动gdb的方法
gdb设置断点
break func 设置断点,在函数func()入口处
info break 查看断点信息。
r 运行程序
n 单条语句执行
c 继续运行程序
p I 打印变量i的值
bt 查看函数堆栈。
finish 退出函数。
q 退出gdb
实现自动化编译
格式
target(目标文件)... : prerequisites(要生成那个target所需要的文件或是目标)...
command(任意的Shell命令,就是make需要执行的命令)Makefile中的宏
递归展开方式 VAR=var
简单方式 VAR:=var
使用变量 $(VAR)
Linux:静态库:.a;动态库:.so(linux)(重点学习Linux下的)
为了创建该库,使用AR工具:
ar rcs libvector.a addvec.o multvec.o
为了创建可执行文件,需要编译链接输入文件*.o 和libvector.a:
gcc -O2 -c .c
gcc -static -o p2 .o ./libvector.a
加载可执行目标文件
./p
创建动态库
gcc -shared -fPIC -o libvector.so addvec.c multvec.c将动态库链接到程序中
gcc -o p2 *.c ./libvector.so
man -k
man -k k1 | grep k2 | grep k3cheat
To list the content of /path/to/foo.tgz archive using tar ( tar -jtvf /path/to/foo.tgz )find
查找当前目录下所有目录的find命令是(find . -type d)grep
查找宏 STDIN_FILENO 的值的命令是(grep -nr XXX /usr/include)形成空调用栈帧
push %ebp movl %esp %ebp
1.收获与不足:经过两个月的学习,让我对计算机有了进一步的了解,包括汇编的知识,存储器的知识,机器进行计算等方面。收获最大的是如何学习。第一,通过小组答疑论坛大家交流出现的问题,能够发现自己在看书时没有注意的细节,能够学习他人的学习态度。第二,通过自己看书,起初是漫无重点的看,渐渐地学会根据老师给出的重点,有侧重点的学,自己的学习态度也逐渐由开始完成任务变成学知识。第三,通过每周检测和博客评比,增加了认真学习的动力。第四,学的知识只是一条条概念,很多时候不理解,但是结合书上的练习就变得容易了。第五,自学应该是一个个人能力问题,而不仅仅是这门课程的学习方式。不足之处,正如老师说的“欠债”,由于C语言知识的薄弱,让我实践编写代码存在很大的问题,但是前两个月基本没有编程序的项目,我想在日后的学习中应该是一个很大的阻力,现在要努力补充、学习。
2.课程建议:我认为,首先,课堂检测基础知识是比较好的措施,能够检测课前学习的成果如何,同时,可以发现学习中出现的漏洞;其次,老师能够带领我们课堂演示一些指令的用法,能够让我除了实验楼无声的演示之外,有助于理解使用方式;最后,“量”的问题,开学前两周“量”真的很多,知识们在脑海里匆匆而过,大多数只留了个印象,确实变成了完成任务,调整之后,尤其是结合习题学习,让我真的掌握了(汇编这块特别突出,以前学习汇编时欠债,确实读不懂汇编语言,但是现在读懂了),所以我认为知识的学习是慢慢积累的,而不是一口吃个大胖子,最终结果只会消化不良,与此同时,自己主动学习要比被动的逼迫去学习来的有动力。
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。