手把手教你制作一个操作系统

写在前面

笔者目前大二,学过C++,汇编,操作系统,正在学习编译原理和计算机网络,打算做一个小的操作系统来巩固知识,加深对计算机的理解。

参考资料

目前正在学习《自己动手写操作系统》,资源参考一下博客:
自己动手写操作系统(高清图书+源代码)分享

开始动手

写一个最小的操作系统

一开始就遇到困难了,书中说10分钟完成一个操作系统,我花了一个小时了环境都没弄好,好在学计算机的不怕折腾,先附张结果图:
在这里插入图片描述
下面详述步骤:
参考文档:

步骤:
1.首先去官网下载安装NASM,配置环境变量,网址
2.下载虚拟机VirtualBox,网址(需要科学上网)
3.编写源代码,利用NASM编译成.bin文件,使用FloppyWriter.exe将文件写到TINIX.IMG文件里,经调试直接将后缀bin改成IMG好像也可以
4.新建一个虚拟机,网址,已经讲得很详细了,需要注意的是添加软盘选择IMG文件,我运行的时候试了几次才出现红色的“Hello,OS World!”,也不知道是什么原因。

这真的是太棒了,虽然你知道它有多么简陋,但是,毕竟你已经制作了一个可以引导的软盘了,而且所有工作都是你亲手独立完成的!

调试.COM

经历了一个寒假,汇编都忘得一干二净了,不得不从以前的教学文档里找回一些零星的记忆。
还好DOSBox还在,如果没有DOSBox,建议去官网下载一个,我找到了我安装Masm的地方,在旁边又把Nasm再安装了一遍(这样就不用在DOSBox\DOSBox-0.74\DOSBox 0.74 Options.bat里再配置一遍虚拟C盘了)
在这里插入图片描述
将boot.asm中的第一句改成org 07c00h,输入nasm boot.asm -o boot.com,打开DOSBox,找到boot.com运行就能看到左上角的"Hello,OS World"了在这里插入图片描述
(由于jmp $这条语句,目前应当是卡死了的)
也可以使用debug工具直接调试的在这里插入图片描述

汇编课上学到的东西,终于派上用场啦!

环境配置(Linux)

用VisualBox虚拟器运行Ubuntu系统

按照书上所说,可以用虚拟器运行Linux系统,但是书上只给出了Visual PC版的安装方法,如果使用VisualBox的话就要用别的方法了
参考文档:Linux下载安装过程 官网
这两篇教程应该足够了,只是耗费的时间比较长,如果顺利的话,Tinix应该可以运行了
在这里插入图片描述

安装Linux系统

VisualBox虚拟器上的Linux系统虽然容易安装,但运行起来实在是太慢了,随便一个命令都要等上好几秒甚至几十秒,像打开filefox这种直接就卡死机了,特别耽误时间而且影响心态(不知道是不是我电脑的问题),总之,磨了一天多终于把Linux系统给装上了,反正迟早要装的。
参考链接:
1.新手安装 Ubuntu 操作系统步骤教程
2.Ubuntu18.04安装教程

Dell笔记本的BIOS配置

在这里插入图片描述
如果都能按教程的来不出错的话,安装过程将会容易得多,不知道是不是版本问题,我的BIOS和教程总有一些出入,每次教程看得一半就做不下去了,下面的博客整理了一些问题,希望大家安装顺利!
关于dell设置U盘启动与安装Ubuntu的几个问题
在这里插入图片描述
安装Ubuntu后需要一些配置,写给工程师的 Ubuntu 20.04 最佳配置指南

保护模式

理解实模式和保护模式

由于各种原因,保护模式这章我卡了特别久,现在来整理一下。
参考文档:
实模式与保护模式解惑之(一)——二者的起源与区别
实模式和保护模式区别及寻址方式
为了更方便的理解汇编代码,首先要清楚两种模式在寻址方式上的区别,了解开设A20线的意义(第一篇文章有提到),才能理解为什么进入保护模式前要先打开地址线A20。
在这里插入图片描述
(个人理解)保护模式其中“保护”的含义就是要保护系统程序,让用户程序不能随便动系统程序空间的代码,这个其实在我们操作系统课里学过,就是分段操作,不过实模式下虽然有segment的概念,由于采用 hysicaladdress=segment * 16 + offset 的模式,对保护系统程序并没有什么作用;而保护模式中通过段选择符指向段描述符,再由段描述符指向段段基址加上段内偏移地址得出线性地址(详见第二篇文章),其中段描述符的S位和TYPE字段又将相应段分为了数据段、代码段和系统段,不同段有不同的权限,从而真正体现了保护的作用。

