logo资料库

joyfire的笔记【完整版】.pdf

第1页 / 共1749页
第2页 / 共1749页
第3页 / 共1749页
第4页 / 共1749页
第5页 / 共1749页
第6页 / 共1749页
第7页 / 共1749页
第8页 / 共1749页
资料共1749页,剩余部分请下载后查看
目录
2003 joyfire 的 linux 笔记 王乐珩 [ JOYFIRE 的 LINUX 笔记] joyfire 的 linux 系统管理、 joyfire 的 linux 内核分析、joyfire 的项目专题
目录 joyfire 王乐珩 .................................................................................................................................. 2 joyfire 的 linux 系统管理 ................................................................................................................. 4 启动................................................................................................................................... 4 常用工具 ......................................................................................................................... 64 系统安装配置 ............................................................................................................... 105 管理脚本语言 ............................................................................................................... 178 数据库........................................................................................................................... 218 网络服务 ....................................................................................................................... 240 安全............................................................................................................................... 321 GCC................................................................................................................................. 412 socket .......................................................................................................................... 486 文件设备编程 ............................................................................................................... 493 进程线程编程 ............................................................................................................... 550 joyfire 的 linux 内核分析 ............................................................................................................. 594 启动............................................................................................................................... 595 中断............................................................................................................................... 663 内存............................................................................................................................... 719 进程............................................................................................................................... 775 网络............................................................................................................................... 870 系统调用 ....................................................................................................................... 941 文件系统 ....................................................................................................................... 959 驱动............................................................................................................................. 1026 经验............................................................................................................................. 1079 joyfire 的项目专题 ..................................................................................................................... 1218 LFYOS........................................................................................................................... 1218 OSKit........................................................................................................................... 1271 MiniGUI ...................................................................................................................... 1391 LVS............................................................................................................................... 1482 LIDS............................................................................................................................. 1539 经验............................................................................................................................. 1605 Er ................................................................................................................................ 1634 GNU 通用公共许可证(GPL) ....................................................................................................... 1731 更新记录 .................................................................................................................................... 1744
joyfire 王乐珩 : http://wangleheng.net/ 33 岁 , 男 阿里云计算 产品经理 中国科学院计算技术研究所 蛋白鉴定搜索引擎 pFind 的架构师 现居 : 北京 做了很多年 pFind,现在重返工业界。业余时间喜欢滑雪、读书、看电影、写 BLOG、 徒步旅行。 技能 1 软件开发: C++、Java 和 Python 编程;并行计算、MPI 和 MapReduce 编程;大型软件架构;很早 以前整理过《joyfire Linux 笔记》。发表过两篇学术论文。2007 年的一篇是关于 pFind 引擎的流程和架构问题;2010 年的一篇是关于 pFind 引擎在百核处理器水平集群并行中的 负载均衡问题。 技能 2 技术管理 项目管理和软件工程;程序员的面试和培训;软件知识产权管理。曾任计算所工程开 发和项目管理方面的内部培训师。申请过一些与 pFind 引擎相关的专利、商标和软件著作权。 有多年的新人面试和培训的经验可供分享。 技能 3 计算蛋白质组学: 基于质谱数据的蛋白质鉴定,尤其是搜索引擎方面。对生物学粗通皮毛。翻译过一本 名为《The Stuff of Life》的科普漫画小册子(《漫画生命史话》)。 技能 4 单板滑雪 上高级道。掌握常规的非飞行动作。有过受伤经历。如果真想学,还是建议请职业教 练。可以一起约着去玩。
感谢 要感谢的人很多,不可能全部列出。很多人对这份文档有重要的帮助,以下也许 是他们当中比较重要的几个。但是我猜漏掉了更多,下面没有您的名字并不意味 着什么,请接受我的感谢。 第一个要感谢母亲,世界上最伟大的程序员,开发、维护和升级称为“做 人.c“的浩大程序,工程周期长达几十年,耗费无数资源。竟然奇迹一般独自完 成,单说“感激”是远远不够的,我一辈子都要跟她继续学习怎样编程。(当然 我这“作品”称不上完美,但是大多数 bug 都是系统问题,与软件工程师无关, hehe) 从开始接触 linux,BIT 工作室的成员就是我的好老师和好同伴。当然还有 更多蓝色宝石成员没办法一一提到,他们都是技术精英,更是好朋友。 感谢赵欣,从她那里复印的操作系统原理笔记是这份文档的雏形,也激起了 我收集整理 linux 资料的兴趣。 AKA 是最有活力的自由软件技术团体。我在 AKA 讲座和沙龙里学到不少 linux 技术。很多 AKA 讲义、杂志和站点内容都被加入这份笔记。感谢 AKA。 感谢“良友·收藏家”的作者安富国,让我免费使用这么方便的文档工具。 希望大家支持正在开发的新版本“小蜜蜂”。 感谢武汉大学计算机系 961 班和研究生 981 班,他们共享了 linux 内核源代 码分析的工作成果,很多内容被加入了这份笔记。 lisolog 是国内最优秀的 linux 内核源代码研究组织。我在 lisolog.net 挖 掘了非常多的宝藏。而且还有人主动 mail 来技术文档,帮助充实这份笔记。虽 然不知道他的具体名字,我想应该感谢 lisolog 这个整体。 感谢 LFYOS 的作者刘福岩。在 LFYOS 项目决定公开发布源代码前,我已经得 到了全部的源码、资料和文档。他的无私指导帮我大大提高了技术水平。 感谢王超,不仅仅因为他所提供的详尽 Oracle 技术资料和网站美工方面的 指导,还因为技术以外的巨大帮助。 这些文档里大多数都是从网络上面直接 C&P 的,很多到了我手里已经没有作 者名字了,所有的作者都应该被感谢。您发现自己作品没有标名请和我联系 (joyfire@sina.com)。 这个 list 会越来越长,所有将自己收集的资料寄给我的人都会被记录。
joyfire 的 linux 系统管理 启动 目 录:启动 1. 启动 1. 开机简述 2. 启动过程跟踪 3. lilo 1. lilo 原理 2. man 手册 3. LILO 配置 4. GRUB 1. 下载并安装 GRUB 2. 设备命名规则 3. 引导多系统 4. 实例 5. 菜单设置 6. 用户界面 7. 命令列表 5. init(for BSD) 6. /etc/rc?.d 目录和/etc/rc?文件 7. /etc/inittab 文件 8. 守候进程 9. 系统启动 loader 10. 多系统安装 1. 分配磁盘空间 2. 安装 Linux 3. 进一步:NTloader 引导双系统 启动 1. lilo 2. kernal
3. init 1/2/3/5 important files: /etc/inittab /etc/rc.d/... 4. xdm (graphics interface) important file: /etc/X11/xinit/xsession It seemed that different distribution has differrent xsession. 5. see how /etc/X11/xinit/xsession is written. some related files: Xclients, xinitrc, .xsession, .Xclients, .xinitrc [目录] 开机简述 开机过程制的是从打开计算机电源直到 LINUX 显示用户登录画面的全过程。分析 LINUX 开机过程也是深入 了解 LINUX 核心工作原理的一个很好的途径。在不同的计算机平台上,LINUX 的开机过程稍有不同,本节 以 X386 微机系统为例,介绍 LINUX 的开机过程。 1。开机自检 在刚开机时,根据 X386CUP 的特性,代码段(CS,CODE SEGMENT)寄存器的值为全 1,指令计数器 (IP,INSTRUCTION POINTER)的值为全 0,既 CS=FFFF、IP=0000。这时 CPU 根据 CS 和 IP 的值执行 FFFF0H 处的指令。由于 FFFF0H 已经到了基本内存的高地址顶端,所以,FFFF0H 处的指令一般总是一个 JMP 指令, 以便 CPU 能够跳到比较低的地址去执行那里的代码,这个地址通常是 ROM BIOS 的入口地址。接着,ROM BIOS 进行开机自检,如检查内存,键盘等。在自检过程中,ROM BIOS 会在上位内存(UMB,UPPERMEMORY BLOCK) 中进行扫描,侃侃是否存在合法的设备控制卡 ROM BIOS(如:SCSI 卡上的 ROM),如果有,就执行其中的 一些初始化代码。最后,ROM BIOS 读取磁盘上的第一个扇区并将这个扇区的内存装入内存。 2。预引导 假定硬盘是系统的启动磁盘。硬盘的第一扇区称为主引导记录(MBR, MASTER BOOTRECORD)。MBR 的长度 为 512 字节。可分为两部分:第一部分为引导(PRE-BOOT)区,占了 446 个字节;第二部分为分区表(PARTITION PABLE),共有 66 个字节,记录硬盘的分区信息。预引导区的作用之一是找到标记为活动(ACTIVE)的分 区,并将活动分区的引导区读入内存。 如果用软盘启动计算机,ROM BIOS 读入的是软盘的引导区,既软盘的第一个扇区。 3。核心映像装入
在 LINUX 系统中,人们通常把 LILO(LINUX LOADER)放在 MBR 或某个分区的超级块(SUPERBLOCK)中。假 定 LILO 在 MBR 中,读取 MBR 后,LILO 就会被首先执行。此时,屏幕上出现“BOOT:”字样,接下来的工 作是装入 LINUX 核心映像。如果 LILO 安装在某个分区的超级块中,通常还会有一个管理开机的程序,这个 管理开机的程序负责读取 LILO,进而进行核心映像的装入工作。 4。核心启动 核心装入完毕后,CPU 的控制权就交给了核心启动代码。此时,核心首先进行硬件的检测和设备驱动程序 的初始化,然后运行 INIT。INIT 是 LINUX 核心启动的第一个用户进程,其进程号为 1,是系统其它用户进 程的祖先。 5。系统初始化 INIT 进程负责进行一系列系统初始化程序和脚本文件,/ETC/INITTAB 中包含了 INIT 所做的所有工作。 6。等待用户登录 系统初始化完毕后,INIT 切换到多用户模式,并为每一个虚拟控制台和川行终端启动一个 GETTY 进程。 GETTY 进程负责接受和检验用户的登录要求。 至此,LINUX 系统的启动工作全部完成。不同核心版本的 LINUX 的启动过程有一定的差异,不同发行版本 的 LINUX 的启动也可能稍有不同,但基本过程是类似的。另外,在“BOOT:”后,利用“LINUX SINGLE” 命令可以迫使 LINUX 进入单用户模式,除不要求用户登录和不启动虚拟终端以外,启动过程的其它部分也 基本类似。 [目录] 启动过程跟踪 本文以 Redhat 6.0 Linux 2.2.19 for Alpha/AXP 为平台,描述了从开机到登录的 Linux 启动全过程。该 文对 i386 平台同样适用。 一. Bootloader 在 Alpha/AXP 平台上引导 Linux 通常有两种方法,一种是由 MILO 及其他类似的引导程序引导,另一种是由 Firmware 直接引导。MILO 功能与 i386 平台的 LILO 相近,但内置有基本的磁盘驱动程序(如 IDE、SCSI 等), 以及常见的文件系统驱动程序(如 ext2,iso9660 等), firmware 有 ARC、SRM 两种形式,ARC 具有类 BIOS 界面,甚至还有多重引导的设置;而 SRM 则具有功能强大的命令行界面,用户可以在控制台上使用 boot 等 命令引导系统。ARC 有分区(Partition)的概念,因此可以访问到分区的首扇区;而 SRM 只能将控制转给 磁盘的首扇区。两种 firmware 都可以通过引导 MILO 来引导 Linux,也可以直接引导 Linux 的引导代码。 “arch/alpha/boot”下就是制作 Linux Bootloader 的文件。“head.S”文件提供了对 OSF PAL/1 的调用 入口,它将被编译后置于引导扇区(ARC 的分区首扇区或 SRM 的磁盘 0 扇区),得到控制后初始化一些数
据结构,再将控制转给“main.c”中的 start_kernel(), start_kernel()向控制台输出一些提示,调用 pal_init()初始化 PAL 代码,调用 openboot() 打开引导设备(通过读取 Firmware 环境),调用 load() 将核心代码加载到 START_ADDR(见 “include/asm-alpha/system.h”),再将 Firmware 中的核心引导参 数加载到 ZERO_PAGE(0) 中,最后调用 runkernel()将控制转给 0x100000 的 kernel,bootloader 部分结束。 “arch/alpha/boot/bootp.c”以“main.c”为基础,可代替“main.c”与“head.S” 生成用于 BOOTP 协 议网络引导的 Bootloader。 Bootloader 中使用的所有“srm_”函数在“arch/alpha/lib/”中定义。 以上这种 Boot 方式是一种最简单的方式,即不需其他工具就能引导 Kernel,前提是按照 Makefile 的指导, 生成 bootimage 文件,内含以上提到的 bootloader 以及 vmlinux,然后将 bootimage 写入自磁盘引导扇区 始的位置中。 当采用 MILO 这样的引导程序来引导 Linux 时,不需要上面所说的 Bootloader,而只需要 vmlinux 或 vmlinux.gz,引导程序会主动解压加载内核到 0x1000(小内核)或 0x100000(大内核),并直接进入内核 引导部分,即本文的第二节。 对于 I386 平台 i386 系统中一般都有 BIOS 做最初的引导工作,那就是将四个主分区表中的第一个可引导分区的第一个扇 区加载到实模式地址 0x7c00 上,然后将控制转交给它。 在“arch/i386/boot”目录下,bootsect.S 是生成引导扇区的汇编源码,它首先将自己拷贝到 0x90000 上, 然后将紧接其后的 setup 部分(第二扇区)拷贝到 0x90200,将真正的内核代码拷贝到 0x100000。以上这 些拷贝动作都是以 bootsect.S、setup.S 以及 vmlinux 在磁盘上连续存放为前提的,也就是说,我们的 bzImage 文件或者 zImage 文件是按照 bootsect,setup, vmlinux 这样的顺序组织,并存放于始于引导分 区的首扇区的连续磁盘扇区之中。 bootsect.S 完成加载动作后,就直接跳转到 0x90200,这里正是 setup.S 的程序入口。 setup.S 的主要功 能就是将系统参数(包括内存、磁盘等,由 BIOS 返回)拷贝到 0x90000-0x901FF 内存中,这个地方正是 bootsect.S 存放的地方,这时它将被系统参数覆盖。以后这些参数将由保护模式下的代码来读取。 除此之外,setup.S 还将 video.S 中的代码包含进来,检测和设置显示器和显示模式。最后,setup.S 将系 统转换到保护模式,并跳转到 0x100000(对于 bzImage 格式的大内核是 0x100000,对于 zImage 格式的是 0x1000)的内核引导代码,Bootloader 过程结束。 对于 2.4.x 版内核 没有什么变化。 二.Kernel 引导入口 在 arch/alpha/vmlinux.lds 的链接脚本控制下,链接程序将 vmlinux 的入口置于 "arch/alpha/kernel/head.S"中的__start 上,因此当 Bootloader 跳转到 0x100000 时, __start 处的代 码开始执行。__start 的代码很简单,只需要设置一下全局变量,然后就跳转到 start_kernel 去了。 start_kernel()是"init/main.c"中的 asmlinkage 函数,至此,启动过程转入体系结构无关的通用 C 代码 中。
分享到:
收藏