Unix/Linux 初始创建进程过程

摘自:http://www.tuicool.com/articles/zUzEZr

 

      当内核加载完成之后,会创建init进程,它是系统的第一个进程init。init进程ID为1,也因此它是之后所有进程的“祖宗”!init进程是系统进入了多用户的状态,允许多个终端设备登录(tty1,tty2...)。对于每一个终端设备,init进程调用一次fork生成一个子进程,紧接着调用exec执行getty程序。

     1)加载内核后 执行init程序 /etc/rc.d/rc.sysinit # 由init执行的第一个脚本/etc/rc.d/rc $RUNLEVEL # $RUNLEVEL为缺省的运行模式/etc/rc.d/rc.local     #相应级别服务启动之后、在执行该文件(其实也可以把需要执行的命令写到该文件中)
    /sbin/mingetty #等待用户登录
    在Redhat中,/etc/rc.d/rc.sysinit主要做在各个运行模式中相同的初始化工作,包括:
    调入keymap以及系统字体
    启动swapping
    设置主机名
    设置NIS域名
    检查(fsck)并mount文件系统
    打开quota
    装载声卡模块
    设置系统时钟
    等等。
    /etc/rc.d/rc则根据其参数指定的运行模式(运行级别,你在inittab文件中可以设置)来执行相应目录下的脚本。凡是以Kxx开头的,都以stop为参数来调用;凡是以Sxx开头的,都以start为参数来调用。调用的顺序按xx从小到大来执行。(其中xx是数字、表示的是启动顺序)例如,假设缺省的运行模式是3,/etc/rc.d/rc就会按上述方式调用/etc/rc.d/rc3.d/下的脚本。
    值得一提的是,Redhat中的运行模式2、3、5都把/etc/rc.d/rc.local做为初始化脚本中的最后一个,所以用户可以自己在这个文件中添加一些需要在其他初始化工作之后,登录之前执行的命令。
    init在等待/etc/rc.d/rc执行完毕之后(因为在/etc/inittab中/etc/rc.d/rc的action是wait),将在指定的各个虚拟终端上运行/sbin/mingetty,等待用户的登录。
    至此,LINUX的启动结束。
    2)init运行级别及指令
    一、什么是INIT:
    init是Linux系统操作中不可缺少的程序之一。
    所谓的init进程,它是一个由内核启动的用户级进程。
    内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。
    内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init。如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。
    二、运行级别
    那么,到底什么是运行级呢?
    简单的说,运行级就是操作系统当前正在运行的功能级别。这个级别从1到6 ,具有不同的功能。
    不同的运行级定义如下
    # 0 -停机(千万不能把initdefault设置为0)
    # 1 -单用户模式# s init s = init 1
    # 2 - 多用户,没有 NFS
    # 3 -完全多用户模式(标准的运行级)
    # 4 -没有用到
    # 5 - X11多用户图形模式(xwindow)
    # 6 -重新启动(千万不要把initdefault设置为6)
    这些级别在/etc/inittab 文件里指定。这个文件是init 程序寻找的主要文件,最先运行的服务是放在/etc/rc.d 目录下的文件。在大多数的Linux 发行版本中,启动脚本都是位于 /etc/rc.d/init.d中的。这些脚本被用ln 命令连接到 /etc/rc.d/rcn.d 目录。(这里的n 就是运行级0-6)

下面的文件是/ect/init/tty1.conf,这足以说明init的动作。

image

getty进程所要做的:  

  1. open:调用open打开输入输出(fd为0,1,2的文件);
  2. read:输出“hostname login:”提示信息,接着读取用户输入的用户名;
  3. exec:根据用户名和从文件中读入的初始环境调用exec,实际上是execle。

现在,getty完成它的使命,把现场交给(exec)login进程。login做的事情可多啦:

  1. 提示用户输入密码兵营验证密码;如果验证多次不成功,又把现在交给init,init知道子进程被XX了,接下来的事情跟上面的一样;
  2. 验证成功的话,设置当前工作目录
  3. 更改终端所有者
  4. 对终端的权限改为读与写
  5. 设置进程组ID
  6. 设置起始目录(HOME),shell(SHELL),用户名(USER和LOGNAME),系统默认路径(PATH)

login已完成使命(主要是以上步骤),shell登场(exec)。

  1. 登录shell的文件描述符0、1、2设置为终端设备
  2. 读取用户启动文件(我用的是ubuntu 12,内核是Linux,用的GNU bash,它用的启动文件是起始目录下的.profile),执行初始化操作
  3. 等待用户键入命令

根据上面的第二条:

image

我在.profile第九行添加“Daoluan Logins In Succeed!”,在进入命令提示符的前一行,就有显示这一字符串,说明这是初始化的必经之地。经常我们需要自定义我们的工作环境的时候,通常要在工作目录下的.bashrc(在.profile文件里有一个行执行.bashrc的代码),从而达到自定义环境的目的。

用apue上一幅图来结束这篇学习总结!

image

上面是终端登录的过程;网络登录的话,会有伪终端设备驱动程序,配合talnet来对终端进行仿真。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值