增加一个用LDT描述的任务

不来点实战真的不知道自己在看的什么。。。
正好看到书上62面有一个“读者有兴趣可以完成小任务”,做着试试看吧。
在这里插入图片描述
为了不搞复杂了,就熟悉熟悉LDT的用法,我们新建一个描述符表MYLDT,考虑到汇编不好调试的问题,为了少磨点心态,我们就把显示的“L”替换成“S”,证明我们改过来了,开干!

  1. 增加一个32位的代码段CodeB
; CodeB (MYLDT, 32 位代码段)             自己加的LDT代码段,打印一个S
[SECTION .la]
ALIGN	32
[BITS	32]
LABEL_CODE_B:
	mov	ax, SelectorVideo
	mov	gs, ax			; 视频段选择子(目的)

	mov	edi, (80 * 12 + 0) * 2	; 屏幕第 10 行, 第 0 列。
	mov	ah, 0Ch			; 0000: 黑底    1100: 红字
	mov	al, 'S'
	mov	[gs:edi], ax

	; 准备经由16位代码段跳回实模式
	jmp	SelectorCode16:0
CodeBLen	equ	$ - LABEL_CODE_B
; END of [SECTION .la]
  1. 增加描述符表
;MYLDT                      ;自己加的MYLDT段,内容是一个LDT描述符表,其中只有一个代码段描述符
[SECTION .ldt]
ALIGN     32
LABEL_MYLDT:
;
LABEL_MYLDT_DESC_CODEB: Descriptor 0,CodeBLen-1,DA_C+DA_32;Code,32位

MYLDTLen equ $-LABEL_MYLDT
;MYLDT选择子
SelectorMYLDTCodeB equ LABEL_MYLDT_DESC_CODEB - LABEL_MYLDT+SA_TIL
; END of [SECTION .ldt]
  • 在GDT中加入MYLDT段描述符与段选择子
LABEL_DESC_MYLDT:		Descriptor	       0,        MYLDTLen - 1, DA_LDT	;MYLDT      自己加的,用来描述MYLDT
SelectorMYLDT                        equ          LABEL_DESC_MYLDT	- LABEL_GDT    ;自己加的,用来作MYLDT段选择子
  • 初始化
; 初始化 MYLDT 在 GDT 中的描述符                                                                                      ;自己加的,初始化MYLDT
	xor	eax, eax
	mov	ax, ds
	shl	eax, 4
	add	eax, LABEL_MYLDT
	mov	word [LABEL_DESC_MYLDT + 2], ax
	shr	eax, 16
	mov	byte [LABEL_DESC_MYLDT + 4], al
	mov	byte [LABEL_DESC_MYLDT + 7], ah

	; 初始化 MYLDT 中的描述符
	xor	eax, eax
	mov	ax, ds
	shl	eax, 4
	add	eax, LABEL_CODE_B
	mov	word [LABEL_MYLDT_DESC_CODEB + 2], ax
	shr	eax, 16
	mov	byte [LABEL_MYLDT_DESC_CODEB + 4], al
	mov	byte [LABEL_MYLDT_DESC_CODEB + 7], ah
  • 加载MYLDT
; Load MYLDT                                                                                         这里改为MYLDT
	mov	ax, SelectorMYLDT
	lldt	ax

	;jmp	SelectorLDTCodeA:0	; 跳入局部任务
	jmp	SelectorMYLDTCodeB:0	; 跳入局部任务
  • 编译
    首先还是提醒一下最好别打错字了,段选择子和段描述符标签最好复制粘贴,不细心的话编译的时候可能就要像我这样一个个改了
    在这里插入图片描述
    告诉大家一个技巧,记事本行头虽然没有行号标名,右下角的状态栏还是有的,根据错误行数的提示可以快速定位到相应行数,加快debug速度。
  • 运行
    在这里插入图片描述
    可以看到红色的L变为S了,nice!

