2017/05/05学习笔记

系统中所以的信息包括磁盘文件、内存中的程序、内存中存放的用户数据及网络上传送的数据都是由一串bit表示的。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。
为了在C程序中做出好的编码选择,我们确实需要了解一些机器代码以及编译器将不同的C语句转化为机器代码的方式。
比如一个switch是否总是比一个if-else语句高效的多?
一个函数调用的开销有多大?
while循环比for循环更有效么?
指针引用比数组索引更有效么为什么将循环求和的结果放到一个本地变量中,会比其放到一个通过引用传递过来的参数中,运行起来快很多呢?
为什么我们只是简单地重新排列一下算术表达式中的括号就能让函数运行的更快?
一些最令人困扰的程序错误往往都与链接器操作有关,尤其是当你试图建立大型软件系统时,比如
链接器报告说他无法解析一个引用,这是什么意思?
静态变量和全局变量的区别是什么?
如果你在不同的C文件中定义了名字相同的两个全局变量会发生什么?
静态库和动态库区别是什么?
缓冲区溢出错误是造成大多数网络和Internet服务器上安全漏洞的主要原因.
学习安全编程的第一步就是理解数据和控制信息存储在程序栈上的方式会引起的后果.

系统的硬件组成

为了理解运行hello程序是发生了什么,我们需要了解一个典型系统的硬件组织。

总线

贯穿整个系统的是一组电子管道,称作总线,它携带信息字节并负责在各个部件间传递。通常总线被设计成传送定长的字节块,也就是字。字中的字节数是一个基本的系统参数,各个系统中都不尽相同。现在大多机器字长要么是4字节,要么是8字节

IO设备

IO设备是系统和外部世界联系的通道。键盘鼠标显示器,以及用于长期存储数据和程序的磁盘驱动器。最开始,可执行程序hello就存放在磁盘上。
每个IO设备都通过一个控制器或适配器与IO总线相连。控制器和适配器的区别主要在于它们封装的方式。控制器是IO设备本身或系统的主印制电路板上的芯片组。而适配器是一块在主板插槽的卡。无论如何,它们的功能都在IO总线和IO设备间传递数据。

主存

主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。从物理上来说,主存是由一组动态随机存取存储器芯片组成。从逻辑上来说,存储器是一个线性的字节数组,每个字节都有其唯一的地址,这些地址是从0开始的。一般来说,组成程序的每条机器指令都由不同数量的字节构成。与C程序变量相对应的数据项的大小是根据类型变化的。

处理器

中央处理单元,是解释存储在主存中指令的引擎。处理器的核心是一个大小为一字节的存储设备,称为程序计数器。在任何时候,PC都指向主存中的某条机器语言指令(即含有该条指令的地址)。
从系统通电开始,直到系统断电,处理器一直不断地执行程序计数器指向的指令,再更新程序计数器,使其指向下一条指令。处理器看上去是按照一个非常简单的指令执行模型来操作的,这个模型是由指令集架构来决定的。在这个模型中,指令按照严格的顺序执行,而执行一条指令包含执行一系列的步骤。处理器从程序计数器指向的内存读取指令,解释指令中的位,执行该指令指示的简单操作,然后再更新程序计数器,使其指向下一条指令,而这条指令并不一定和在内存中刚刚执行的指令相邻。
这样的操作并不多,它们围绕着主存 寄存器文件和算术、逻辑单元进行。寄存器文件是一个小的存储设备,由一些单个字长的寄存器组成,每个寄存器都有唯一的名字,ALU计算新的数据和地址值。
加载:从主存复制一个字节或一个字到寄存器,以覆盖寄存器原来的内容。
存储:从寄存器复制一个字节或一个字到主存的某个位置,以覆盖这个位置上原来的内容。
操作:把两个寄存器的内容复制到ALU,ALU磁这两个字做算术运算,将结果存放到一个寄存器中,以覆盖原来寄存器中的内容。
跳转:从指令本身中抽取一个字,并将这个字复制到程序计数器中,以覆盖程序计数器中原来的值

时间: 2024-08-07 16:58:52

2017/05/05学习笔记的相关文章

2017/05/08学习笔记

我们将处理器的指令集架构和处理器的微体系结构区分开来:指令集架构描述的是每条机器代码效果,而微体系结构描述的是处理器实际上是如何实现的. 运行程序 当我们在键盘上输入字符串./hello后,shell程序将字符逐一读入寄存器,再把它放到内存中.利用直接存储器存取技术,数据可以不通过处理器而直接从磁盘到达内存. 一旦目标文件hello中的代码和数据被加载到主存,处理器就开始执行hello程序的main程序中的机器语言指令.这些指令将"hello,world\n"字符串中的字节从主存复制到

Python学习笔记-2017.5.4thon学习笔记-2017.5.14

