亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 1007 | 回復(fù): 0
打印 上一主題 下一主題

Linux啟動(dòng)過(guò)程綜述 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-10-12 16:40 |只看該作者 |倒序?yàn)g覽

                2001 年 5 月 01 日
本文以Redhat 6.0 Linux 2.2.19 for Alpha/AXP為平臺(tái),描述了從開(kāi)機(jī)到登錄的 Linux 啟動(dòng)全過(guò)程。該文對(duì)i386平臺(tái)同樣適用。Bootloader
在Alpha/AXP平臺(tái)上引導(dǎo)Linux通常有兩種方法,一種是由MILO及其他類似的引導(dǎo)程序引 導(dǎo),另一種是由Firmware直接引導(dǎo)。MILO功能與i386平臺(tái)的LILO相近,但內(nèi)置有基本的磁盤(pán) 驅(qū)動(dòng)程序(如IDE、SCSI等),以及常見(jiàn)的文件系統(tǒng)驅(qū)動(dòng)程序(如ext2,iso9660等), firmware有ARC、SRM兩種形式,ARC具有類BIOS界面,甚至還有多重引導(dǎo)的設(shè)置;而SRM則具 有功能強(qiáng)大的命令行界面,用戶可以在控制臺(tái)上使用boot等命令引導(dǎo)系統(tǒng)。ARC有分區(qū) (Partition)的概念,因此可以訪問(wèn)到分區(qū)的首扇區(qū);而SRM只能將控制轉(zhuǎn)給磁盤(pán)的首扇區(qū)。 兩種firmware都可以通過(guò)引導(dǎo)MILO來(lái)引導(dǎo)Linux,也可以直接引導(dǎo)Linux的引導(dǎo)代碼。
“arch/alpha/boot”下就是制作Linux Bootloader的文件。“head.S”文件提供了對(duì) OSF PAL/1的調(diào)用入口,它將被編譯后置于引導(dǎo)扇區(qū)(ARC的分區(qū)首扇區(qū)或SRM的磁盤(pán)0扇區(qū)), 得到控制后初始化一些數(shù)據(jù)結(jié)構(gòu),再將控制轉(zhuǎn)給“main.c”中的start_kernel(), start_kernel()向控制臺(tái)輸出一些提示,調(diào)用pal_init()初始化PAL代碼,調(diào)用openboot() 打開(kāi)引導(dǎo)設(shè)備(通過(guò)讀取Firmware環(huán)境),調(diào)用load()將核心代碼加載到START_ADDR(見(jiàn) “include/asm-alpha/system.h”),再將Firmware中的核心引導(dǎo)參數(shù)加載到ZERO_PAGE(0) 中,最后調(diào)用runkernel()將控制轉(zhuǎn)給0x100000的kernel,bootloader部分結(jié)束。
Bootloader中使用的所有“srm_”函數(shù)在“arch/alpha/lib/”中定義。
以上這種Boot方式是一種最簡(jiǎn)單的方式,即不需其他工具就能引導(dǎo)Kernel,前提是按照 Makefile的指導(dǎo),生成bootimage文件,內(nèi)含以上提到的bootloader以及vmlinux,然后將 bootimage寫(xiě)入自磁盤(pán)引導(dǎo)扇區(qū)始的位置中。
當(dāng)采用MILO這樣的引導(dǎo)程序來(lái)引導(dǎo)Linux時(shí),不需要上面所說(shuō)的Bootloader,而只需要 vmlinux或vmlinux.gz,引導(dǎo)程序會(huì)主動(dòng)解壓加載內(nèi)核到0x1000(小內(nèi)核)或0x100000(大 內(nèi)核),并直接進(jìn)入內(nèi)核引導(dǎo)部分,即本文的第二節(jié)。
對(duì)于I386平臺(tái)
i386系統(tǒng)中一般都有BIOS做最初的引導(dǎo)工作,那就是將四個(gè)主分區(qū)表中的第一個(gè)可引導(dǎo) 分區(qū)的第一個(gè)扇區(qū)加載到實(shí)模式地址0x7c00上,然后將控制轉(zhuǎn)交給它。在“arch/i386/boot”目錄下,bootsect.S是生成引導(dǎo)扇區(qū)的匯編源碼,它首先將自己 拷貝到0x90000上,然后將緊接其后的setup部分(第二扇區(qū))拷貝到0x90200,將真正的內(nèi)核 代碼拷貝到0x100000。以上這些拷貝動(dòng)作都是以bootsect.S、setup.S以及vmlinux在磁盤(pán)上 連續(xù)存放為前提的,也就是說(shuō),我們的bzImage文件或者zImage文件是按照bootsect,setup, vmlinux這樣的順序組織,并存放于始于引導(dǎo)分區(qū)的首扇區(qū)的連續(xù)磁盤(pán)扇區(qū)之中。bootsect.S完成加載動(dòng)作后,就直接跳轉(zhuǎn)到0x90200,這里正是setup.S的程序入口。 setup.S的主要功能就是將系統(tǒng)參數(shù)(包括內(nèi)存、磁盤(pán)等,由BIOS返回)拷貝到 0x90000-0x901FF內(nèi)存中,這個(gè)地方正是bootsect.S存放的地方,這時(shí)它將被系統(tǒng)參數(shù)覆蓋。 以后這些參數(shù)將由保護(hù)模式下的代碼來(lái)讀取。除此之外,setup.S還將video.S中的代碼包含進(jìn)來(lái),檢測(cè)和設(shè)置顯示器和顯示模式。最 后,setup.S將系統(tǒng)轉(zhuǎn)換到保護(hù)模式,并跳轉(zhuǎn)到0x100000(對(duì)于bzImage格式的大內(nèi)核是 0x100000,對(duì)于zImage格式的是0x1000)的內(nèi)核引導(dǎo)代碼,Bootloader過(guò)程結(jié)束。對(duì)于2.4.x版內(nèi)核
沒(méi)有什么變化。




