Linux-Android系统启动之INIT进程和system v init
Linux系統啟動之INIT進程和system v init
一. Linux系統啟動之INIT進程和system v init
1. 首先介紹一下INIT進程
?init進程在Start_kernel執行完畢之后,也就是Kernel初始化完畢之后啟動,是系統所有進程的起點,內核在完成核內引導以后,即在本線程(進程)空間內加載init程序,它的進程號是1。
?如果是使用system v init啟動的話,實際上system v init就是一個INIT進程.?
2. 接下來介紹一下/etc/inittab文件
?init程序需要讀取/etc/inittab文件作為其行為指針,inittab是以行為單位的描述性(非執行性)文本,每一個指令行都具有以下格式:?id:runlevel:action:process其中id為入口標識符,runlevel為運行級別,action為動作代號,process為具體的執行程序。
?id一般要求4個字符以內,對于getty或其他login程序項,要求id與tty的編號相同,否則getty程序將不能正常工作。
?runlevel 是init所處于的運行級別的標識,一般使用0-6以及S或s。0、1、6運行級別被系統保留,0作為shutdown動作,1作為重啟至單用戶模式,6 為重啟;S和s意義相同,表示單用戶模式,且無需inittab文件,因此也不在inittab中出現,實際上,進入單用戶模式時,init直接在控制臺(/dev/console)上運行/sbin/sulogin。
?在一般的系統實現中,都使用了2、3、4、5幾個級別,在Redhat系統中,2表示無NFS支持的多用戶模式,3表示完全多用戶模式(也是最常用的級別),4保留給用戶自定義,5表示XDM圖形登錄方式。7-9級別也是可以使用的,傳統的unix系統沒有定義這幾個級別。runlevel可以是并列的多個值,以匹配多個運行級別,對大多數action來說,僅當runlevel與當前運行級別匹配成功才會執行。
initdefault 是一個特殊的action值,用于標識缺省的啟動級別;當init由核心激活以后,它將讀取inittab中的initdefault項,取得其中的 runlevel,并作為當前的運行級別。如果沒有inittab文件,或者其中沒有initdefault項,init將在控制臺上請求輸入.
3. 分析一下system v init的流程???
>> 首先會執行/etc/rc.d/rc.sysinit,它主要完成啟動交換分區/檢查磁盤/配置主機名/檢查并掛載文件系統/加載并初始化硬件模塊等功能;
>> 然后執行缺省的運行級別模式(例如通過id:5:initdefault指定缺省的運行級別為5的話,則會到etc/rc.d/rc5.d目錄下尋找并執行所有的配置文件,實際上該目錄下的所有配置文件都是鏈接到/etc/rc.d/init.d目錄下的文件,可以通過ls -l命令來查看具體的鏈接關系);
>> 接下來去執行/etc/rc.d/rc.local腳本文件(這是INIT執行的最后一個腳本文件,所以用戶可以在這個文件中添加一些需要在登陸之前執行的命令,作用上和PC電腦windows或者dos系統中c盤根目錄下的autoexec.bat作用完全一樣);
>> 最后去執行/bin/login程序
?
?如果上述的初始化過程都能夠正常結束的話,將為使用者進行初始化環境操作,并將控制權交給shell.
二. 由Linux系統啟動之INIT進程和system v init想到的系統開機啟動應用程序的調用
?通過上面的講述可以看到,系統的啟動過程中init進程會去etc/rc.d/rc*.d目錄下尋找并執行默認運行級別的配置文件,顯然在這個過程中可以通過添加配置文件來啟動我們自己的應用程序.同時,我們也注意到system v init執行流程的第三步中會去檢查并執行/etc/rc.d/rc.local腳本文件,可以通過該腳本文件來啟動我們自己的應用程序.
?所以,我們得到如下的結論:
1. 在啟動/etc/init.d下添加啟動腳本,創建/etc/rc.d/.../目錄下的鏈接
?實際上系統中絕大部分的應用程序都是通過這種方式來進行啟動的。
?有關腳本的語法和寫法不是這里描述的重點,網上資料一大把,去問BAIDU&GOOGLE吧.
2. 直接在/etc/rc.d/rc.local中添加命令,該腳本在啟動過程中調用
?比如我機器F10上rc.local的內容如下:
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
?相應的在后面天加上自己要啟動的應用程序就可以了,例如有些example中使用如下的方式啟動nfs:/etc/rc.d/init.d/nfs restart (注釋以下,restart為調用腳本時候的參數)
?通過查詢資料,突然想起來可以通過u-boot或者類似的boot程序給kernel傳遞參數,通過參數來指定啟動的應用程序名字及其路徑,例如init=/passion's program(注釋:這只是參數的一部分,完整的參數還有其它的內容,可以參照boot代碼或者kernel參數的相關介紹).只不過,這個時候啟動應用程序的時間和上面的兩種方法不太一樣,這個是在kernel初始化剛結束的時候啟動的,就是在system v init還沒有啟動的時候調用的.當然了,上面的兩種方法啟動的應用程序的也不是在同一時刻進行調用.
?
?好了,收工.
?
總結
以上是生活随笔為你收集整理的Linux-Android系统启动之INIT进程和system v init的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux学习之zImage内核镜像解压
- 下一篇: Linux-Android启动之zIma