国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux內(nèi)核移植:內(nèi)核的啟動(dòng)過程分析、啟動(dòng)配置與rootfs必要文件

這篇具有很好參考價(jià)值的文章主要介紹了Linux內(nèi)核移植:內(nèi)核的啟動(dòng)過程分析、啟動(dòng)配置與rootfs必要文件。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、啟動(dòng)過程

?內(nèi)核啟動(dòng)通常包括4個(gè)階段:

  1. iROM代碼啟動(dòng)(BIOS啟動(dòng))。開發(fā)板上電后,先執(zhí)行內(nèi)部iROM中的固化代碼,類似于BIOS,執(zhí)行通電自檢和初始化過程,包括初始化CPU、存儲(chǔ)器、時(shí)鐘、總線等一些必要的硬件資源。
  2. 啟動(dòng)引導(dǎo)加載程序BootLoader。根據(jù)啟動(dòng)引腳的電平,讀取相應(yīng)的存儲(chǔ)介質(zhì)上的Uboot到RAM。接著,啟動(dòng)Uboot。U-Boot再根據(jù)用戶傳的參數(shù)加載內(nèi)核、設(shè)備樹、根文件系統(tǒng)。
  3. 裝載內(nèi)核。Linux內(nèi)核鏡像文件uImage被載入內(nèi)存后,首先將自身解壓,然后進(jìn)行系統(tǒng)的一系列初始化工作,包括初始化存儲(chǔ)器、中斷表、必要的設(shè)備驅(qū)動(dòng),設(shè)定分頁(yè)機(jī)制、任務(wù)調(diào)度機(jī)制,接著根據(jù)bootargs環(huán)境變量載入根文件系統(tǒng)。
  4. 系統(tǒng)初始化。根文件系統(tǒng)加載成功后,根據(jù)bootargs嘗試執(zhí)行/init命令。如果是RAMDisk,就嘗試執(zhí)行/init命令,否則,就嘗試執(zhí)行/sbin/init、 /etc/init、 /bin/init、 /bin/sh。如果其中任意一個(gè)能成功執(zhí)行,就進(jìn)人下一階段,否則,內(nèi)核啟動(dòng)失敗。

二、啟動(dòng)配置

Linux通常有3中系統(tǒng)初始化方式:SysV、systemd、UpStart。

(一)SysV初始化

init是系統(tǒng)的1號(hào)進(jìn)程,可以是可執(zhí)行腳本,或sysvinit,或者busybox的二進(jìn)制程序。ramdisk常用可執(zhí)行程序腳本程序的init,二進(jìn)制程序常依照/etc/inittab文件執(zhí)行初始化任務(wù)。管理員可以定制/etc/inittab 配置文件來建立所需的系統(tǒng)運(yùn)行環(huán)境。所以,/etc/inittab是rootfs中的重要文件。驗(yàn)證如下:

~$ ls /sbin/init -l
lrwxrwxrwx  1  1000  1000  14 Jan 25  2023 sbin/init -> ../bin/busybox

System V initialization是基于運(yùn)行級(jí)別(Runlevel)來啟動(dòng)系統(tǒng),用來設(shè)置不同環(huán)境下所運(yùn)行的程序和服務(wù)。使用運(yùn)行級(jí)別和對(duì)應(yīng)的鏈接文件(位于etc/rcn.d 目錄中,n為運(yùn)行級(jí)別,分別鏈接到/etc/init.d中的init 腳本)來啟動(dòng)和關(guān)閉系統(tǒng)服務(wù)。假設(shè)當(dāng)前inittab 中設(shè)置的默認(rèn)運(yùn)行級(jí)別是2,則init 進(jìn)程會(huì)運(yùn)行/etc/init.d/rc2命令,該命令會(huì)依據(jù)系統(tǒng)服務(wù)的依賴關(guān)系遍歷執(zhí)行/etc/rc2.d中的腳本或程序。/etc/rc2.d目錄中的文件實(shí)際都是指向/etc/init.d/下對(duì)應(yīng)的腳本或程序的軟鏈接。
init 進(jìn)程根據(jù)/etc/inittab中的配置初始化系統(tǒng),設(shè)置系統(tǒng)運(yùn)行級(jí)別及進(jìn)入各運(yùn)行級(jí)別對(duì)應(yīng)的要執(zhí)行的命令。inittab 提供了0~6的運(yùn)行級(jí)別選項(xiàng),runlevels是運(yùn)行級(jí)別列表(如下)。其中,1級(jí)(單用戶模式)和5級(jí)(多用戶標(biāo)準(zhǔn)模式)比較常用。系統(tǒng)工作不正常時(shí)使用單用戶模式維護(hù),工作正常時(shí)使用多用戶標(biāo)準(zhǔn)模式。在資源受限時(shí)(如沒有網(wǎng)絡(luò)環(huán)境或沒有圖形終端)可選擇2級(jí)。以S開頭的表示啟動(dòng),以K開頭的表示停止,并且S或K后面的兩位數(shù)數(shù)字代表了服務(wù)的啟動(dòng)順序,具體由服務(wù)依賴關(guān)系決定

