Linux的启动、引导和登录

系统加电后,首先BIOS启动,Linux的启动开始于BIOS从启动设备上加载主引导记录(MBR),MBR中的代码从活动分区上读取Linux bootloader(比如grub、lilo)。接着bootloader加载Linux内核压缩镜像(通常为elf镜像),并将控制权交付给它。内核启动后bootloader加载Initrd(挂载作为初始的根文件系统),来保存额外的动态可加载模块(需要随后用来挂载存储真正根文件系统的硬盘分区)。因为内核运行在应用各种不同存储控制器的硬件平台上,因此在内核镜像中为每一个特定硬盘驱动分配空间基本是不可能的。特定存储设备的驱动打包在Initrd中并且在内核启动后加载(但是在根文件系统挂载之前)。接着,内核自解压缩并开始整个Linux系统的启动。
内核第一级别的初始化是在实模式下完成的(主要是调用bios服务获得内存映射),随后的启动在保护模式下完成。首先初始化cpu子系统,然后内存和进程管理就位,接着启动外围总线和IO设备(包括网络协议族和IO调度器的注册、PCI资源的建立、文件系统的挂载等)。引导的最后一步是调用所有Linux进程的父进程init。init进程执行用户空间的脚本启动必要的内核服务。
init为每一个可登录的终端设备调用fork生成一个子进程并在子进程中调用exec执行getty程序。接着getty以读写的方式打开设备,并为之设置文件描述符0,1,2(应该是调用fcntl函数分别以F_DUPFD和F_SETFD的命令来完成)它最终在控制台上衍生出终端并且现实login提示。
然后,getty输出类似login:的提示并且等待用户输入用户名,当我们输入用户名后,getty程序便完成了它的工作,接着调用exec执行login程序(进程空间被覆盖,所以login和getty的进程号是一样的)并为它建立环境(所有子进程一般都会继承并可能拓展)。login获得输入的密码并和从系统特定文件获得的解密密码相匹配,如果匹配成功,login会设置我们的主目录、uid、gid,初始化用户环境(例如PATH,HOME),调用登录shell等。最终,我们看到shell的输入提示...

你可能感兴趣的:(linux,shell,网络协议,存储,login,linux内核)