第1章 准备基本环境 1
1.1安装VirtualBox 1
1.2创建虚拟计算机 2
1.3安装Linux系统 2
1.4使用root用户 5
1.5启用自动登录 5
1.6挂载实验分区 6
1.7安装ssh服务器 6
1.8更改网络模式 7
1.9安装增强模式 8
1.10使用Xephyr 8
第2章 工具链 10
2.1编译过程 10
2.1.1预编译 12
2.1.2编译 14
2.1.3汇编 17
2.1.4链接 31
2.2构建工具链 39
2.2.1 GNU工具链组成 40
2.2.2构建工具链的过程 40
2.2.3准备工作 43
2.2.4构建二进制工具 45
2.2.5编译freestanding的交叉编译器 46
2.2.6安装内核头文件 49
2.2.7编译目标系统的C库 50
2.2.8构建完整的交叉编译器 52
2.2.9定义工具链相关的环境变量 54
2.2.10封装“交叉”pkg-config 54
2.2.11关于使用libtool链接库的讨论 56
2.2.12启动代码 57
第3章 构建内核 62
3.1内核映像的组成 62
3.1.1一级推进系统——setup.bin 63
3.1.2二级推进系统——内核非压缩部分 65
3.1.3有效载荷vmlinux 65
3.1.4映像的格式 66
3.2内核映像的构建过程 68
3.2.1 kbuild简介 68
3.2.2构建过程概述 71
3.2.3 vmlinux的构建过程 71
3.2.4 vmlinux.bin的构建过程 75
3.2.5 setup.bin的构建过程 80
3.2.6 bzImage的组合过程 81
3.2.7内核映像构建过程总结 82
3.3配置内核 86
3.3.1交叉编译内核设置 86
3.3.2基本内核配置 87
3.3.3配置处理器 88
3.3.4配置内核支持模块 90
3.3.5配置硬盘控制器驱动 91
3.3.6配置文件系统 96
3.3.7配置内核支持ELF文件格式 97
3.4构建基本根文件系统 99
3.4.1根文件系统的基本目录结构 99
3.4.2安装C库 100
3.4.3安装shell 101
3.4.4安装根文件系统到目标系统 102
第4章 构建initramfs 104
4.1为什么需要initramfs 104
4.2 initramfs原理探讨 105
4.2.1挂载rootfs 106
4.2.2解压initramfs到rootfs 110
4.2.3挂载并切换到真正的根目录 116
4.3配置内核支持initramfs 117
4.4构建基本的initramfs 118
4.5将硬盘驱动编译为模块 121
4.5.1配置devtmpfs 121
4.5.2将硬盘控制器驱动配置为模块 126
4.6自动加载硬盘控制器驱动 130
4.6.1内核向用户空间发送事件 131
4.6.2 udev加载驱动和建立设备节点 136
4.6.3处理冷插拔设备 139
4.6.4编译安装udev 141
4.6.5配置内核支持NETLINK 142
4.6.6配置内核支持inotify 143
4.6.7安装modules.alias.bin文件 144
4.6.8启动udevd和模拟热插拔 146
4.7挂载并切换到根文件系统 147
4.7.1挂载根文件系统 147
4.7.2切换到根文件系统 149
第5章 从内核空间到用户空间 154
5.1 Linux操作系统加载 154
5.1.1 GRUB映像构成 155
5.1.2安装GRUB 160
5.1.3 GRUB启动过程 165
5.1.4加载内核和initramfs 170
5.2解压内核 181
5.2.1移动内核映像 182
5.2.2解压 186
5.2.3重定位 187
5.3内核初始化 190
5.3.1初始化虚拟内存 190
5.3.2初始化进程0 201
5.3.3创建进程1 206
5.4进程加载 209
5.4.1加载可执行程序 211
5.4.2进程的投入运行 223
5.4.3按需载入指令和数据 234
5.4.4加载动态链接器 243
5.4.5加载动态库 246
5.4.6重定位动态库 250
5.4.7重定位可执行程序 268
5.4.8重定位动态链接器 271
5.4.9段RELRO 274
第6章 构建根文件系统 278
6.1初始根文件系统 278
6.2以读写模式重新挂载文件系统 280
6.3配置内核支持网络 282
6.3.1配置内核支持TCP/IP协议 282
6.3.2配置内核支持网卡 283
6.4启动udev 285
6.5安装网络配置工具并配置网络 285
6.6安装并配置ssh服务 287
6.7安装procps 291
6.8安装X窗口系统 291
6.8.1安装M4宏定义 292
6.8.2安装X协议和扩展 292
6.8.3安装X相关库和工具 294
6.8.4安装X服务器 296
6.8.5安装GPU的2D驱动 297
6.8.6安装X的输入设备驱动 297
6.8.7运行X服务器 300
6.8.8一个简单的X程序 302
6.8.9配置内核支持DRM 303
6.9安装图形库 307
6.9.1安装GLib和libffi 307
6.9.2安装ATK 307
6.9.3安装libpng 308
6.9.4安装GdkPixbuf 308
6.9.5安装Fontconfig 308
6.9.6安装Cairo 311
6.9.7安装Pango 311
6.9.8安装libXi 311
6.9.9安装GTK 312
6.9.10安装GTK图形库的善后工作 312
6.9.11一个简单的GTK程序 313
6.10安装字体 315
第7章 构建桌面环境 317
7.1窗口管理器 317
7.1.1基本原理 318
7.1.2创建编译脚本 325
7.1.3主要数据结构 328
7.1.4初始化 331
7.1.5为窗口“落户” 334
7.1.6构建窗口装饰 337
7.1.7绘制装饰窗口 341
7.1.8配置窗口 343
7.1.9移动窗口 345
7.1.10改变窗口大小 348
7.1.11切换窗口 348
7.1.12最大化/最小化/关闭窗口 351
7.1.13管理已存在的窗口 354
7.2任务条和桌面 356
7.2.1标识任务条的身份 357
7.2.2更新任务条上的任务项 358
7.2.3激活任务 359
7.2.4高亮显示当前活动任务 360
7.2.5显示桌面 361
7.2.6桌面 362
第8章 Linux图形原理探讨 364
8.1渲染和显示 364
8.1.1渲染 365
8.1.2显示 365
8.2显存 366
8.2.1动态显存技术 367
8.2.2 Buffer Object 370
8.3 2D渲染 375
8.3.1创建前缓冲 377
8.3.2 GPU渲染 381
8.3.3 CPU渲染 386
8.4 3D渲染 388
8.4.1创建帧缓冲 390
8.4.2渲染Pipleline 399
8.4.3交换前缓冲和后缓冲 414
8.5 Wayland 421