# Runlevel 0:Halt.
# Runlevel 1:Single-user mode without networking,only for root.
# Runlevel 2:Multi-user mode without networking and daemons.
# Runlevel 3:Multi-user mode with networking.
# Runlevel 4:Not used or user-defined.
# Runlevel 5:Runlevel3+X-window,full functionally.
# Runlevel 6:Reboot.

(二)systemd初始化

新版本的Ubuntu使用systemd來初始化系統(tǒng),驗(yàn)證如下:

~$ ls /sbin/init -l
lrwxrwxrwx I root root 20 330 00:40 /sbin/init -> /lib/systemd/systemd

systemd最主要的功能包括系統(tǒng)的主機(jī)名稱、網(wǎng)絡(luò)設(shè)置定、語(yǔ)言處理、文件系統(tǒng)格式及其他系統(tǒng)服務(wù)和應(yīng)用服務(wù)的啟動(dòng)等。所有的這些任務(wù)都會(huì)通過systemd的默認(rèn)啟動(dòng)目標(biāo)(/etc/systemd/system/default.target)來配置。
systemd依次執(zhí)行相應(yīng)的各項(xiàng)任務(wù)來完成系統(tǒng)的最終啟動(dòng)。例如,systemd 首先執(zhí)行initrd.target所有單元,包括掛載/etc/fstab,最后執(zhí)行 graphical所需的服務(wù)以啟動(dòng)圖形界面來讓用戶以圖形界面登錄。如果系統(tǒng)的defaulttarget 指向multi-user.target,那么此步驟就不會(huì)執(zhí)行。

三、rootfs中的啟動(dòng)配置文件

1、inittab

基本的ininttab內(nèi)容如下:

#this is run first except when booting in single-user mode.
::sysinit:/etc/init.d/rcS
# /bin/sh invocations on selected ttys
# start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh
# stuff to do when restarting the init process
::restart:/sbin/init
# stuff to do before rebooting
::ctrlaltdel:/sbin/reboot

inittab 文件中的每一項(xiàng)按下面的格式設(shè)置:

id: runlevels: action: process

每一項(xiàng)有四個(gè)字段,字段之間用冒號(hào)隔開。每個(gè)字段的含義如下。
(1)起d由1~4個(gè)字符組成,作為inittab項(xiàng)的唯一標(biāo)識(shí)。
(2)runlevedls 是運(yùn)行級(jí)別列表。
(3)action指明執(zhí)行什么動(dòng)作
(4)process字段包含init執(zhí)行的進(jìn)程。
與系統(tǒng)啟動(dòng)相關(guān)的文件和目錄如下:

|--/etc/
|    |-- inittab	(init腳本)
|    |-- init.d/
|        |-- rc	(啟動(dòng)腳本)
|        |-- rcS	(啟動(dòng)腳本)
|        |-- rc.local(附加啟動(dòng)腳本)
|        |-- ....	(其他系統(tǒng)服務(wù)腳本)
|    |--rcS.d/		(S級(jí)服務(wù)管理目錄)
|        |-- ....	(init.d服務(wù)腳本鏈接)
|    |-- rc0.d/		(0級(jí)服務(wù)管理目錄)
|        |-- ....	(init.d服務(wù)腳本鏈接)

