深度探索Linux操作系统 系统构建和原理解析pdf

图书网 2018年6月19日11:51:03
评论
2.1K1
摘要

深度阐释Linux操作系统原理的里程碑之作,由拥有超过10年研发经验的资深Linux专家撰写。
以从零开始构建一个完整的Linux操作系统的过程为依托,宏观上全面厘清了构成Linux操作系统的各个组件以及它们之间的关系,微观上深入探讨了核心组件的基本原理以及相互间的协作关系,指引读者在富有趣味的实践中参透操作系统的本质。

深度探索Linux操作系统 系统构建和原理解析 内容简介

《深度探索Linux操作系统:系统构建和原理解析》是探索Linux操作系统原理的里程碑之作,在众多的同类书中独树一帜。它颠覆和摒弃了传统的从阅读Linux内核源代码着手学习Linux操作系统原理的方式,而是基于实践,以从零开始构建一个完整的Linux操作系统的过程为依托,指引读者在实践中去探索操作系统的本质。这种方式的妙处在于,让读者先从宏观上全面认清一个完整的操作系统中都包含哪些组件,各个组件的作用,以及各个组件间的关系,从微观上深入理解系统各个组件的原理,帮助读者达到事半功倍的学习效果,这是作者潜心研究Linux操作系统10几年的心得和经验,能避免后来者在学习中再走弯路。此外,本书还对编译链接技术(尤其是动态加载和链接技术)和图形系统进行了原理性的探讨,这部分内容非常珍贵。

《深度探索Linux操作系统:系统构建和原理解析》一共8章:第1章介绍了如何准备工作环境。在第2章中构建了编译工具链,这是后面构建操作系统各个组件的基础。在这一章中,不仅详细讲解了工具链的构建过程,而且还通过对编译链接过程的探讨,深入讨论了工具链的组成及各个组件的作用,理解工具链的工作原理对理解操作系统至关重要。第3~4章,从零开始构建了一个具备用户字符界面的小操作系统,详细讲解了构建的过程以及涉及的技术细节。第5章从理论的角度探讨了这一过程,从内核的加载、解压一直讨论到用户进程的加载,包括用户空间的动态链接器为加载程序所作的努力。第6~7章首先构建了操作系统的基础图形系统,然后在此基础上构建了桌面环境。第8章深入探讨了计算机图形的基础原理,包含2D和3D程序的渲染、软件渲染、硬件渲染等内容,同时也从操作系统的角度审视了Pipeline。

深度探索Linux操作系统 系统构建和原理解析 目录

前  言

第1章 准备基本环境

1.1 安装VirtualBox

1.2 创建虚拟计算机

1.3 安装Linux系统

1.4 使用root用户

1.5 启用自动登录

1.6 挂载实验分区

1.7 安装ssh服务器

1.8 更改网络模式

1.9 安装增强模式

1.10 使用Xephyr

第2章 工具链

2.1 编译过程

2.1.1 预编译

2.1.2 编译

2.1.3 汇编

2.1.4 链接

2.2 构建工具链

2.2.1 GNU工具链组成

2.2.2 构建工具链的过程

2.2.3 准备工作

2.2.4 构建二进制工具

2.2.5 编译freestanding的交叉编译器

2.2.6 安装内核头文件

2.2.7 编译目标系统的C库

2.2.8 构建完整的交叉编译器

2.2.9 定义工具链相关的环境变量

2.2.10 封装“交叉”pkg-config

2.2.11 关于使用libtool链接库的讨论

2.2.12 启动代码

第3章 构建内核

3.1 内核映像的组成

3.1.1 一级推进系统--setup.bin

3.1.2 二级推进系统--内核非压缩部分

3.1.3 有效载荷--vmlinux

3.1.4 映像的格式

3.2 内核映像的构建过程

3.2.1 kbuild简介

3.2.2 构建过程概述

3.2.3 vmlinux的构建过程

