CSAPP

平坦寻址:

堆、栈:栈内存由高地址向低地址增长,堆内存由低地址向高地址增长

栈帧:栈基地址ebp,栈顶地址esp

压栈、弹栈:

数据总线宽度:

地址总线宽度:

寄存器位数:一般和数据线宽度一致

8086 : 16位CPU,数据总线16位,地址总线20位(4位基地址+16位偏移地址)

80386: 32位CPU,数据总线和地址总线都是32位

实模式:

保护模式:

段式内存管理:

页式内存管理:

虚拟地址(逻辑地址)->线性地址->物理地址:前面说到在线性地址转换为物理地址之前,要先由逻辑地址转换为线性地址。系统采用段式管理机制来实现逻辑地址到线性地址的转换。保护模式下,通过”段选择符+段内偏移”寻址最终的线性地址。

CPU的段机制提供一种手段可以将系统的内存空间划分为一个个较小的受保护的区域,每个区域为一个段。相对32位系统,也就是把4G的逻辑地址空间换分成不同的段。每个段都有自己的起始地址(基地址),边界访问权限等属性。实现段机制的一个重要数据结构就是段描述符

段选择符:段选择符占两个字节,其中高13位是段描述在段描述表中的索引,低3位是一些其他的属性

段描述符:8字节的数据结构(段基地址4字节,段边界2.5字节,和其他的一些12位)

段描述符表:表的基地址(起始地址)和一些表的信息(如边界)存放在GDTR寄存器

BSS段(.bbs):未初始化全局变量,静态内存分配(由操作系统初始化)

数据段(.data):初始化全局变量,静态内存分配(由程序初始化)

代码段(.text):程序代码,通常只读

堆:动态分配

栈:局部变量,形参

可执行文件:Linux下为ELF(Executable Linkable Format),其中ELF头中存放各个段的起始地址和长度以及其他的信息,各个段中存放不同属性内容,其中c程序中的变量在ELF文件中的存储区域如下图所示:


CSAPP_第1张图片
ELF文件结构

.bss段的大小可以通过ELF头中的信息得到,但是这只是一个“大小”数据,告诉程序中的非初始化的全局和静态变量会共占用多少内存,在文件中并不会有它的空间,只有当可执行文件装载运行时,才会被分配内存(并且位于data段内存块之后),并且初始化为0.

描述进程的结构体(linux中为task_struct):task_struct中包含了进程的相关信息,比如进程状态,寄存器,内核栈,状态字,内存分配mm_struct。在进程切换的时候,系统将原进程的相关信息保存到它对应的task_struct中;然后选择另一个进程,将task_struct中的信息装载到机器的寄存器中去,然后新的进程就按照它的task_struct来指导运行....

指令类:mov,add,sub,imul,xor,or,and,sal, shl,sar,shr,inc,dec,neg,not,lealpushpop,jump

加减乘,与,或,异或,加一,减一,取负,取补,左移,算术右移,逻辑右移,加载有效地址,压栈,弹栈,跳转等等


CSAPP_第2张图片

你可能感兴趣的:(CSAPP)