Python学习过程中的笔记,只做自己参考使用: lambda函数,匿名函数,当我们使用一个函数并且使用完成就删除时,可以使用匿名函数,比如f等于xyz三个之和: f = lambda x,y,z:x+y+z 生成器和迭代器: 生成器,我们常用的列表一般有两种方式生成,例如: 1.直接写出列表 a = [1,2,3,4,5,6,7,8,9] 2.通过列表生成式生成列表 a = [i*i for i in range(10)] 上述两种列表是我们常用的列表方式,调取方便,随便增删改查取值,但是有可

2017/03/31学习笔记

双向链表 单向链表的节点都只有一个指向下一个节点的指针单向链表的数据元素无法直接访问其前驱元素逆序访问单向链表中的元素时极其耗时的操作双向链表在单向链表的基础上增加了指向前驱的指针功能上双向链表可以完全取代单向链表的使用 栈是一种特殊的线性表 栈仅能在线性表的一端进行操作栈顶:允许操作的一端栈底:不允许操作的一端首先它是一个线性表,也就是说,栈元素具有线性关系,即前驱后继关系.只不过它是一种特殊的线性表.定义中说是在线性表的表尾进行插入和删除操作,这里表尾是指栈顶,而不是栈底.他的特殊之处就在于

2017/03/27学习笔记

程序的输入是指从输入文件讲数据传送给程序,程序的输出是指从程序将数据传送输出文件.C++输入输出包含以下三方面内容:对系统指定标准设备的输入和输出.即从键盘输入数据,输出到显示器.这种输入输出称为标准输入输出,简称标准IO.以外出磁盘文件为对象进行输入输出,即从磁盘文件输入数据,将数据输出到文件.以外存为对象的输入输出称为文件的输入输出,简称文件IO.度内存中指定的空间进行输入输出,通常指定一个字符串数组作为储存空间(实际上可以利用该空间储存任何信息).这种输入输出称为字符串输入输出,简称串IO

2017/04/27学习笔记

fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数执行另一个程序.当进程调用一个exec函数时,该进程的用户空间和数据完全被新程序替换,从新程序的启动例程开始执行.调用exec并不创建新进程,所以调用exec前后该进程ID不变.将当前进程的.text .data替换为所要加载程序的.text .data,然后让进程从新的.text第一条指令开始执行,但进程ID不变,换核不换壳. int execl();int execlp();int

2017/03/24学习笔记

类型转换 C语言中的强制类型转换很简单,不管什么类型的转换都是TYPE b=(TYPE)a; C++中类型转换提供了4种类型转换操作符来应对不同场合的应用.static_cast 静态转换.如int转换成charreinterpreter_cast 重新解释类型dynamic_cast 命名上理解是动态类型转换.如子类和父类之间的多态类型转换 (父类转子类,向下转型)const_cast 字面理解就是去const属性. 4种类型转换格式TYPE b=static_cast<TYPE>(a);

2017/03/17学习笔记

智能指针类 指针使用过程中,经常会出现内存泄漏和内存多次被释放.解决方案:boost库的智能指针项目开发中,要求开发者使用预先编写的智能指针类对象代替C语言中原生的指针.智能指针思想工程中的智能指针是一个类模板通过构造函数接管申请的内存通过析构函数确保堆内存被及时释放通过重载指针运算符*和->来模拟指针的行为通过重载比较运算符==和!=来模拟指针的比较 为什么不要重载&&和||操作符 &&和||是C++中非常特殊的操作符&&和||内置实现了短路规则操作

2017/03/11学习笔记

.lib资源模式文件 描述 .dll.dll 动态库(函数二进制码集合,里面有函数的函数体),动态库有规范(win/linux)下不一样. mtrace 是linux C编程内存泄漏检测工具,mtrace是三款工具中最简单易用的,mtrace是一个C函数,在<mckeck.h>里面声明及定义.其实mtrace是类似malloc_hook的malloc handler,只不过mtrace的hander function已由系统为你写好,既然如此,系统又怎么知道您想将malloc/free的记录写

2017/03/03学习笔记

链表 单向链表 非常常用的一种数据结构对于数组,逻辑关系上相邻的两个元素的物理位置也是相邻的,这种结构的优点是随机存储任意位置的元素,但缺点是如果从数组中间删除或插入元素的时候,需要大量的移动元素,效率不高.链表存储结构的特点,元素的存储单元可以是连续的,也可以是不连续的,因此为了表示每个元素a,与其后的元素a+a之间的关系,对于元素a,出了存储其本身的信息外,还需要存储一个指示其后元素的位置,使这两部分数据成为节点.一个节点中存储的数据元素被成为数据域.存储后存储位置的域叫指针域.n个节点(a

2017.3.2学习笔记----------nfs以及根文件系统

根文件系统的制作烧写,nfs,驱动程序的编译 <1> 根文件系统的制作烧写: 类似于前一节,步骤可以参考手册,将补丁文件打入虚拟机,再安装即可. 具体步骤参考开发板应用手册3.4节 <2> 使用flash上的根文件系统启动沪,手工MOUNT NFS: mount -t nfs -o nolock,vers=2 192.168.1.132:/work/nfs_root /mnt ls  /mnt <3>使用nfs作为根文件系统来启动 进入uboot: set bootar