2、/etc/init.d/rcS 腳本

   #!/bin/sh
    #
    # rcS           Call all S??* scripts in /etc/rcS.d in
    #               numerical/alphabetical order.
    #
    # Version:      @(#)/etc/init.d/rcS  2.76  19-Apr-1999  miquels@cistron.nl
    #
  
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    runlevel=S
    prevlevel=N
    umask 022
    export PATH runlevel prevlevel
  
    #    Make sure proc is mounted
    #
    [ -d "/proc/1" ] || mount /proc
  
    #
    #       Source defaults.
    # 設(shè)置環(huán)境變量
    #./etc/default/rcS
  
    #
    #       Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
    #
    trap ":" INT QUIT TSTP
  
    #
    #   Call all parts in order.
    # 
    # exec /etc/init.d/rc S
    
    /bin/mount -a

不要忘記為 rcS 添加可執(zhí)行權(quán)限:

$ chmod +x init.d/rcS

3、fstab

/etc/init.d/rcS中的mount -a。意思是將/etc/fstab的所有內(nèi)容重新加載。
/etc/fstab 文件負(fù)責(zé)配置Linux開機(jī)時(shí)自動(dòng)掛載的分區(qū)。

  • fstab中的文件掛載操作如下:
    ??<file system> <mount point> <type> <options> <dump> <pass>
    ?  <file system>:描述要掛載的特殊的塊設(shè)備或遠(yuǎn)程文件系統(tǒng),如/dev/cdrom /dev/sdb等,遠(yuǎn)程文件系統(tǒng)使用<host>:<dir>.
    ?  <mount point>:描述文件系統(tǒng)的掛載點(diǎn);如果是一個(gè)交換分區(qū)(swap partitions),這個(gè)域應(yīng)寫為‘none’.
    ?  <type>:描述文件系統(tǒng)的類型,Linux支持許多文件系統(tǒng)類型,如adfs, affs, autofs, coda, coherent, cramfs,devpts, efs, ext2, ext3, hfs, hpfs, iso9660, jfs, minix, msdos, ncpfs, nfs,ntfs, proc, qnx4, reiserfs, romfs, smbfs, sysv, tmpfs, udf, ufs, umsdos,vfat, xenix, xfs,等。
    ?  <options>:描述關(guān)于這個(gè)文件系統(tǒng)的掛載選項(xiàng),基本的選項(xiàng)如下:
    ?    default:使用默認(rèn)選項(xiàng),rw, suid, dev, exec, auto, nouser, and async
    ?    noauto:當(dāng)啟動(dòng)時(shí)給出“mount -a”命令時(shí)并不掛載。
    ?    user:允許用戶掛載
    ?    owner:允許設(shè)備自己掛載
    ?    comment:供fstab維護(hù)程序使用
    ?    nofail:如果這個(gè)設(shè)備不存在,不報(bào)告錯(cuò)誤信息
    ?  <dump>:當(dāng)其值設(shè)置為1時(shí)將允許dump備份程序備份;設(shè)置為0時(shí)忽略備份操作;如果文件系統(tǒng)需不需要被dump,則設(shè)置為0即可
    ?  <pass>:該字段由fsck程序用于確定在重新啟動(dòng)時(shí)文件系統(tǒng)檢查完成的順序,啟動(dòng)用的文件系統(tǒng)需要制定為1,其他文件系統(tǒng)需要指定為2,如果沒有此域或設(shè)置為0表示不檢查。其值是一個(gè)順序。當(dāng)其值為0時(shí),永遠(yuǎn)不檢查;而 / 根目錄分區(qū)永遠(yuǎn)都為1。其它分區(qū)從2開始,數(shù)字越小越先檢查,如果兩個(gè)分區(qū)的數(shù)字相同,則同時(shí)檢查

參考博文: 根文件系統(tǒng)(linuxrc、inittab、fstab)
例1:

#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0

例2:

none /dev/pts devpts gid=5,mode=620 0 0
none /proc proc defaults 0 0
nonc /dev/shm tmpfs defaults 0 0
/dev/hda4 swap swap dcfaults o 0
/dev/edrom /mntcdrom iso9660 noauto,owner,kudzu,ro 0 0
/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0
/dev/hdal /mnt/c vfat exec,dev,suid,rw,umask=0, iocharset=gb2312,codepage=936 0 0

例3:fstab中添加了mount nfs的配置:

192.168.1.7:/CBT-SuperIOT/ /mnt/nfs/ nfs nolock 0 0

4、profile 文件

#!/bin/sh
export HOSTNAME=farsight
export USER=root
export HOME=root
export PS1="[$USER@$HOSTNAME \W]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH

5、其他文件