特权集

个人认为特权集是保护模式最本质待部分了,书上也讲得十分复杂,我们来理顺一下。

  • CPL(Current Privilege Level) 当前执行的程序或任务的特权级 存储在CS和SS的第0位和第1位上
  • DPL(Descriptor Privilege level) 表示段或者门的特权级 存储在段描述符或者门描述符的DPL中
  • RPL(Requested Privilege Level) 避免低特权级应用程序访问高特权级段内的数据 通过段选择子的第0位和第1位表现

再对不同段整理一下

  • 访问数据段或者调用门或者TSS:CPL,RPL<=被访问DPL
  • 访问非一致代码段(不使用调用门):RPL<CPL=被访问DPL
  • 访问非一致代码段(使用调用门):CPL>被访问DPL,RPL不检查
  • 访问一致代码段:CPL>被访问DPL,RPL不检查
评论 6 您还未登录,请先 登录 后发表或查看评论
第1章 走近GNU/Linux、LFS 1 1.1 GNU、Linux、Hurd及开源软件 2 1.1.1 开源的兴起——GNU简介 2 1.1.2 开源项目的标志——Linux简介 3 1.1.3 “古老的开源内核”——Hurd简介 3 1.1.4 越来越多的开源软件 4 1.2 GNU/Linux的发行版 4 1.2.1 Debian GNU/Linux——发行版中的常青树 4 1.2.2 RedHat Linux——Linux系统的代名词 4 1.2.3 Slackware Linux——古老而简洁的发行版 5 1.2.4 Arch Linux——快速、轻量的发行版 5 1.2.5 Gentoo——可高度定制的发行版 5 1.2.6 越来越多的Linux发行版 6 1.3 创造自己的GNU/Linux系统——LFS 6 1.4 GNU/Linux相关标准化介绍 6 1.4.1 POSIX标准简介 7 1.4.2 LSB——Linux系统兼容的新起点 7 1.4.3 FHS——文件存放标准 7 1.5 源代码定制系统相关网络资源 8 第2章 基础准备——Linux系统定制原理 9 2.1 Linux系统的组成及架构 10 2.1.1 了解Linux——Linux系统使用案例分析 10 2.1.2 Linux系统的一般组成 11 2.1.3 Linux系统的架构 14 2.2 Linux的启动过程 16 2.3 本地定制Linux系统的原理 18 2.3.1 名词说明 18 2.3.2 源代码的编译过程 19 2.3.3 系统制作的反向分析 20 2.4 本地定制GNU/Linux系统的制作步骤设计 30 2.4.1 制作流程分解 30 2.4.2 制作过程中的相关技术 33 2.4.3 制作步骤设计 38 第3章 制作GNU/Linux系统的准备工作 43 3.1 准备好的计算机 44 3.2 下载必要的软件 44 3.2.1 LiveCD的下载 44 3.2.2 虚拟机软件——VirtualBox 45 3.2.3 LiveCD的使用 54 3.3 保存和恢复工作状态的方法 55 3.3.1 虚拟机专用的状态保存及恢复方法 55 3.3.2 通用的恢复方法 56 3.4 创建制作分区 56 3.4.1 设置新的分区 56 3.4.2 格式化分区 57 第4章 本地定制GNU/Linux系统——临时系统 61 4.1 设置环境变量 62 4.1.1 “创作基地”的建立 62 4.1.2 建立用于制作系统的用户 64 4.1.3 设置制作用户的环境 66 4.1.4 创建测试文件 67 4.1.5 恢复工作状态(1) 68 4.2 编译软件包的一般步骤 70 4.2.1 什么是软件包 70 4.2.2 软件包的下载 70 4.2.3 软件包解压缩 71 4.2.4 进入源代码目录 72 4.2.5 给源代码应用补丁文件 73 4.2.6 配置源代码 74 4.2.7 编译源代码和安装软件 74 4.2.8 软件包编译安装过程正确性判断 75 4.2.9 软件包编译安装过程记录 76 4.2.10 软件包安装的文件 77 4.2.11 反安装软件包 77 4.2.12 删除源代码目录 78 4.3 预工具链 78 4.3.1 汇编链接器(Binutils) 78 4.3.2 编译器(GCC) 81 4.4 临时工具链 85 4.4.1 内核头文件(Linux kernel headers) 85 4.4.2 基本C库(Glibc) 87 4.4.3 调整工具链 89 4.4.4 汇编工具(Binutils) 91 4.4.5 编译工具(GCC) 92 4.4.6 测试工具集 96 4.5 临时系统 98 4.5.1 文本交互函数库(Ncurses) 98 4.5.2 用户交互环境(Bash) 98 4.5.3 压缩工具(Bzip2) 99 4.5.4 常用命令工具集(Coreutils) 100 4.5.5 文件比较工具(Diffutils) 101 4.5.6 文件查找工具(Findutils) 101 4.5.7 文本处理工具(Gawk) 102 4.5.8 国际化语言支持工具(Gettext) 102 4.5.9 文本匹配搜索工具(Grep) 103 4.5.10 压缩工具(Gzip) 103 4.5.11 宏处理工具(M4) 104 4.5.12 语法分析工具(Bison) 104 4.5.13 编译过程控制工具(Make) 105 4.5.14 补丁文件使用工具(Patch) 105 4.5.15 广泛使用的脚本语言(Perl) 106 4.5.16 文本流编辑工具(Sed) 107 4.5.17 文件打包工具(Tar) 107 4.5.18 信息阅读工具(Texinfo) 108 4.5.19 清理临时系统 108 4.5.20 退出临时系统制作用户 110 4.5.21 恢复工作状态(2) 110 第5章 本地定制GNU/Linux系统——目标系统 112 5.1 目标系统环境设置 113 5.1.1 设置环境变量 113 5.1.2 恢复工作状态(3) 116 5.1.3 建立目标环境目录 117 5.1.4 建立目标系统用户 120 5.1.5 建立必要的文件 122 5.2 目标系统工具链的制作 123 5.2.1 Linux内核头文件(Linux-Header) 123 5.2.2 GNU基本C库(Glibc) 124 5.2.3 调整工具链 133 5.2.4 ZIP格式支持库(Zlib) 135 5.2.5 汇编器(Binutils) 138 5.2.6 任意精度算法库(GMP) 141 5.2.7 高精度浮点数算法库(MPFR) 142 5.2.8 编译器(GCC) 143 5.2.9 工具链的回测 146 5.3 目标系统的制作 147 5.3.1 Linux系统帮助手册(Man-Pages) 147 5.3.2 高性能数据库(Berkeley DB) 149 5.3.3 阶段性检查 151 5.3.4 文本流编辑工具(Sed) 151 5.3.5 软件包安装信息读取工具(Pkg-config) 153 5.3.6 文本下的鼠标工具(GPM) 154 5.3.7 文本环境交互函数库(Ncurses) 155 5.3.8 Linux系统常用工具(Util-Linux-ng) 158 5.3.9 EXT文件系统管理工具(E2fsprogs) 162 5.3.10 常用命令工具集(Coreutils) 165 5.3.11 端口及协议文件(Iana-etc) 169 5.3.12 宏处理工具(M4) 169 5.3.13 语法分析工具(Bison) 170 5.3.14 常用进程管理工具(Procps) 171 5.3.15 文本匹配搜索工具(Grep) 172 5.3.16 行编辑支持库(Readline) 173 5.3.17 用户交互环境工具(Bash) 175 5.3.18 恢复工作状态(4) 176 5.3.19 GNU通用库支持工具(Libtool) 177 5.3.20 小型数据库(GDBM) 178 5.3.21 常用网络工具集(Inetutils) 179 5.3.22 脚本语言工具(Perl) 180 5.3.23 自动化配置脚本生成工具(Autoconf) 183 5.3.24 自动化编译脚本生成工具(Automake) 184 5.3.25 压缩工具(Bzip2) 184 5.3.26 文件比较工具(Diffutils) 187 5.3.27 文件类型查询工具(File) 188 5.3.28 文本处理工具(Gawk) 188 5.3.29 文件查找工具(Findutils) 189 5.3.30 程序生成工具(Flex) 191 5.3.31 国际化语言支持工具(Gettext) 192 5.3.32 格式化文本工具(Groff) 194 5.3.33 压缩工具(Gzip) 196 5.3.34 网络管理工具(IPRoute2) 197 5.3.35 键盘映射表工具(Kbd) 199 5.3.36 分页查看命令(Less) 202 5.3.37 编译过程控制工具(Make) 203 5.3.38 帮助手册查看工具(Man-DB) 204 5.3.39 Linux内核模块管理工具(Module-Init-Tools) 205 5.3.40 补丁文件使用工具(Patch) 206 5.3.41 进程管理工具(Psmisc) 207 5.3.42 密码管理工具(Shadow) 208 5.3.43 日志记录工具(Rsyslog) 210 5.3.44 开关机过程控制工具(Sysvinit) 212 5.3.45 文件打包工具(Tar) 214 5.3.46 信息阅读工具(Texinfo) 215 5.3.47 设备文件自动管理工具(Udev) 217 5.3.48 动态网络地址获取工具(DHCPCD) 220 5.3.49 强大的文本编辑器(VIM) 221 5.3.50 压缩工具(XZ-Utils) 223 5.3.51 数值处理工具(Bc) 225 5.3.52 加密算法支持库(OpenSSL) 226 5.3.53 安全的主机互联工具(OpenSSH) 228 5.3.54 文件下载工具(Wget) 230 5.3.55 Linux系统启动脚本集(Bootscript) 231 5.3.56 安装启动器(GRUB) 233 5.3.57 Linux内核 235 5.3.58 清除调试信息 237 5.4 使系统可以启动 238 5.4.1 制作目标系统启动相关文件 238 5.4.2 设置启动器 243 5.4.3 重新启动进入新系统 246 5.5 如何提高成功率以及部分常见问题的解决方法 247 5.5.1 制作前的准备 247 5.5.2 制作中的常见问题 248 5.5.3 制作后的疑问 255 第6章 LiveCD/DVD的制作 257 6.1 LiveCD启动原理 258 6.1.1 计算机的引导过程 258 6.1.2 LiveCD的启动过程 263 6.2 LiveCD相关技术介绍 265 6.2.1 回环设备(Loop Device) 265 6.2.2 镜像文件 266 6.2.3 临时文件系统——TmpFS 268 6.2.4 压缩文件系统——SquashFS 269 6.2.5 复合文件系统——AUFS 269 6.2.6 启动器——GRUB 271 6.3 LiveCD制作的准备工作 271 6.3.1 工作目录 272 6.3.2 压缩文件系统操作工具(Squashfs-tools) 272 6.3.3 光盘文件制作工具(Mkisofs) 273 6.3.4 文件打包工具(Cpio) 274 6.3.5 文件下载工具(CURL) 275 6.3.6 版本管理工具(Git) 275 6.4 LiveCD最终系统的制作 276 6.5 LiveCD专用内核制作 279 6.5.1 LiveCD对内核的要求 279 6.5.2 AUFS的内核补丁 280 6.5.3 准备Linux内核源代码 280 6.5.4 配置Linux内核源代码 281 6.5.5 编译安装LiveCD专用内核 285 6.6 LiveCD初始化辅助系统的制作 286 6.6.1 Initrd 286 6.6.2 Initramfs 292 6.7 LiveCD的生成 298 6.7.1 最终系统的完成 298 6.7.2 在光盘上安装GRUB-2 299 6.7.3 生成iso文件 300 6.8 完成之后 301 第7章 LiveUSB的制作 307 7.1 LiveUSB相关原理 308 7.1.1 什么是LiveUSB 308 7.1.2 LiveUSB与LiveCD 308 7.1.3 LiveUSB的启动 311 7.2 Live系统的启动方式 314 7.2.1 直接文件系统启动方式 314 7.2.2 镜像文件系统启动方式 315 7.2.3 U盘搜索的不同方式 317 7.2.4 两类启动Live系统方式的对比 319 7.3 LiveUSB制作的准备工作 320 7.3.1 工作目录 320 7.3.2 相关软件包的编译安装 321 7.4 Live系统的制作 325 7.5 LiveUSB专用内核制作 328 7.5.1 LiveUSB对内核的要求 328 7.5.2 AuFS的内核补丁 328 7.5.3 准备Linux内核源代码 329 7.5.4 配置Linux内核源代码 329 7.5.5 编译安装LiveUSB专用内核 333 7.6 LiveUSB初始化辅助系统的制作 334 7.6.1 Initramfs的init命令 334 7.6.2 制作辅助系统 339 7.6.3 辅助系统与内核的合并 341 7.7 LiveUSB的生成 343 7.7.1 最终系统的完成 343 7.7.2 设置GRUB-2 344 7.7.3 创建LiveUSB的U盘 346 7.7.4 U盘安装GRUB-2 348 7.7.5 扫尾工作 349 第8章 交叉编译GNU/Linux系统原理 351 8.1 交叉编译简介 352 8.1.1 交叉编译的定义 352 8.1.2 交叉编译的适用范围 352 8.2 目标平台的准备 352 8.2.1 常见的CPU 353 8.2.2 大端和小端的字节序 353 8.2.3 目标平台的选择 354 8.3 交叉编译原理及相关技术 354 8.3.1 名词说明 354 8.3.2 程序文件的交叉编译 355 8.3.3 交叉编译目标系统 356 8.3.4 Sysroot方式交叉编译目标系统 359 8.4 交叉编译的实施步骤设计 364 8.4.1 制作流程阶段分解 364 8.4.2 制作步骤设计 367 8.5 交叉编译的准备 370 第9章 交叉编译GNU/Linux系统过程 372 9.1 制作环境准备 373 9.1.1 创建工作目录 373 9.1.2 创建制作用户 374 9.1.3 设置制作用户 375 9.1.4 相关软件包下载 377 9.2 目标系统准备 378 9.2.1 恢复工作状态(1) 378 9.2.2 建立目录结构 380 9.2.3 创建必要的用户和组 381 9.2.4 创建必要文件 382 9.3 制作交叉工具链 382 9.3.1 内核头文件(Linux-Header) 382 9.3.2 Binutils交叉工具 383 9.3.3 GCC交叉工具(仅支持C语言) 385 9.3.4 目标系统的Glibc 386 9.3.5 GCC交叉工具(支持C语言和C++语言) 392 9.3.6 测试交叉工具链 393 9.4 完善交叉编译环境 395 9.4.1 File软件包 395 9.4.2 Groff软件包 396 9.4.3 Shadow软件包 397 9.4.4 Ncurses软件包 398 9.4.5 清理交叉编译环境 399 9.5 制作目标系统 400 9.5.1 制作环境设置 400 9.5.2 恢复工作状态(2) 402 9.5.3 Linux系统帮助手册(Man-pages) 403 9.5.4 ZIP格式支持库(Zlib) 403 9.5.5 汇编工具集(Binutils) 404 9.5.6 任意精度算法库(GMP) 406 9.5.7 高精度浮点数算法库(MPFR) 407 9.5.8 编译器(GCC) 408 9.5.9 文本流编辑工具(Sed) 410 9.5.10 文本下的鼠标工具(GPM) 411 9.5.11 文本环境交互函数库(Ncurses) 411 9.5.12 Linux系统常用工具集(Util-Linux-ng) 413 9.5.13 EXT文件系统管理工具(E2fsprogs) 414 9.5.14 常用命令工具集(Coreutils) 416 9.5.15 端口及协议文件(Iana-Etc) 418 9.5.16 宏处理工具(M4) 418 9.5.17 语法分析工具(Bison) 418 9.5.18 进程管理工具(Procps) 419 9.5.19 GNU通用库支持工具(Libtool) 420 9.5.20 行编辑支持库(Readline) 420 9.5.21 自动化配置脚本生成工具(Autoconf) 421 9.5.22 自动化编译脚本生成工具(Automake) 422 9.5.23 用户交互环境工具(Bash) 422 9.5.24 压缩工具(Bzip2) 424 9.5.25 网络地址自动获取工具(DHCPCD) 425 9.5.26 文件比较工具(Diffutils) 425 9.5.27 文件类型查询工具(File) 426 9.5.28 文件查找工具(Findutils) 426 9.5.29 程序生成工具(Flex) 427 9.5.30 文本处理工具(Gawk) 428 9.5.31 国际化语言支持工具(Gettext) 429 9.5.32 文本匹配搜索工具(Grep) 430 9.5.33 格式化文本工具(Groff) 430 9.5.34 压缩工具(Gzip) 431 9.5.35 网络测试工具集(IPutils) 432 9.5.36 网络管理工具(IPRoute2) 433 9.5.37 键盘映射表工具(Kbd) 434 9.5.38 分页查看器(Less) 435 9.5.39 编译过程控制工具(Make) 435 9.5.40 帮助手册查看工具(Man) 436 9.5.41 Linux内核模块管理工具(Module-Init-Tools) 438 9.5.42 补丁文件使用工具(Patch) 438 9.5.43 进程管理工具(Psmisc) 439 9.5.44 密码管理工具(Shadow) 440 9.5.45 日志记录工具(Rsyslog) 441 9.5.46 开关机过程控制工具(Sysvinit) 443 9.5.47 文件打包工具(Tar) 445 9.5.48 信息阅读工具(Texinfo) 445 9.5.49 设备文件自动管理工具(Udev) 446 9.5.50 文本编辑器(VIM) 447 9.5.51 文件下载工具(Wget) 450 9.5.52 压缩工具(XZ-Utils) 450 9.5.53 Bootscript启动脚本安装 451 9.6 使系统可以启动 452 9.6.1 Linux内核 452 9.6.2 制作目标系统启动相关文件 454 9.7 目标系统的使用 456 9.7.1 切换用户 457 9.7.2 目标系统所有者设置 457 9.7.3 目标系统打包 457 9.7.4 将系统存放到目标计算机中 458 9.7.5 建立启动选项 458 9.7.6 启动目标系统 459 第10章 GNU/Hurd系统的制作 460 10.1 GNU/Hurd简介 461 10.2 GNU/Hurd制作原理 463 10.3 GNU/Hurd制作的实施步骤设计 466 10.3.1 制作流程阶段分解 466 10.3.2 制作步骤设计 470 10.4 GNU/Hurd制作的准备 473 10.5 制作环境准备 474 10.5.1 创建工作目录 474 10.5.2 创建制作用户 475 10.5.3 设置制作用户 476 10.6 目标系统准备 477 10.6.1 恢复工作状态(1) 477 10.6.2 建立目录结构 479 10.6.3 创建必要的文件 480 10.7 制作交叉工具链 480 10.7.1 Autoconf(工具链环境) 481 10.7.2 Automake(工具链环境) 481 10.7.3 启动器GRUB-1 481 10.7.4 汇编链接器(Binutils) 482 10.7.5 编译器(GCC) 483 10.7.6 微内核头文件(GNU Mach-Headers) 484 10.7.7 Hurd内核头文件(GNU Hurd-Headers) 485 10.7.8 MIG(编译Hurd内核所需工具) 486 10.7.9 Glibc的头文件(Glibc-Headers) 487 10.7.10 Binutils(交叉工具链) 488 10.7.11 GCC (交叉工具链) 489 10.7.12 目标系统的C函数库(Glibc) 491 10.8 制作微型目标系统 493 10.8.1 GNU Mach微内核 494 10.8.2 GNU Hurd内核 495 10.8.3 目标系统的汇编工具(Binutils) 496 10.8.4 GMP函数库 497 10.8.5 MPFR函数库 497 10.8.6 目标系统的编译器(GCC) 498 10.8.7 临时的Bash 499 10.8.8 文本流编辑工具(Sed) 501 10.8.9 文本匹配搜索工具(Grep) 501 10.8.10 常用命令工具集(Coreutils) 502 10.8.11 编译过程控制命令(Make) 503 10.8.12 文件比较工具(Diffutils) 503 10.8.13 文本处理工具(Gawk) 504 10.8.14 压缩工具(Gzip) 505 10.8.15 文件打包工具(Tar) 505 10.8.16 完成微型系统 506 10.9 建立相对完整的目标系统 510 10.9.1 本地制作的准备 510 10.9.2 恢复工作状态(2) 512 10.9.3 补丁文件使用工具(Patch) 512 10.9.4 压缩工具(Bzip2) 512 10.9.5 文件查找工具(Findutils) 514 10.9.6 GCC编译器(C/C++) 514 10.9.7 文本环境交互函数库(Ncurses) 516 10.9.8 国际化语言支持工具(Gettext) 517 10.9.9 信息阅读工具(Texinfo) 518 10.9.10 高性能数据库(Berkeley DB) 518 10.9.11 端口及协议文件(Iana-etc) 519 10.9.12 EXT文件系统管理工具(E2fsprogs) 519 10.9.13 宏处理工具(M4) 520 10.9.14 语法分析工具(Bison) 521 10.9.15 GNU通用库支持工具(Libtool) 521 10.9.16 ZIP格式支持库(Zlib) 522 10.9.17 脚本语言工具(Perl) 522 10.9.18 行编辑支持库(Readline) 523 10.9.19 自动化配置脚本生成工具(Autoconf) 524 10.9.20 自动化编译脚本生成工具(Automake) 524 10.9.21 文件类型查询工具(File) 525 10.9.22 用户交互环境工具(Bash) 525 10.9.23 程序生成工具(Flex) 526 10.9.24 格式化文本工具(Groff) 527 10.9.25 常用网络工具集(Inetutils) 527 10.9.26 分页查看器(Less) 529 10.9.27 帮助手册查看工具(Man-DB) 529 10.9.28 进程管理工具(Psmisc) 530 10.9.29 密码管理工具(Shadow) 531 10.9.30 压缩工具(XZ-Utils) 533 10.9.31 文本编辑器(VIM) 533 10.9.32 文件下载工具(Wget) 535 10.9.33 Hurd内核编译相关工具(MIG) 536 10.10 启动GNU/Hurd系统 536 10.10.1 设置系统相关配置文件 536 10.10.2 重新设置GRUB配置文件 538 10.10.3 重新启动,进入GNU/Hurd 539 参考文献 542
第01讲-软件安装 第02讲-数据库设计1 第03讲-数据库设计2 第04讲-界面模拟图设计 第05讲-数据表操作类设计 第06讲-编写SQLHelper 第07讲-编写类别表操作类 第08讲-重构SQLHelper 第09讲-浅入浅出SQL注入 第10讲-建立新闻类别实体类 第11讲-浅入浅出SQL触发器 第12讲-编写新闻评论类 第13讲-浅入浅出存储过程 第14讲-重构SQLHelper2 第15讲-编写剩下的存储过程 第16讲-完成新闻表操作类 第17讲-编写BLL层 第18讲-界面制作必备软件 第19讲-CSS简介 第20讲-CSS核心内容 第21讲-制作首页1 第22讲-制作首页2 第23讲-制作首页3 第24讲-首页制作4 第25讲-首页制作5 第26讲-制作母版页  第27讲-其他页面制作1 第28讲-其他页面制作2 第29讲-带边框的圆角框制作1 第30讲-带边框的圆角框制作2 第31讲-制作出错页 第32讲-可变宽度的圆角框制作1 第33讲-可变宽度的圆角框制作2 第34讲-完成类别管理页面制作 第35讲-完成界面制作 第36讲-整合首页1 第37讲-整合首页2 第38讲-整合新闻列表页 第39讲-整合搜索页 第40讲-整合新闻内容页1 第41讲-整合新闻内容页2 第42讲-整合新闻内容页3 第43讲-前台页面除错 第44讲-整合登陆页 第45讲-整合类别管理页1 第46讲-整合类别管理页2 第47讲-整合类别管理页3 第48讲-整合类别管理页4 第49讲-整合类别管理页5 第50讲-整合类别管理页6 第51讲-整合类别管理页7 第52讲-整合类别管理页8 第53讲-整合类别管理页9 第54讲-整合类别管理页10 第55讲-整合类别管理页11 第56讲-整合新闻管理页1 第57讲-整合新闻管理页2 第58讲-整合新闻管理页3 第59讲-整合添加新闻页1 第60讲-整合添加新闻页2 第61讲-尾声 第62讲-尾声续 第63讲-尾声最后续

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页

打赏作者

教练,我也想学

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值