磁盘的引导控制块
引导控制块(boot control block) 一般是分区的第一个block, 里面包含了从这个分区引导操作系统所需要的信息。 1. 引导信息一般是二进制文件,读入内存后让CPU直接执行 2. 引导信息可以用来引导某个操作系统,也可以用来给出一个菜单,让用户在多个OS中选择一个 3. 如果分区上没有操作系统,那么这个block的内容为空
引导控制块(boot control block) 一般是分区的第一个block, 里面包含了从这个分区引导操作系统所需要的信息。 1. 引导信息一般是二进制文件,读入内存后让CPU直接执行 2. 引导信息可以用来引导某个操作系统,也可以用来给出一个菜单,让用户在多个OS中选择一个 3. 如果分区上没有操作系统,那么这个block的内容为空
Logical Block Size:A "block", a contiguous number of bytes, is the minimum unit of memory that is read from and written to a disk by a disk driver ( 出处) 它一般是Sector Size的倍数 要明确的是,块是文件系统的抽象,不是磁盘本身的属性。 扇区大小则是磁盘的物理属性,它是磁盘设备寻址的最小单元。 Linux中, 1.查看某个分区的Block Size: blockdev –getbsz /dev/sda7 2.查看硬盘的扇区大小(Sector Size): 通过fdisk -l可以看到 Linux内核还要求 Block_Size = Sector_Size * (2的n次方),并且Block_Size <= 内存的Page_Size(页大小)
Text段 程序本身 PC值 寄存器的值 … 堆栈段 方法参数 返回地址 局部变量 … 数据段 全局变量 … 注:UNIX环境中“数据段”专指用来放已初始化的全局变量的内存空间,另有一个bss段用来放未初始化的全局变量。 堆(Heap, 可选) 运行期间动态分配的内存 UNIX环境下可以用size命令查看一个可执行程序的text段,数据段和bss段的大小: $size hello_world.o 引用 text data bss … 2573 292 8 …
我们都知道,编译器生成的目标文件中(如C编译后生成的.o文件)中会有一堆符号(symbol)。 有的符号可能并没有在本文件中定义,而是定义在其他目标文件中。 为了能使程序跑起来, 你需要把本目标文件和其他目标文件链接(link)起来,解析相关的符号(resolve the symbols),并合并生成一个可执行的文件。 这就是“链接”的定义。 在程序运行前执行链接,叫做“静态链接” (dynamic linking);它生成的可执行文件来自多个目标文件,所以可能会比较大。 而在程序运行的时候才临时找到相关目标文件并resolve symbols, 则属于“动态链接”(dynamic linking). 动态链接的一个典型例子是:只把自己写的代码直接编译成可执行文件,以免文件太大;在运行时才临时链接到库文件。Windows的DLL就是这样搞的。
进程Ready或Blocked时,都没有在运行。 不过,Ready指的是已经可以运行了,只不过时间片还没有轮到;而Blocked代表真不能运行(比如I/O阻塞)。 下面的转换图也可以帮助解释下:
程序的加载(loading)的意思是 把指令和数据装入到内存中。 其中一件重要的事情是把程序里用到的 虚拟地址(virtual address)映射到物理地址上(physical address)。每个进程的virtual address可能都从0开始,所以在执行时要把它们映射到不同的physical address上,以免内存空间出现交叠。 简单的做法是利用重定位寄存器为进程存放一个基准地址(base address),然后让 physical address = base address + virtual address. 如果程序比较大,那么整个加载到内存里会消耗太多内存。 所以可以延迟加载子程序,即直到需要用时再加载子程序,这就是 动态加载 (Dynamic Loading) 还有一个节省内存的方案是覆盖(overlay). 举例来说就是:程序第1部分占用第1段内存,第2部分占用第2段内存, 第3部分发现第1部分程序已经不需要再占用第1段内存,就自己把这段内存占了。
蠕虫故意让缓冲区溢出,覆盖函数执行后的ret地址,使它指向一段攻击代码的地址。 蠕虫的防御需要在编译器甚至CPU体系结构中做手脚。
SystemTap类似于Strace: http://sourceware.org/systemtap/
按不同的上下文,虚拟存储有不同的指代: 1. 一种是指每个进程有自己的地址空间,这个空间从0开始编址,运行时才对应到真实的物理地址。 2. 另一种是指使用把磁盘视为内存,把内存数据交换到磁盘中。这时也可以把内存视为磁盘的缓存。
中断、陷阱都算异常(exception)。CSAPP把异常分为四类: 1. 中断(interrupt) 2. 陷阱(trap),比如系统调用 3. 故障(fault),比如虚拟内存缺页时,会发生page fault, 然后对应的缺页处理程序就会从磁盘中取出页面 4. 终止(abort), 不可恢复的致命错误,比如DRAM出现位损坏。abort会导致应用程序被中止。 系统启动时,操作系统会分配和初始化“异常表”,维护异常类型和异常处理程序的对应关系。 异常也是程序从用户态进入内核态的唯一手段。