26. 虚拟内存(virtual memory)是硬件内存管理单元(MMU)和应用程序内存请求的一个逻辑层。具有如下作用:a. 支持多个进程并发执行;b. 可以运行内存需求量大于物理内存上限的应用程序;c.进程可以执行只有部分代码在内存中的应用程序;d. 所有进程可以共享一个库或者应用程序的内存镜像(memory image);e. 应用程序可以再定址(relocatable),可以放置在物理内存的任意位置;f. 程序员可以编写机器无关代码,无需考虑物理内存组织的问题。
27. 虚拟地址空间(virtual address space)是内存子系统的要素。内核和MMU一起把进程使用的虚拟地址转化 为物理内存地址。现代的CPU可以已经包含了完成此工作的硬件单元。
28. 可用的RAM通常被分割为4KB或者8KB的页帧(page frames),并使用页表(Page Tables)来描述虚拟地址和物理地址的对应关系。
29. 随机访问内存(RAM)通常被分为两部分, 一小部分用于存储内核镜像(内核代码和内核静态数据结构),其余地给虚拟内存系统(virtual memory system)通过以下三种方式进行使用: a. 用于内核请求的缓冲区、描述符和其它动态内核数据结构;b. 用于进程请求的通用内存区域和文件映射内存;c. 通过caches从硬盘和其它带缓冲区设备获得更好的性能。
30. 当可用内存的某些关键阀值到达时, 页帧回收算法会被调用,从而释放额外的内存。
31. 内存碎片(memory fragmention)是虚拟内存系统必须解决的问题。内核通常强制使用连续的内存区域,所以即使多个内存碎片的总和大于内核的内存请求, 内存分配也可能失败。
32. 内核内存分配器(Kernel Memory Allocator)应该具有如下特征:a. 速度快;b. 最小化地浪费内存;c. 尽可能减少内存碎片;d. 兼容其它内存管理子系统(具有从这些系统借用和释放页帧的能力)。
33. 常见的KMA包括: Resource map allocator, Power-of-two free lists, McKusick-Karels allocator, Buddy System, Mach's Zone allocator, Dynix allocator, Solaris's Slab allocator。 Linux的KMA是在buddy system上面使用Slab allocator。
34. 当一个进程通过exec()执行一个程序时, 内核会给该进程提供一定的虚拟地址空间, 该空间用于以下用途:a. 程序的可执行代码;b. 程序的初始化数据;c. 程序未初始化的数据 ;d. 初始程序堆栈(如用户态栈User Mode Stack);e. 所需共享库的可执行代码和数据;f. 堆(程序动态请求的内存)。
35. 请求调页(demand paging)是近代Uinx操作系统采取的内存分配策略。通过这种策略, 进程 可以在没有页在物理内存的情况下执行程序 。 当进程访问这样的页时, MMU会产生一个异常, 异常处理函数会找到有效的内存区域并分配一个页,同时进行初始化。malloc()、brk()系统调用 也是类似的工作方式。
36. 带复制写(Copy On Write)也是虚拟地址空间所允许的内存分配策略。 如在创建一个新的进程时(fork), 内存只是把父进程的页帧赋给子进各一的地址空间, 但相应的权限被标记为只读, 当子进程试图修改父进程页帧的内容时, 会抛出一个异常, 异常处理函数会为子进程分配新的页帧并用父进程的页帧初始化它。
37. 为了解决磁盘和其它块设备访问速度慢的问题, 一部分可用的物理内存被用作cache。sync()用于磁盘同步(即写及时写回脏的缓冲dirty buffers)。
38. 设备驱动(device drivers)是内存和I/O设备交互的桥梁。设备驱动由控制一个或多个设备的数据结构和功能控制函数组成。
39. 内核提供特定的接口跟设备驱动交互,这种方法的好处在于:a. 与具体设备相关的代码可以封装在一个模块中;b.通过内核提供给驱动的接口,而不必了解内核源代码,设备 厂商就可以添加新的设备;c. 内核通过相同的接口处理所有的设备;d. 设备驱动可以动态地加载和卸载。
40. 用户态的程序是这样操作硬件设备的:需要操作硬件设备的用户态程序通过内核提供的文件系统调用(read, write,etc.)操作/dev下的文件, 这些文件对应的就是具体的设备的驱动接口, 内核会把相应的文件操作转化为针对该设备的具体的操作。
41. 在80 x 86微处理器中,需要区分三种类型的内存地址:a. 逻辑地址(Logical address);b. 线性地址(Linear address);c. 物理地址(Physical address)。
42. 逻辑地址, 通常包含在机器语言指令中,用于指明操作数或者 指令的地址。每个逻辑地址由段(segment)和偏移量(offset)组成。
43. 线性地址,即前面所说的虚拟地址(virtual address), 一个32位的无符号整数可以用于4GB(约4,294,967,296个内存单元)的内存寻址。用十六进制数表示的范围为0x00000000到0xffffffff。
44. 物理地址,用于在内存芯片中定位内存单元。对应于从微处理器(microprocessor)的管脚(pins)地址发送到内存总线(memory bus)的电子信号。 物理地址通常用一个32位或者36位的无符号整数表示。
45. 逻辑地址到物理地址的转换过程:首先是内存管理单元(MMU)通过一个段单元(segmentation unit)的硬件元件把逻辑地址转化为线性地址, 接着由页单元(paging unit)的硬件元件把线性地址转化为物理地址。
46. 内存仲裁器(memory arbiter)是位于总线和各个 内存芯片之间的硬件元件,它的作用是控制内存芯片的访问。 当内存芯片空闲时,它授权一个对该内存的访问请求,而当内存芯片繁忙时, 它延迟对该内存芯片的访问请求。
47. 在多处理器系统中, 所有的CPU通常共享相同的内存, 各个CPU对内存的并发访问通过内存仲裁器协调完成;在单处理器系统中, CPU和DMA(Direct Memory Access)对内存的并发访问也由内存仲裁器协调完成。
48. 实模式(real mode)和保护模式(protected mode)是Intel 微处理器从80286模式开始的用于执行地址转化的两种 不同的方式。实模式的存在是为了兼容以前老的模式和允许操作系统自举(bootstrap)。
49. 一个逻辑地址由两部分组成: 段标志符(segment identifier)和用于指明段内相对地址的偏移量(offset)
50. 段标志符,也叫做段选择子(Segment Selector),对应一个16位的域;常见的格式为:第0位和第1位对应请求优先级别(RPL, Request Privilege Level),第2位对应表指示器(Table Indicator), 第3位到第15位对应索引index