最近在看赵炯老师的Linux内核完全注释一书,现对书中第二章的习题解答做一个简单的分享~一.分别说明逻辑(虚拟)地址、线性地址和实际物理地址的定义,并说明它们之间的主要区别和相互关系。
定义
- 逻辑(虚拟)地址:是程序编译后由编译器生成的、面向程序本身的地址,也叫虚拟地址。它以段基址 + 段内偏移量的形式存在,是程序运行时使用的地址空间,与物理内存的实际位置完全无关,每个进程都拥有独立的虚拟地址空间(Linux 0.11 中为 64MB)。
- 线性地址:是逻辑地址经过段式地址转换后得到的中间地址,是一个连续的、一维的线性地址空间。在开启分页机制的系统中,线性地址是分页转换的输入;在不开启分页的系统中,线性地址直接等同于物理地址。
- 实际物理地址:是 CPU 内存管理单元(MMU)最终输出的、对应物理内存芯片上的真实地址,用于直接访问物理内存单元,是硬件层面的实际地址。
核心区别
相互关系
在 x86 保护模式下,地址转换分为两步:
- 段式转换:逻辑地址(段选择子 + 段内偏移)→ 段描述符 → 线性地址
- 页式转换:线性地址 → 页目录 / 页表 → 物理地址在 Linux 0.11 中,段式转换仅做形式化处理(段基址设为 0),因此逻辑地址的偏移量直接等于线性地址,再通过分页机制转换为物理地址。
二.本书所讨论的Linux内核定义了系统同时运行的最大任务数是64个。请问是如何定义出来的?根据内核对地址的使用方式,是否还可以增大同时运行的任务数?64 个任务的定义来源
Linux 0.11 通过 “ 任务状态段(TSS)和GDT(全局描述符表)” 的设计限制了最大任务数:
- GDT 中为每个任务分配 2 个段描述符(代码段、数据段),共预留了
64×2=128个描述符位置; - 同时,内核通过
task[64]数组管理任务控制块(TCB),数组大小直接限制了最大任务数为 64; - 此外,Linux 0.11 的虚拟地址空间划分中,每个任务分配 1MB 的虚拟地址空间,64 个任务共占用 64MB,与系统总虚拟地址空间匹配。
能否增大任务数
可以增大,但受限于硬件与设计约束:
- 硬件层面:x86 的 GDT 最大可支持 8192 个描述符,理论上可支持数千个任务;
- 内核设计层面:
- 需修改
task[]数组的大小,扩大任务控制块的存储;需重新划分虚拟地址空间,为每个任务分配更小的地址空间(如 64KB),以支持更多任务;需调整 GDT 的描述符分配逻辑,为新增任务分配段描述符; - 性能约束:
任务数过多会导致上下文切换开销剧增、内存调度压力增大,实际系统中不会无限制增大。三、什么是引导启动映像(bootimage)盘?什么是根文件系统(rootimage)盘?它们的主要作用分别是什么?
引导启动映像(bootimage)盘
- 包含 Linux 0.11 内核引导程序、内核代码的可启动软盘映像,是系统启动的第一个介质。
- 主要作用
- 系统引导计算机上电后,BIOS 读取软盘的 MBR(主引导记录),加载 bootsect 引导程序;
- 内核加载bootsect 将 setup 程序和内核代码加载到内存指定位置;
- 环境初始化setup 完成硬件检测、保护模式切换等初始化工作,最终跳转到内核入口,启动内核。
根文件系统(rootimage)盘
包含 Linux 0.11 根文件系统的软盘映像,存储系统运行所需的所有文件、目录、设备文件等,在前一篇文章中,我使用的是hdc-0.11.img。- 主要作用
- 根文件系统挂载内核启动完成后,会将 rootimage 挂载为根文件系统(
/),这是系统所有文件操作的起点; - 系统工具与库包含 shell、基本命令(如 ls、cp)、系统库、配置文件等,支撑用户交互和系统运行;
- 设备文件包含 /dev 目录下的设备文件,用于内核与硬件(如硬盘、终端)的交互。
核心区别
这三道题是 Linux 0.11 内核的经典基础题,对应了内存管理、进程管理、系统启动三大核心模块,是理解早期 Linux 内核设计的关键知识点。
欢迎点赞、关注、转发,一起期待后续更多内容~