3.2.4 vmlinux.bin的构建过程

3.2.5 setup.bin的构建过程

3.2.6 bzImage的组合过程

3.2.7 内核映像构建过程总结

3.3 配置内核

3.3.1 交叉编译内核设置

3.3.2 基本内核配置

3.3.3 配置处理器

3.3.4 配置内核支持模块

3.3.5 配置硬盘控制器驱动

3.3.6 配置文件系统

3.3.7 配置内核支持ELF文件格式

3.4 构建基本根文件系统

3.4.1 根文件系统的基本目录结构

3.4.2 安装C库

3.4.3 安装shell

3.4.4 安装根文件系统到目标系统

第4章 构建initramfs

4.1 为什么需要initramfs

4.2 initramfs原理探讨

4.2.1 挂载rootfs

4.2.2 解压initramfs到rootfs

4.2.3 挂载并切换到真正的根目录

4.3 配置内核支持initramfs

4.4 构建基本的initramfs

4.5 将硬盘驱动编译为模块

4.5.1 配置devtmpfs

4.5.2 将硬盘控制器驱动配置为模块

4.6 自动加载硬盘控制器驱动

4.6.1 内核向用户空间发送事件

4.6.2 udev加载驱动和建立设备节点

4.6.3 处理冷插拔设备

4.6.4 编译安装udev

4.6.5 配置内核支持NETLINK

4.6.6 配置内核支持inotify

4.6.7 安装modules.alias.bin文件

4.6.8 启动udevd和模拟热插拔

4.7 挂载并切换到根文件系统

4.7.1 挂载根文件系统

4.7.2 切换到根文件系统

第5章 从内核空间到用户空间

5.1 Linux操作系统加载

5.1.1 GRUB映像构成

5.1.2 安装GRUB

5.1.3 GRUB启动过程

5.1.4 加载内核和initramfs

5.2 解压内核

5.2.1 移动内核映像

5.2.2 解压

5.2.3 重定位

5.3 内核初始化

5.3.1 初始化虚拟内存

5.3.2 初始化进程0

5.3.3 创建进程1

5.4 进程加载

5.4.1 加载可执行程序

5.4.2 进程的投入运行

5.4.3 按需载入指令和数据

5.4.4 加载动态链接器

5.4.5 加载动态库

5.4.6 重定位动态库

5.4.7 重定位可执行程序

5.4.8 重定位动态链接器

5.4.9 段RELRO

第6章 构建根文件系统

6.1 初始根文件系统

6.2 以读写模式重新挂载文件系统

6.3 配置内核支持网络

6.3.1 配置内核支持TCP/IP协议

6.3.2 配置内核支持网卡

6.4 启动udev

6.5 安装网络配置工具并配置网络

6.6 安装并配置ssh服务

6.7 安装procps

6.8 安装X窗口系统

6.8.1 安装M4宏定义

6.8.2 安装X协议和扩展

6.8.3 安装X相关库和工具

6.8.4 安装X服务器

6.8.5 安装GPU的2D驱动

6.8.6 安装X的输入设备驱动

6.8.7 运行X服务器

6.8.8 一个简单的X程序

6.8.9 配置内核支持DRM

6.9 安装图形库

6.9.1 安装GLib和libffi

6.9.2 安装ATK

6.9.3 安装libpng

6.9.4 安装GdkPixbuf

6.9.5 安装Fontconfig

6.9.6 安装Cairo

6.9.7 安装Pango

6.9.8 安装libXi

6.9.9 安装GTK

6.9.10 安装GTK图形库的善后工作

6.9.11 一个简单的GTK程序

6.10 安装字体

第7章 构建桌面环境

7.1 窗口管理器

7.1.1 基本原理

7.1.2 创建编译脚本

7.1.3 主要数据结构

7.1.4 初始化

7.1.5 为窗口“落户”

7.1.6 构建窗口装饰

7.1.7 绘制装饰窗口