回頁(yè)首
Kernel引導(dǎo)入口
對(duì)于I386平臺(tái)
在i386體系結(jié)構(gòu)中,因?yàn)閕386本身的問(wèn)題,在"arch/alpha/kernel/head.S"中需要更多的設(shè)置,但最終也是通過(guò)call SYMBOL_NAME(start_kernel)轉(zhuǎn)到start_kernel()這個(gè)體系結(jié)構(gòu)無(wú)關(guān)的函數(shù)中去執(zhí)行了。所不同的是,在i386系統(tǒng)中,當(dāng)內(nèi)核以bzImage的形式壓縮,即大內(nèi)核方式 (__BIG_KERNEL__)壓縮時(shí)就需要預(yù)先處理bootsect.S和setup.S,按照大核模式使用$(CPP) 處理生成bbootsect.S和bsetup.S,然后再編譯生成相應(yīng)的.o文件,并使用 "arch/i386/boot/compressed/build.c"生成的build工具,將實(shí)際的內(nèi)核(未壓縮的,含 kernel中的head.S代碼)與"arch/i386/boot/compressed"下的head.S和misc.c合成到一起,其中的head.S代替了"arch/i386/kernel/head.S"的位置,由Bootloader引導(dǎo)執(zhí)行 (startup_32入口),然后它調(diào)用misc.c中定義的decompress_kernel()函數(shù),使用 "lib/inflate.c"中定義的gunzip()將內(nèi)核解壓到0x100000,再轉(zhuǎn)到其上執(zhí)行 "arch/i386/kernel/head.S"中的startup_32代碼。對(duì)于2.4.x版內(nèi)核
沒(méi)有變化。




回頁(yè)首
核心數(shù)據(jù)結(jié)構(gòu)初始化--內(nèi)核引導(dǎo)第一部分
start_kernel()中調(diào)用了一系列初始化函數(shù),以完成kernel本身的設(shè)置。 這些動(dòng)作有的是公共的,有的則是需要配置的才會(huì)執(zhí)行的。
在start_kernel()函數(shù)中,
  • 輸出Linux版本信息(printk(linux_banner))
  • 設(shè)置與體系結(jié)構(gòu)相關(guān)的環(huán)境(setup_arch())
  • 頁(yè)表結(jié)構(gòu)初始化(paging_init())
  • 使用"arch/alpha/kernel/entry.S"中的入口點(diǎn)設(shè)置系統(tǒng)自陷入口(trap_init())
  • 使用alpha_mv結(jié)構(gòu)和entry.S入口初始化系統(tǒng)IRQ(init_IRQ())
  • 核心進(jìn)程調(diào)度器初始化(包括初始化幾個(gè)缺省的Bottom-half,sched_init())
  • 時(shí)間、定時(shí)器初始化(包括讀取CMOS時(shí)鐘、估測(cè)主頻、初始化定時(shí)器中斷等,time_init())
  • 提取并分析核心啟動(dòng)參數(shù)(從環(huán)境變量中讀取參數(shù),設(shè)置相應(yīng)標(biāo)志位等待處理,(parse_options())
  • 控制臺(tái)初始化(為輸出信息而先于PCI初始化,console_init())
  • 剖析器數(shù)據(jù)結(jié)構(gòu)初始化(prof_buffer和prof_len變量)
  • 核心Cache初始化(描述Cache信息的Cache,kmem_cache_init())
  • 延遲校準(zhǔn)(獲得時(shí)鐘jiffies與CPU主頻ticks的延遲,calibrate_delay())
  • 內(nèi)存初始化(設(shè)置內(nèi)存上下界和頁(yè)表項(xiàng)初始值,mem_init())
  • 創(chuàng)建和設(shè)置內(nèi)部及通用cache("slab_cache",kmem_cache_sizes_init())
  • 創(chuàng)建uid taskcount SLAB cache("uid_cache",uidcache_init())
  • 創(chuàng)建文件cache("files_cache",filescache_init())
  • 創(chuàng)建目錄cache("dentry_cache",dcache_init())
  • 創(chuàng)建與虛存相關(guān)的cache("vm_area_struct","mm_struct",vma_init())
  • 塊設(shè)備讀寫(xiě)緩沖區(qū)初始化(同時(shí)創(chuàng)建"buffer_head"cache用戶加速訪問(wèn),buffer_init())
  • 創(chuàng)建頁(yè)cache(內(nèi)存頁(yè)hash表初始化,page_cache_init())
  • 創(chuàng)建信號(hào)隊(duì)列cache("signal_queue",signals_init())
  • 初始化內(nèi)存inode表(inode_init())
  • 創(chuàng)建內(nèi)存文件描述符表("filp_cache",file_table_init())
  • 檢查體系結(jié)構(gòu)漏洞(對(duì)于alpha,此函數(shù)為空,check_bugs())
  • SMP機(jī)器其余CPU(除當(dāng)前引導(dǎo)CPU)初始化(對(duì)于沒(méi)有配置SMP的內(nèi)核,此函數(shù)為空,smp_init())
  • 啟動(dòng)init過(guò)程(創(chuàng)建第一個(gè)核心線程,調(diào)用init()函數(shù),原執(zhí)行序列調(diào)用cpu_idle() 等待調(diào)度,init())至此start_kernel()結(jié)束,基本的核心環(huán)境已經(jīng)建立起來(lái)了。
    對(duì)于I386平臺(tái)
    i386平臺(tái)上的內(nèi)核啟動(dòng)過(guò)程與此基本相同,所不同的主要是實(shí)現(xiàn)方式。對(duì)于2.4.x版內(nèi)核
    2.4.x中變化比較大,但基本過(guò)程沒(méi)變,變動(dòng)的是各個(gè)數(shù)據(jù)結(jié)構(gòu)的具體實(shí)現(xiàn),比如Cache。




    回頁(yè)首
    外設(shè)初始化--內(nèi)核引導(dǎo)第二部分
    init()函數(shù)作為核心線程,首先鎖定內(nèi)核(僅對(duì)SMP機(jī)器有效),然后調(diào)用 do_basic_setup()完成外設(shè)及其驅(qū)動(dòng)程序的加載和初始化。過(guò)程如下:
  • 總線初始化(比如pci_init())
  • 網(wǎng)絡(luò)初始化(初始化網(wǎng)絡(luò)數(shù)據(jù)結(jié)構(gòu),包括sk_init()、skb_init()和proto_init()三部分,在proto_init()中,將調(diào)用protocols結(jié)構(gòu)中包含的所有協(xié)議的初始化過(guò)程,sock_init())
  • 創(chuàng)建bdflush核心線程(bdflush()過(guò)程常駐核心空間,由核心喚醒來(lái)清理被寫(xiě)過(guò)的內(nèi)存緩沖區(qū),當(dāng)bdflush()由kernel_thread()啟動(dòng)后,它將自己命名為kflushd)
  • 創(chuàng)建kupdate核心線程(kupdate()過(guò)程常駐核心空間,由核心按時(shí)調(diào)度執(zhí)行,將內(nèi)存緩沖區(qū)中的信息更新到磁盤(pán)中,更新的內(nèi)容包括超級(jí)塊和inode表)
  • 設(shè)置并啟動(dòng)核心調(diào)頁(yè)線程kswapd(為了防止kswapd啟動(dòng)時(shí)將版本信息輸出到其他信息中間,核心線調(diào)用kswapd_setup()設(shè)置kswapd運(yùn)行所要求的環(huán)境,然后再創(chuàng)建 kswapd核心線程)
  • 創(chuàng)建事件管理核心線程(start_context_thread()函數(shù)啟動(dòng)context_thread()過(guò)程,并重命名為keventd)
  • 設(shè)備初始化(包括并口parport_init()、字符設(shè)備chr_dev_init()、塊設(shè)備 blk_dev_init()、SCSI設(shè)備scsi_dev_init()、網(wǎng)絡(luò)設(shè)備net_dev_init()、磁盤(pán)初始化及分區(qū)檢查等等,device_setup())
  • 執(zhí)行文件格式設(shè)置(binfmt_setup())
  • 啟動(dòng)任何使用__initcall標(biāo)識(shí)的函數(shù)(方便核心開(kāi)發(fā)者添加啟動(dòng)函數(shù),do_initcalls())
  • 文件系統(tǒng)初始化(filesystem_setup())
  • 安裝root文件系統(tǒng)(mount_root())至此do_basic_setup()函數(shù)返回init(),在釋放啟動(dòng)內(nèi)存段(free_initmem())并給內(nèi)核解鎖以后,init()打開(kāi)/dev/console設(shè)備,重定向stdin、stdout和stderr到控制臺(tái),最后,搜索文件系統(tǒng)中的init程序(或者由init=命令行參數(shù)指定的程序),并使用 execve()系統(tǒng)調(diào)用加載執(zhí)行init程序。
    init()函數(shù)到此結(jié)束,內(nèi)核的引導(dǎo)部分也到此結(jié)束了,這個(gè)由start_kernel()創(chuàng)建的第一個(gè)線程已經(jīng)成為一個(gè)用戶模式下的進(jìn)程了。此時(shí)系統(tǒng)中存在著六個(gè)運(yùn)行實(shí)體:
  • start_kernel()本身所在的執(zhí)行體,這其實(shí)是一個(gè)"手工"創(chuàng)建的線程,它在創(chuàng)建了init()線程以后就進(jìn)入cpu_idle()循環(huán)了,它不會(huì)在進(jìn)程(線程)列表中出現(xiàn)
  • init線程,由start_kernel()創(chuàng)建,當(dāng)前處于用戶態(tài),加載了init程序
  • kflushd核心線程,由init線程創(chuàng)建,在核心態(tài)運(yùn)行bdflush()函數(shù)
  • kupdate核心線程,由init線程創(chuàng)建,在核心態(tài)運(yùn)行kupdate()函數(shù)
  • kswapd核心線程,由init線程創(chuàng)建,在核心態(tài)運(yùn)行kswapd()函數(shù)
  • keventd核心線程,由init線程創(chuàng)建,在核心態(tài)運(yùn)行context_thread()函數(shù)對(duì)于I386平臺(tái)
    基本相同。對(duì)于2.4.x版內(nèi)核
    這一部分的啟動(dòng)過(guò)程在2.4.x內(nèi)核中簡(jiǎn)化了不少,缺省的獨(dú)立初始化過(guò)程只剩下網(wǎng)絡(luò) (sock_init())和創(chuàng)建事件管理核心線程,而其他所需要的初始化都使用__initcall()宏 包含在do_initcalls()函數(shù)中啟動(dòng)執(zhí)行。




    回頁(yè)首
    init進(jìn)程和inittab引導(dǎo)指令
    init進(jìn)程是系統(tǒng)所有進(jìn)程的起點(diǎn),內(nèi)核在完成核內(nèi)引導(dǎo)以后,即在本線程(進(jìn)程)空 間內(nèi)加載init程序,它的進(jìn)程號(hào)是1。
    init程序需要讀取/etc/inittab文件作為其行為指針,inittab是以行為單位的描述性(非執(zhí)行性)文本,每一個(gè)指令行都具有以下格式:
    id:runlevel:action:process其中id為入口標(biāo)識(shí)符,runlevel為運(yùn)行級(jí)別,action為動(dòng)作代號(hào),process為具體的執(zhí)行程序。
    id一般要求4個(gè)字符以內(nèi),對(duì)于getty或其他login程序項(xiàng),要求id與tty的編號(hào)相同,否則getty程序?qū)⒉荒苷9ぷ鳌?br /> runlevel是init所處于的運(yùn)行級(jí)別的標(biāo)識(shí),一般使用0-6以及S或s。0、1、6運(yùn)行級(jí)別被系統(tǒng)保留,0作為shutdown動(dòng)作,1作為重啟至單用戶模式,6為重啟;S和s意義相同,表示單用戶模式,且無(wú)需inittab文件,因此也不在inittab中出現(xiàn),實(shí)際上,進(jìn)入單用戶模式時(shí),init直接在控制臺(tái)(/dev/console)上運(yùn)行/sbin/sulogin。
    在一般的系統(tǒng)實(shí)現(xiàn)中,都使用了2、3、4、5幾個(gè)級(jí)別,在Redhat系統(tǒng)中,2表示無(wú)NFS支持的多用戶模式,3表示完全多用戶模式(也是最常用的級(jí)別),4保留給用戶自定義,5表示XDM圖形登錄方式。7-9級(jí)別也是可以使用的,傳統(tǒng)的Unix系統(tǒng)沒(méi)有定義這幾個(gè)級(jí)別。runlevel可以是并列的多個(gè)值,以匹配多個(gè)運(yùn)行級(jí)別,對(duì)大多數(shù)action來(lái)說(shuō),僅當(dāng)runlevel與當(dāng)前運(yùn)行級(jí)別匹配成功才會(huì)執(zhí)行。
    initdefault是一個(gè)特殊的action值,用于標(biāo)識(shí)缺省的啟動(dòng)級(jí)別;當(dāng)init由核心激活 以后,它將讀取inittab中的initdefault項(xiàng),取得其中的runlevel,并作為當(dāng)前的運(yùn)行級(jí) 別。如果沒(méi)有inittab文件,或者其中沒(méi)有initdefault項(xiàng),init將在控制臺(tái)上請(qǐng)求輸入 runlevel。
    sysinit、boot、bootwait等action將在系統(tǒng)啟動(dòng)時(shí)無(wú)條件運(yùn)行,而忽略其中的runlevel,其余的action(不含initdefault)都與某個(gè)runlevel相關(guān)。各個(gè)action的定義在inittab的man手冊(cè)中有詳細(xì)的描述。
    在Redhat系統(tǒng)中,一般情況下inittab都會(huì)有如下幾項(xiàng):
    id:3:initdefault:
    #表示當(dāng)前缺省運(yùn)行級(jí)別為3--完全多任務(wù)模式;
    si::sysinit:/etc/rc.d/rc.sysinit
    #啟動(dòng)時(shí)自動(dòng)執(zhí)行/etc/rc.d/rc.sysinit腳本
    l3:3:wait:/etc/rc.d/rc 3   
    #當(dāng)運(yùn)行級(jí)別為3時(shí),以3為參數(shù)運(yùn)行/etc/rc.d/rc腳本,init將等待其返回
    0:12345:respawn:/sbin/mingetty tty0
    #在1-5各個(gè)級(jí)別上以tty0為參數(shù)執(zhí)行/sbin/mingetty程序,打開(kāi)tty0終端用于
    #用戶登錄,如果進(jìn)程退出則再次運(yùn)行mingetty程序
    x:5:respawn:/usr/bin/X11/xdm -nodaemon
    #在5級(jí)別上運(yùn)行xdm程序,提供xdm圖形方式登錄界面,并在退出時(shí)重新執(zhí)行
    #記錄格式

    #   id:rstate:action:process


    #        id: 4個(gè)字符的唯一標(biāo)識(shí)


    #        rstate: 被調(diào)用的運(yùn)行級(jí)別, 可以為多個(gè)級(jí)別,為空則是所有級(jí)別


    #        action: 執(zhí)行的動(dòng)作。   

    #            respawn: 如果該進(jìn)程不存在,則運(yùn)行,并繼續(xù)掃描inittab,執(zhí)行其他項(xiàng)目。如果改進(jìn)程結(jié)束,init將,重啟該進(jìn)程

    #            wait:    運(yùn)行該進(jìn)程,并等待結(jié)束,在處理其他記錄

    #            once: 運(yùn)行該進(jìn)程,并繼續(xù)其他記錄,進(jìn)程中止了也不在運(yùn)行

    #            sysinit: 只有在啟動(dòng)或重啟并首先進(jìn)入單用戶模式時(shí)調(diào)用。并等待結(jié)束,不指定運(yùn)行界別

    #            initdefault: 指定默認(rèn)級(jí)別,如果沒(méi)指定,則要求用戶指定一個(gè)

    #            ctrlaltdel: 同時(shí)按下ctrl+alt+del鍵執(zhí)行


    #            boot: 系統(tǒng)啟動(dòng)時(shí)調(diào)用,并繼續(xù)其他記錄,進(jìn)程中止,不在運(yùn)行

    #            bootwait: 第一次從單用戶到多用戶模式時(shí)調(diào)用,并等待結(jié)束,中止不再運(yùn)行

    #            powerfail: 當(dāng)接到斷電信號(hào)(SIGPWR), 運(yùn)行

    #            powerwait: 同上,并等待結(jié)束

    #            off: 如果指定進(jìn)程存在,則向它發(fā)出SIGTERM

    #            ondemand: 同respawn, 但與運(yùn)行級(jí)別無(wú)關(guān),只用于a,b,c字段


    #        process: 指定要運(yùn)行的進(jìn)程




    回頁(yè)首
    rc啟動(dòng)腳本
    上一節(jié)已經(jīng)提到init進(jìn)程將啟動(dòng)運(yùn)行rc腳本,這一節(jié)將介紹rc腳本具體的工作。
    一般情況下,rc啟動(dòng)腳本都位于/etc/rc.d目錄下,rc.sysinit中最常見(jiàn)的動(dòng)作就是激活交換分區(qū),檢查磁盤(pán),加載硬件模塊,這些動(dòng)作無(wú)論哪個(gè)運(yùn)行級(jí)別都是需要優(yōu)先執(zhí)行的。僅當(dāng)rc.sysinit執(zhí)行完以后init才會(huì)執(zhí)行其他的boot或bootwait動(dòng)作。
    如果沒(méi)有其他boot、bootwait動(dòng)作,在運(yùn)行級(jí)別3下,/etc/rc.d/rc將會(huì)得到執(zhí)行,命令行參數(shù)為3,即執(zhí)行/etc/rc.d/rc3.d/目錄下的所有文件。rc3.d下的文件都是指向/etc/rc.d/init.d/目錄下各個(gè)Shell腳本的符號(hào)連接,而這些腳本一般能接受start、stop、restart、status等參數(shù)。rc腳本以start參數(shù)啟動(dòng)所有以S開(kāi)頭的腳本,在此之前,如果相應(yīng)的腳本也存在K打頭的鏈接,而且已經(jīng)處于運(yùn)行態(tài)了(以/var/lock/subsys/下的文件作為標(biāo)志),則將首先啟動(dòng)K開(kāi)頭的腳本,以stop作為參數(shù)停止這些已經(jīng)啟動(dòng)了的服務(wù),然后再重新運(yùn)行。顯然,這樣做的直接目的就是當(dāng)init改變運(yùn)行級(jí)別時(shí),所有相關(guān)的服務(wù)都將重啟,即使是同一個(gè)級(jí)別。
    rc程序執(zhí)行完畢后,系統(tǒng)環(huán)境已經(jīng)設(shè)置好了,下面就該用戶登錄系統(tǒng)了。




    回頁(yè)首
    getty和login
    在rc返回后,init將得到控制,并啟動(dòng)mingetty(見(jiàn)第五節(jié))。mingetty是getty的簡(jiǎn)化,不能處理串口操作。getty的功能一般包括:
  • 打開(kāi)終端線,并設(shè)置模式
  • 輸出登錄界面及提示,接受用戶名的輸入
  • 以該用戶名作為login的參數(shù),加載login程序注:用于遠(yuǎn)程登錄的提示信息位于/etc/issue.net中。
    login程序在getty的同一個(gè)進(jìn)程空間中運(yùn)行,接受getty傳來(lái)的用戶名參數(shù)作為登錄 的用戶名。
    如果用戶名不是root,且存在/etc/nologin文件,login將輸出nologin文件的內(nèi)容, 然后退出。這通常用來(lái)系統(tǒng)維護(hù)時(shí)防止非root用戶登錄。
    只有/etc/securetty中登記了的終端才允許root用戶登錄,如果不存在這個(gè)文件, 則root可以在任何終端上登錄。/etc/usertty文件用于對(duì)用戶作出附加訪問(wèn)限制,如果 不存在這個(gè)文件,則沒(méi)有其他限制。
    當(dāng)用戶登錄通過(guò)了這些檢查后,login將搜索/etc/passwd文件(必要時(shí)搜索 /etc/shadow文件)用于匹配密碼、設(shè)置主目錄和加載shell。如果沒(méi)有指定主目錄,將 默認(rèn)為根目錄;如果沒(méi)有指定shell,將默認(rèn)為/bin/sh。在將控制轉(zhuǎn)交給shell以前, getty將輸出/var/log/lastlog中記錄的上次登錄系統(tǒng)的信息,然后檢查用戶是否有新 郵件(/usr/spool/mail/{username})。在設(shè)置好shell的uid、gid,以及TERM,PATH 等環(huán)境變量以后,進(jìn)程加載shell,login的任務(wù)也就完成了。




    回頁(yè)首
    bash
    運(yùn)行級(jí)別3下的用戶login以后,將啟動(dòng)一個(gè)用戶指定的shell,以下以/bin/bash為例繼續(xù)我們的啟動(dòng)過(guò)程。
    bash是Bourne Shell的GNU擴(kuò)展,除了繼承了sh的所有特點(diǎn)以外,還增加了很多特 性和功能。由login啟動(dòng)的bash是作為一個(gè)登錄shell啟動(dòng)的,它繼承了getty設(shè)置的TERM、PATH等環(huán)境變量,其中PATH對(duì)于普通用戶為"/bin:/usr/bin:/usr/local/bin",對(duì)于root 為"/sbin:/bin:/usr/sbin:/usr/bin"。作為登錄shell,它將首先尋找/etc/profile 腳本文件,并執(zhí)行它;然后如果存在~/.bash_profile,則執(zhí)行它,否則執(zhí)行 ~/.bash_login,如果該文件也不存在,則執(zhí)行~/.profile文件。然后bash將作為一個(gè) 交互式shell執(zhí)行~/.bashrc文件(如果存在的話),很多系統(tǒng)中,~/.bashrc都將啟動(dòng) /etc/bashrc作為系統(tǒng)范圍內(nèi)的配置文件。
    當(dāng)顯示出命令行提示符的時(shí)候,整個(gè)啟動(dòng)過(guò)程就結(jié)束了。此時(shí)的系統(tǒng),運(yùn)行著內(nèi)核, 運(yùn)行著幾個(gè)核心線程,運(yùn)行著init進(jìn)程,運(yùn)行著一批由rc啟動(dòng)腳本激活的守護(hù)進(jìn)程(如 inetd等),運(yùn)行著一個(gè)bash作為用戶的命令解釋器。




    回頁(yè)首
    附:XDM方式登錄
    如果缺省運(yùn)行級(jí)別設(shè)為5,則系統(tǒng)中不光有1-6個(gè)getty監(jiān)聽(tīng)著文本終端,還有啟動(dòng)了一個(gè)XDM的圖形登錄窗口。登錄過(guò)程和文本方式差不多,也需要提供用戶名和口令,XDM 的配置文件缺省為/usr/X11R6/lib/X11/xdm/xdm-config文件,其中指定了 /usr/X11R6/lib/X11/xdm/xsession作為XDM的會(huì)話描述腳本。登錄成功后,XDM將執(zhí)行這個(gè)腳本以運(yùn)行一個(gè)會(huì)話管理器,比如gnome-session等。
    除了XDM以外,不同的窗口管理系統(tǒng)(如KDE和GNOME)都提供了一個(gè)XDM的替代品,如gdm和kdm,這些程序的功能和XDM都差不多。
    關(guān)于作者


    楊沙洲,男,現(xiàn)攻讀國(guó)防科大計(jì)算機(jī)學(xué)院計(jì)算機(jī)軟件方向博士學(xué)位。您可以通過(guò)電子郵件
    [email=pubb@163.net?cc=pubb@163.net]pubb@163.net[/email]
    跟他聯(lián)系。
                   
                   
                   
                   
                   
                   
                   

    本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u3/91445/showart_2068557.html
  • 您需要登錄后才可以回帖 登錄 | 注冊(cè)

    本版積分規(guī)則 發(fā)表回復(fù)

      

    北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年舉報(bào)專區(qū)
    中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
    感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP