Linux操作系统,在开机时,启动BIOS(基本输入输出系统)程序,执行POST(上电自检过程),检查确认基本硬件是否正常工作,否则退出引导。若果检查正常会立刻产生一个BIOS中断INT 13H,此中断指向引导扇区,将引导扇区的内容加载至内存,执行起来引导加载器GRUB,并将计算机的控制权移交给引导加载器。GRUB可以寻找到操作系统内核代码,加载到内存中并加以执行,并且将计算机控制权交给内核,内核开始自解压,解压完成依据配置启动0号进程,即idle进程,idle进程负责进程调度以及内存交换等,idle进程使用kernel_thread创建1号进程,即init进程,完成后续阶段的初始化工作。
init进程的初始化工作:
用户登陆linux操作系统执行各个程序,最初是通过哑终端进行登陆(一种硬件连接到主机的方式),终端可以是本地也是可以是某个网络位置,此两种登陆方式均经由内核设备驱动程序,硬件设备有限,导致最初登陆数目有限。上一段,我们可以看到,系统最终创建init进程,此进程会读取/etc/ttys文件,文件中每一行保存一个终端设备。读取内容调用fork,生成一个子进程,接着调用exec getty程序,getty会open一个终端设别或者一个网络设备,同时设置文件描述符0/1/2也被设置到该设备上。会显示出login:字符,等待用户输入,一旦输入,getty程序,调用exec login程序,login程序检查用户名及密码,登陆失败调用exec getty程序反复之前过程,如果登陆成功,则完成以下动作:
1 把当前工作目录设置为登陆用户起始目录。
2 更改终端所有权。
3 更改终端设备访问权限。
4 设置进程组。
5 初始化环境。
6 login程序 调用exec sh程序,为此用户登陆shell。
至此,登陆成功。