7.1.8 配置窗口

7.1.9 移动窗口

7.1.10 改变窗口大小

7.1.11 切换窗口

7.1.12 最大化/最小化/关闭窗口

7.1.13 管理已存在的窗口

7.2 任务条和桌面

7.2.1 标识任务条的身份

7.2.2 更新任务条上的任务项

7.2.3 激活任务

7.2.4 高亮显示当前活动任务

7.2.5 显示桌面

7.2.6 桌面

第8章 Linux图形原理探讨

8.1 渲染和显示

8.1.1 渲染

8.1.2 显示

8.2 显存

8.2.1 动态显存技术

8.2.2 Buffer Object

8.3 2D渲染

8.3.1 创建前缓冲

8.3.2 GPU渲染

8.3.3 CPU渲染

8.4 3D渲染

8.4.1 创建帧缓冲

8.4.2 渲染Pipleline

8.4.3 交换前缓冲和后缓冲

8.5 Wayland

深度探索Linux操作系统 系统构建和原理解析 精彩文摘

第1章

准备基本环境

在开始Linux操作系统的探索旅程之前,我们首先需要准备一下环境,读者最好在真实的计算机上安装一个Linux操作系统作为工作机。毫无疑问,使用是最好的学习方法,如果日常工作系统也是Linux,那么这无疑有助于更好地理解Linux操作系统。但是这不是必须的,也可以安装一台虚拟机作为工作机。鉴于现在的Linux发行版的安装过程非常友好和自动化,本章无意浪费版面介绍其安装过程。

另外,在构建操作系统时,需要频繁重启系统,因此强烈建议读者不要使用工作机作为实验机,而是另外安装一台虚拟机作为实验机。本章将介绍如何创建一个虚拟的裸机以及如何在其上安装Linux操作系统,并且介绍为了后面的开发和调试,在虚拟机上需要进行的一些必要的准备。

因为桌面环境可以利用一个模拟的小X服务器Xephyr来调试,所以我们可以先在宿主机的Xephyr上进行开发和调试,然后再到构建的真实系统上调试。因此,本章的最后一部分介绍了如何使用Xephyr。

1.1 安装VirtualBox

笔者建议在真实的计算机上安装一个Linux操作系统,这个系统作为工作机,主要进行编译、构建和开发,另外辅助提供做一些实验及阅读源代码等。理论上使用哪家的发行版或者哪个版本都可以,但是为了避免意外的麻烦,建议使用和笔者相同的环境。在写作这本书的最后,笔者使用Ubuntu12.10将构建过程全部验证了一遍,所以建议读者也使用这个版本。

另外,我们当然不希望使用工作机调试我们构建的操作系统,因为这样需要频繁的启动。所以我们需要一个虚拟机,笔者使用的虚拟机是VirtualBox。在Ubuntu12.10下,使用如下命令安装VirtualBox:

root@baisheng:~# apt-get install virtualbox

因为我们是从零开始构建系统,因此虚拟机上还需要一个额外的Linux系统作为桥梁。鉴于其只是一个桥梁,所以使用什么版本没有关系,比如笔者虚拟机上使用的是Ubuntu11.10。

1.2 创建虚拟计算机

在安装Linux操作系统之前,我们需要从硬件层面创建一个虚拟的计算机。VirtualBox启动后,主界面如图1-1所示。

图1-1 VirtualBox主界面

单击图1-1中VirtualBox主界面工具条中的“新建”按钮,新建虚拟机的向导将启动。这个过程非常简单,读者按照新建向导一路执行下去就好。读者只需要注意在安装过程中要选择安装Linux操作系统,其他全部默认即可。

创建好虚拟机后,在VirtualBox主界面中将出现新建的虚拟裸机,如图1-2所示,其中,ubuntu11.10就是笔者新创建的虚拟机。

1.3 安装Linux系统

本节我们将在1.2节创建的裸机上安装Linux操作系统。