service,inetd.conf,passwd文件,可以配置telnet服務(wù)器的配置和開啟:
確保fstab 文件中存在none /dev/pts devpts mode=0622 0 0這一行
確保services文件中存在 telnet 23/tcp這一行
確保 inetd.conf中存在telnet stream tcp nowait root /sbin/telnetd telnetd
確保passwd 文件中存在 root::0:0:root:/:/bin/sh ,表示沒有密碼的root 帳號(hào)文章來源地址http://www.zghlxwxcb.cn/news/detail-548740.html

到了這里,關(guān)于Linux內(nèi)核移植:內(nèi)核的啟動(dòng)過程分析、啟動(dòng)配置與rootfs必要文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 嵌入式開發(fā)之linux內(nèi)核移植

    嵌入式開發(fā)之linux內(nèi)核移植

    目錄 ?前言 一、下載內(nèi)核源碼 1.1 下載linux-3.0.1 1.2 解壓源碼文件 二、 內(nèi)核添加yaffs2文件系統(tǒng)支持 2.1 下載yaffs2 2.2 內(nèi)核添加yaffs2文件補(bǔ)丁 三、配置開發(fā)板 3.1 修改機(jī)器ID 3.2 添加開發(fā)板初始化文件 3.3 配置NandFalsh 3.3.1 添加NandFlash設(shè)備 3.3.2 添加NandFlash驅(qū)動(dòng) 3.3 修改Kconfig(支持

    2024年02月07日
    瀏覽(103)
  • 新唐NUC980使用記錄(5.10.y內(nèi)核):u-boot & linux & rootfs 編譯與燒錄測(cè)試(基于SD1位置SD卡)

    新唐NUC980使用記錄(5.10.y內(nèi)核):u-boot & linux & rootfs 編譯與燒錄測(cè)試(基于SD1位置SD卡)

    從去年(2022)開始新塘官方的NUC980 5.10.y內(nèi)核的項(xiàng)目開始展開,這篇文章將測(cè)試在NUC980上使用5.10.y內(nèi)核。 這篇文章中內(nèi)容均在下面的開發(fā)板上進(jìn)行測(cè)試: 《新唐NUC980使用記錄:自制開發(fā)板(基于NUC980DK61YC)》 對(duì)于NUC980芯片本身的一些內(nèi)容可以參考: 《新唐NUC980使用記錄:基

    2024年02月03日
    瀏覽(120)
  • 分享一種快速移植OpenHarmony Linux內(nèi)核的方法

    分享一種快速移植OpenHarmony Linux內(nèi)核的方法

    本文面向希望將 OpenHarmony 移植到三方芯片平臺(tái)硬件的開發(fā)者,介紹一種借助三方芯片平臺(tái)自帶 Linux 內(nèi)核的現(xiàn)有能力,快速移植 OpenHarmony 到三方芯片平臺(tái)的方法。 內(nèi)核態(tài)層和用戶態(tài)層 為了更好的解釋整個(gè)內(nèi)核移植,首先需要介紹一些概念: 我們可以把 OpenHarmony 簡(jiǎn)單的分為

    2024年04月26日
    瀏覽(27)
  • 嵌入式Linux底層系統(tǒng)開發(fā) +系統(tǒng)移植+內(nèi)核文件系統(tǒng)(基礎(chǔ))

    嵌入式Linux底層系統(tǒng)開發(fā) +系統(tǒng)移植+內(nèi)核文件系統(tǒng)(基礎(chǔ))

    搭建交叉編譯開發(fā)環(huán)境 bootloader的選擇和移植 kernel的配置、編譯、移植和調(diào)試 根文件系統(tǒng)的制作 前兩個(gè)要點(diǎn)通常芯片廠家提供。后邊兩個(gè)要點(diǎn)是公司的工作重點(diǎn)。 學(xué)習(xí)方法:先整體后局部,層層推進(jìn) 如何編譯—如何添加命令和功能—如何定義自己的開發(fā)板。 移植的基本步

    2024年02月03日
    瀏覽(101)
  • uboot 啟動(dòng)內(nèi)核代碼分析

    uboot 啟動(dòng)內(nèi)核代碼分析

    uboot的本質(zhì)就是一個(gè)復(fù)雜點(diǎn)的裸機(jī)程序。內(nèi)核本身也是一個(gè)\\\"裸機(jī)程序“,和uboot、和其他裸機(jī)程序并沒有本質(zhì)區(qū)別。 區(qū)別就是操作系統(tǒng)運(yùn)行起來后在軟件上分為內(nèi)核層和應(yīng)用層,分層后兩層的權(quán)限不同,在內(nèi)存訪問和設(shè)備操作的管理上更加精細(xì)(內(nèi)核可以隨便訪問各種硬件,

    2024年02月11日
    瀏覽(88)
  • (三)內(nèi)核移植--從零開始自制linux掌上電腦(F1C200S)<嵌入式項(xiàng)目>

    (三)內(nèi)核移植--從零開始自制linux掌上電腦(F1C200S)<嵌入式項(xiàng)目>

    目錄 一、bootloader、kernel、rootfs聯(lián)系 二、內(nèi)核移植 1. 內(nèi)核源碼獲取 2. 內(nèi)核配置與編譯 ?? 基礎(chǔ)配置與編譯 ?? TF卡分區(qū) ?? 內(nèi)核燒錄 三、參考內(nèi)容 kernel可以理解為一個(gè) 龐大的裸機(jī)程序 ,和uboot以及其他比如點(diǎn)燈類似的裸機(jī)程序沒有本質(zhì)區(qū)別,只是kernel分為 用戶態(tài)和內(nèi)核態(tài)

    2024年02月15日
    瀏覽(92)
  • i.MX6ULL移植NXP官方Linux內(nèi)核imx_5.4.47_2.2.0

    i.MX6ULL移植NXP官方Linux內(nèi)核imx_5.4.47_2.2.0

    系統(tǒng):Ubuntu18.04 參考資料:百問網(wǎng) IMX6ULL開發(fā)板(從零移植篇-預(yù)覽版)-V0.1,正點(diǎn)原子驅(qū)動(dòng)開發(fā)指南 開發(fā)板:100ask i.MX6ULL PRO 交叉編譯工具鏈的獲取就不寫了 打開 .bashrc 文件。 vi ~/.bashrc 。在該文件最后面添加如下(根據(jù)自己的交叉編譯工具鏈) (1)直接從官網(wǎng)下載,非常慢而

    2024年02月12日
    瀏覽(95)
  • Linux 內(nèi)核線程啟動(dòng)以及內(nèi)核調(diào)用應(yīng)用層程序

    #include linux/kthread.h //內(nèi)核線程頭文件 ? static task_struct *test_task; test_task = kthread_run(thread_function, NULL, \\\"test_thread_name\\\"); if(IS_ERR(test_task)) { ? ? ? ? pr_err(\\\"test_thread_name create failn\\\"); } static int thread_function(void *arg) { ? ? char *envp[3]; ? ? char *argv[3]; ? ? int ret= 0; ? ? argv[0] = \\\"/bin/sh\\\"; ?

    2024年02月12日
    瀏覽(97)
  • 【Linux內(nèi)核解析-linux-5.14.10-內(nèi)核源碼注釋】?jī)?nèi)核啟動(dòng)kernel_init解釋

    【Linux內(nèi)核解析-linux-5.14.10-內(nèi)核源碼注釋】?jī)?nèi)核啟動(dòng)kernel_init解釋

    static int __ref kernel_init(void *unused) : 聲明一個(gè)靜態(tài)整型函數(shù) kernel_init() ,該函數(shù)不會(huì)被其他文件訪問,使用 __ref 標(biāo)記表示該函數(shù)是可重定位的,并且該函數(shù)不需要任何參數(shù)。 wait_for_completion(kthreadd_done); : 等待 kthreadd 線程完成初始化, wait_for_completion() 函數(shù)會(huì)阻塞當(dāng)前進(jìn)程,直到

    2024年02月02日
    瀏覽(97)
  • Linux 內(nèi)核模塊加載過程之重定位

    1.1.1 struct load_info info 加載模塊只需要讀入模塊的二進(jìn)制代碼即可,然后執(zhí)行init_module系統(tǒng)調(diào)用。 我們先介紹下struct load_info info結(jié)構(gòu)體。 struct load_info 是一個(gè)用于加載模塊時(shí)存儲(chǔ)相關(guān)信息的數(shù)據(jù)結(jié)構(gòu)。 該結(jié)構(gòu)體包含以下成員: name:模塊的名稱,以字符串形式存儲(chǔ)。 mod:指向

    2024年02月10日
    瀏覽(645)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包