在图1-2所示的工具栏上单击“设置”按钮,当然要确保在左侧的列表中选中的是刚刚创建的裸机,出现如图1-3所示的界面。

图1-2 新建的虚拟裸机

图1-3 载入虚拟光盘映像

在图1-3中,首先在左侧的列表中选择“存储”。在默认情况下,我们会看到虚拟机已经添加了一个空的虚拟光驱。如果VirtualBox没有自动添加,读者手动添加即可。至于是SATA接口还是IDE接口,是没有关系的,毕竟是虚拟的。然后,选中虚拟光驱,即图1-3所示的IDE控制器下的“没有盘片”,然后单击“分配光驱”文本框旁的带有光盘图片的按钮。VirtualBox将打开一个文件选择对话框,读者找到Linux操作系统的光盘映像即可。这个过程与我们将物理光盘放入光驱道理完全相同。

在将光盘映像放入虚拟光驱后,在图1-2所示的界面中单击工具栏上的“启动”按钮,启动Linux系统的安装过程。鉴于现在的发行版的安装过程非常友好且全程自动化,我们就不再浪费太多版面逐一介绍。其中需要读者重点关注的是一定要从硬盘中为我们即将构建的系统划分出一块分区,基本上2GB就足够了,并将其格式化为EXT4类型,当然后面这一步也可以在系统安装完成后进行。

在安装过程中,在选择安装类型(installation type)这一步,务必要选择“Something else”,如果选择了使用中文简体安装,这里显示的可能是“其他选项”,总之,要选择这个允许我们为硬盘分区的选项,如图1-4所示。

图1-4 选择安装类型

单击图1-4中的继续(Continue)按钮,将出现硬盘分区的界面。基本上划分两个分区就可以了,一个用来安装操作系统,另外一个作为“实验田”,留给我们构建的操作系统用于实验。划分好的分区大致如图1-5所示。

另外,还有一处需要提醒读者,在安装的后期,安装程序可能会通过网络更新系统,因为这个虚拟机上的系统只是一个桥梁,没有太多工作要做,一个基本的系统就足够了,所以完全没有必要浪费时间等待其下载更新,直接略过(skip)即可。

图1-5 硬盘分区

1.4 使用root用户

很多发行版由于安全原因,默认使用普通用户登录,因此当要执行一些需要特权的操作时,往往需要通过“sudo”命令使自己临时成为root用户。但是这对于我们希望研究操作系统的人来说,当然有点不方便了,所以,笔者建议使用root用户登录。

既然打算使用root用户,当然要知道root用户的密码了,但是Ubuntu默认的root用户密码是什么呢?不必理会这个问题,直接改成我们自己的即可。以普通用户登录虚拟机后,启动一个终端,执行如下命令修改root用户密码:

sudo passwd root

然后就可以使用root用户了,或者使用命令“su”切换用户,或者登录时使用root用户。

1.5 启用自动登录

在安装步骤中,在添加用户这一步的界面中,有一个可选项,即“自动登录”(log in automatically),这个选项默认是没有选中的。如果没有选中,那么在启动时,每次登录都需要输入登录密码,非常麻烦。所以,建议读者开启自动登录。

如果安装时没有选中,也不必重新安装。读者可以修改登录管理器lightdm的配置文件lightdm.conf,在其中添加下面一行:

/etc/lightdm/lightdm.conf:

autologin-user=root

如果读者实在不愿意敲击键盘输入这几个字母,那么可以在系统设置中,打开“用户账户”(User Accounts),将普通账户的“自动登录”(Automatic Login)开启,然后在配置文件lightdm.conf中将多出类似下面一行:

/etc/lightdm/lightdm.conf:

autologin-user=baisheng

读者将其中的普通用户的登录名改为root即可。

如此,即可免除每次登录时输入密码之苦,也无需手动切换用户,而是自动以root身份登录。

1.6 挂载实验分区

假设在虚拟机上为构建的操作系统划分的分区是/dev/sda2,那么我们使用如下命令将其挂载在根目录的vita下:

mkdir /vita

mount /dev/sda2 /vita

为了避免每次开机后都需要手工挂载,我们将其写入fstab文件中,开机后由操作系统自动挂载:

/etc/fstab:

/dev/sda2 /vita ext4 defaults 0 0

1.7 安装ssh服务器

我们使用ssh服务从宿主系统向虚拟机复制构建的实验系统。因此,在虚拟机系统上需要安装ssh服务器。ssh服务器需要通过网络从源服务器下载。以笔者使用的VirtualBox版本为例,默认其为虚拟机开启了网络,并且使用的是NAT模式,要访问互联网,无需设置IP、路由等,但是要自己设置DNS。或者直接可以进入设置,将虚拟机的网络改为桥接模式,这样在DHCP的网络环境中,无须做任何修改即可访问互联网。

确保虚拟机可以访问互联网后,我们就可以安装ssh服务器了。当然首次从源安装软件时,需要更新源。更新源和安装ssh服务的命令如下:

apt-get update

apt-get install openssh-server

1.8 更改网络模式

在VirtualBox的各种网络模式中,允许宿主机和虚拟机通信的常用网络模式是桥接模式和Host-Only模式。但是桥接模式有两个问题,一个是宿主机一定要时刻连网,因为在桥接模式下,虚拟机在局域网内被模拟为与宿主机同等地位的一台主机,所以如果宿主机没有接入局域网,何谈虚拟机和宿主机通信?虽然现在网络很普及,但是毕竟会存在未接入网络的情况。另外一个问题是,我们也不想让开着ssh服务器的虚拟机暴露在互联网上。所以,笔者建议虚拟机的网络使用Host-Only模式,设置方法如图1-6所示。

图1-6 设置虚拟机网络模式

在图1-6中,首先选中左侧列表中的“网络”,然后将“连接方式”更改为“Host-Only”模式。

确定后,宿主系统将多出一个网络接口,用于与虚拟机通信,默认一般是vboxnet0,其地址被设置为192.168.56.1,虚拟机的地址被设置为192.168.56.101。当然读者可以自己修改,但是这没有任何必要。

然后在虚拟机上我们就可以使用如下命令启动ssh服务器了:

/usr/sbin/sshd

在宿主系统上,我们可以远程登录到虚拟机,命令如下:

ssh 192.168.56.101

也可以将宿主系统的文件(比如a)复制到虚拟机,命令如下:

scp a 192.168.56.101:/root/

1.9 安装增强模式

当没有安装增强模式时,虚拟机只能使用固定的分辨率,那么可能不支持全屏这样的功能。如果需要全屏功能,可以选择安装VirtualBox的增强功能来解决这一问题。

在VirtualBox的菜单中,首先选择“设备”菜单;然后在下拉菜单中选择“安装增强功能”。

增强功能也在一个光盘映像中,所以如果是首次安装增强功能,VirtualBox将首先从网络上下载这个光盘映像到宿主机。下载完成后,这个光盘映像一般会被自动装入到虚拟光驱,如果没有自动挂载,需要读者手动将其放入到虚拟光驱,然后,运行其中的“VBoxLinuxAddtions.run”即可。当然如果是为Windows系统安装增强功能,需要运行相应的Windows版本。

图书网:深度探索Linux操作系统 系统构建和原理解析pdf

继续阅读

→→→→→→→→→→→→→→→→→→→→查找获取

操作系统/系统开发

计算机操作系统(第四版)pdf

计算机操作系统(第四版) 内容简介 由汤小丹、梁红兵、哲凤屏、汤子瀛编著的《计算机操作系统(第4版高等学校计算机类十二五规划教材)》对传统操作系统(0S)和现代操作系统均做了较为全面的介绍。全书共分1...
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: