0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Openwrt開(kāi)發(fā)指南 第13章 OpenWrt啟動(dòng)流程

嵌入式大雜燴 ? 來(lái)源:嵌入式大雜燴 ? 作者:嵌入式大雜燴 ? 2023-06-29 09:09 ? 次閱讀

1 系統(tǒng)介紹

任何系統(tǒng)的啟動(dòng)都是開(kāi)發(fā)人員首要關(guān)注的問(wèn)題,因?yàn)橹挥辛私饬讼到y(tǒng)的啟動(dòng)流程和啟動(dòng)機(jī)制,才能真正掌握一個(gè)系統(tǒng),如果對(duì)啟動(dòng)的啟動(dòng)不熟悉的話,是不可能真正用好一個(gè)系統(tǒng),openwrt系統(tǒng)也不例外,他的啟動(dòng)和一般的嵌入式系統(tǒng)啟動(dòng)還有所區(qū)別,現(xiàn)在咱們就分析一下openwrt的啟動(dòng)流程。

2 內(nèi)核補(bǔ)丁

在Openwrt的官網(wǎng)上面下載的源碼,其中包括了一些內(nèi)核補(bǔ)丁,這里究竟為什么要給內(nèi)核做補(bǔ)丁呢?因?yàn)镺penwrt為了支持更多的路由器,更多的操作和Openwrt特有的一些內(nèi)核功能,linux源碼是不具備的,這樣Openwrt為了增加這些功能,就需要在linux官網(wǎng)上面下載的源代碼中做一些修改,在這里體現(xiàn)為給linux源碼打補(bǔ)丁。Openwrt源碼中的linux補(bǔ)丁文件放在target/linux/generic文件下面,有對(duì)于不同版本的linux內(nèi)核補(bǔ)丁文件。MT7621采用的是4.14版本的內(nèi)核,所以他的補(bǔ)丁文件在patches-3.10目錄下面。這里是所有的內(nèi)核補(bǔ)丁文件,在編譯Openwrt的時(shí)候,會(huì)首先把他們拷貝到內(nèi)核目錄下面,然后在內(nèi)核上面打上這些補(bǔ)丁,然后再編譯內(nèi)核。咱們首先分析他對(duì)于linux啟動(dòng)的補(bǔ)丁,它的名字是921-use_preinit_as_init.patch(在Ubuntu源文件中),咱們可以看看他的內(nèi)容。

1687957914523ryq8uqu368

可以看到他它修改linux內(nèi)核中默認(rèn)的啟動(dòng)項(xiàng),可以看到它首先啟動(dòng)/etc/preinit(開(kāi)發(fā)板的文件系統(tǒng)中),它是個(gè)腳本,咱們就從這個(gè)腳本說(shuō)起。

3 preinit

preinit腳本在etc目錄下面,首先先看看他的內(nèi)容:

1687957915143b9s2vhfo5j

1687957915417zyxxhzksdm

16879579156795p1y7yz6ui

這就是個(gè)bash腳本,前半部分只是定義了一些變量,先記住他們的內(nèi)容即可,有兩個(gè)函數(shù)是我們需要了解的,boot_hook_init和boot_run_hook。他們定義在/lib/functions/preinit.sh文件中,boot_hook_init是初始化一個(gè)函數(shù)隊(duì)列,boot_run_hook是運(yùn)行一個(gè)函數(shù)隊(duì)列,還有一個(gè)這個(gè)文件沒(méi)有體現(xiàn),后面的文件中會(huì)遇到,這里說(shuō)明一下,boot_book_add這個(gè)是在一個(gè)函數(shù)隊(duì)列中添加一個(gè)函數(shù)。然后就是執(zhí)行:

1687957915922vlcbm60zd8

循環(huán)執(zhí)行/lib/preinit 目錄下面的腳本,這里簡(jiǎn)要分析/lib/preinit目錄下的一個(gè)文件,循環(huán)執(zhí)行/lib/preinit目錄下面的腳本,這里簡(jiǎn)要分析一個(gè),這里分析02_default_set_state,首先看看他的內(nèi)容。

1687957916173xsnmntpb28

可以看到它就是在preinit_main函數(shù)隊(duì)列中增加一個(gè)函數(shù),這個(gè)函數(shù)就是簡(jiǎn)單的執(zhí)行一個(gè)腳本。當(dāng)運(yùn)行preinit_main的時(shí)候,隊(duì)列中的所有函數(shù)就會(huì)依次執(zhí)行。其他文件可以自行分析,都比較簡(jiǎn)單。

最后在preinit腳本中執(zhí)行preinit_main。執(zhí)行完這個(gè)腳本之后init進(jìn)程會(huì)根據(jù)inittab文件執(zhí)行其他的啟動(dòng)項(xiàng)。

4 inittab

inittab為linux初始化文件系統(tǒng)時(shí)init初始化程序用到的配置文件。這個(gè)文件負(fù)責(zé)設(shè)置init初始化程序初始化腳本在哪里;每個(gè)運(yùn)行級(jí)初始化時(shí)運(yùn)行的命令;開(kāi)機(jī)、關(guān)機(jī)、重啟對(duì)應(yīng)的命令;各運(yùn)行級(jí)登陸時(shí)所運(yùn)行的命令。

如果存在/etc/inittab文件,Busyboxinit程序解析它,然后按照它的指示創(chuàng)建各種子進(jìn)程,否則使用默認(rèn)的配置創(chuàng)建子進(jìn)程。

/etc/inittab文件中每個(gè)條目用來(lái)定義一個(gè)子進(jìn)程,并確定它的啟動(dòng)方法,格式如下

:::

1、id:表示這個(gè)子進(jìn)程要使用的控制臺(tái),如果省略,則使用與init進(jìn)程一樣的控制臺(tái).

2、runlevels:這個(gè)字段沒(méi)有意義,可以省略。在linux有意義.

3、action:表示init進(jìn)程如何控制這個(gè)子進(jìn)程,具體取值見(jiàn)下表.

4、process:要執(zhí)行的程序,它可以是可執(zhí)行程序,也可以是腳本.如果process字段前有“-”字符,這個(gè)程序被稱為“交互的”.

【attention】action取值

名稱 執(zhí)行條件 說(shuō)明
sysinit 系統(tǒng)啟動(dòng)后最先執(zhí)行 指定初始化腳本路徑,只執(zhí)行一次,init進(jìn)程等待它結(jié)束才繼續(xù)執(zhí)行其它動(dòng)作
wait 系統(tǒng)執(zhí)行完sysinit進(jìn)程后 只執(zhí)行一次,init進(jìn)程等待它結(jié)束才繼續(xù)執(zhí)行其它動(dòng)作
once 系統(tǒng)執(zhí)行完wait進(jìn)程后 只執(zhí)行一次,init進(jìn)程不等待它結(jié)束
respawn 啟動(dòng)完once進(jìn)程后 init進(jìn)程監(jiān)測(cè)發(fā)現(xiàn)子進(jìn)程退出時(shí),重新啟動(dòng)它,永不結(jié)束.如Shell命令解釋器
askfirst 啟動(dòng)完respawn進(jìn)程后 與respawn類似,不過(guò)init進(jìn)程先輸出“Please pressEntertoactivatethis console”,等用戶輸入回車后才啟動(dòng)子進(jìn)程
shutdown 當(dāng)系統(tǒng)關(guān)機(jī)時(shí) 即重啟、關(guān)閉系統(tǒng)時(shí)執(zhí)行的程序
restart 系統(tǒng)重啟時(shí) init進(jìn)程重啟時(shí)執(zhí)行的程序,通常是init程序本身先重新讀取、解析/etc/inittab文件,再執(zhí)行restart程序
ctrl+alt+del 按下Ctrl+Alt+Del 鍵時(shí)按Ctrl+Alt+Del組合鍵時(shí)執(zhí)行的程序

先肯看/etc/inittab中的內(nèi)容:

16879579166909bk7d607ww

從上面的分析可以看出它在開(kāi)機(jī)啟動(dòng)的時(shí)候執(zhí)行/etc/init.d/rcS腳本,以前是有/etc/init.d/rcS腳本的,現(xiàn)在的openwrt已經(jīng)去掉了這個(gè)腳本文件,只要有rcSSboot這幾個(gè)參數(shù)就可以,但是功能是有的就是按順序執(zhí)行/etc/rc.d下面的各個(gè)腳本,以S開(kāi)頭代表啟動(dòng)的時(shí)候執(zhí)行的腳本,與命令行中的S對(duì)應(yīng),以K開(kāi)頭的代表關(guān)機(jī)的時(shí)候需要執(zhí)行的腳本,與命令行中的K對(duì)應(yīng)。

5 總結(jié)

從上面的分析我們來(lái)總結(jié)一下openwrt的啟動(dòng)流,/etc/preinit->/lib/preinit/->/etc/inittab->/etc/rc.d/S。

1687957916947kp3rounhet

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5052

    文章

    18906

    瀏覽量

    300699
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4256

    瀏覽量

    62223
  • OpenWrt
    +關(guān)注

    關(guān)注

    10

    文章

    123

    瀏覽量

    39227
  • 啟動(dòng)流程
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    6460
  • 腳本
    +關(guān)注

    關(guān)注

    1

    文章

    383

    瀏覽量

    14792
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Openwrt開(kāi)發(fā)指南 25 配置OpenWrt支持網(wǎng)絡(luò)攝像頭

    Openwrt開(kāi)發(fā)指南 25 配置OpenWrt支持網(wǎng)絡(luò)攝像頭
    的頭像 發(fā)表于 07-13 08:56 ?2203次閱讀
    <b class='flag-5'>Openwrt</b><b class='flag-5'>開(kāi)發(fā)指南</b> <b class='flag-5'>第</b>25<b class='flag-5'>章</b> 配置<b class='flag-5'>OpenWrt</b>支持網(wǎng)絡(luò)攝像頭

    Openwrt開(kāi)發(fā)指南 1 OpenWrt入門(mén)

    如果要學(xué)習(xí)openwrt的話,買(mǎi)些列表中二手的路由器來(lái)實(shí)踐下更容易學(xué)習(xí),大部分要升級(jí)一下rom芯片和內(nèi)存芯片,典型配置都是4M、64M。
    的頭像 發(fā)表于 06-27 09:09 ?4063次閱讀

    Openwrt開(kāi)發(fā)指南 2 OpenWrt開(kāi)發(fā)環(huán)境搭建

    開(kāi)發(fā)PC機(jī)上的軟件時(shí),可以直接在PC機(jī)上編輯、編譯、調(diào)試軟件,最終發(fā)布的軟件也是在PC機(jī)上運(yùn)行。對(duì)于物聯(lián)網(wǎng)OpenWrt開(kāi)發(fā),最初的嵌入式設(shè)備是一個(gè)空白的系統(tǒng),需要通過(guò)主機(jī)為它構(gòu)建基本的軟件系統(tǒng),并
    的頭像 發(fā)表于 06-27 09:09 ?6555次閱讀
    <b class='flag-5'>Openwrt</b><b class='flag-5'>開(kāi)發(fā)指南</b> <b class='flag-5'>第</b>2<b class='flag-5'>章</b> <b class='flag-5'>OpenWrt</b><b class='flag-5'>開(kāi)發(fā)</b>環(huán)境搭建

    Openwrt開(kāi)發(fā)指南 3 OpenWrt下載及配置

    編譯OpenWrt首先需要下載源碼,OpenWrt的源碼是通過(guò)git下載,OpenWrt目前已經(jīng)很好的支持了MT7620、MT7821等芯片,因此OpenWrt系統(tǒng)完全可以用于MT76
    的頭像 發(fā)表于 06-27 09:10 ?5136次閱讀
    <b class='flag-5'>Openwrt</b><b class='flag-5'>開(kāi)發(fā)指南</b> <b class='flag-5'>第</b>3<b class='flag-5'>章</b> <b class='flag-5'>OpenWrt</b>下載及配置

    Openwrt開(kāi)發(fā)指南 4 燒寫(xiě)OpenWrt固件

    對(duì)于一個(gè)完整的嵌入式系統(tǒng),它由U-boot、內(nèi)核(Linux)、文件系統(tǒng)、應(yīng)用程序四部分組成。那么這四部分之間的關(guān)系是怎么樣的呢?OpenWrt是屬于哪部分呢?
    的頭像 發(fā)表于 06-27 09:11 ?4488次閱讀
    <b class='flag-5'>Openwrt</b><b class='flag-5'>開(kāi)發(fā)指南</b> <b class='flag-5'>第</b>4<b class='flag-5'>章</b> 燒寫(xiě)<b class='flag-5'>OpenWrt</b>固件

    Openwrt開(kāi)發(fā)指南 7 添加Web界面

    LUA語(yǔ)言的官方版本只包括一個(gè)精簡(jiǎn)的核心和最基本的庫(kù)。這使得LUA體積小、啟動(dòng)速度快,從而適合嵌入在別的程序里。UCI是OpenWrt中為實(shí)現(xiàn)所有系統(tǒng)配置的一個(gè)統(tǒng)一接口,英文名UnifiedConfigurationInterface,即統(tǒng)一配置接口。LuCI,即是這兩個(gè)
    的頭像 發(fā)表于 06-29 09:04 ?3577次閱讀
    <b class='flag-5'>Openwrt</b><b class='flag-5'>開(kāi)發(fā)指南</b> <b class='flag-5'>第</b>7<b class='flag-5'>章</b> 添加Web界面

    Openwrt開(kāi)發(fā)指南 12 添加OpenWrt軟件包

    OpenWrt是一個(gè)比較完善的嵌入式Linux開(kāi)發(fā)平臺(tái),在無(wú)線路由器應(yīng)用上已有4000多個(gè)軟件包。我們可以在其基礎(chǔ)上增加軟件包,以擴(kuò)大其應(yīng)用范圍。在OpenWrt中增加軟件包極其方便,按照
    的頭像 發(fā)表于 06-29 09:09 ?8415次閱讀

    Openwrt開(kāi)發(fā)指南 14 統(tǒng)一接口配置UCI

    UCI即統(tǒng)一接口配置(UnifiedConfigurationInterface)的簡(jiǎn)稱,它被應(yīng)用于OpenWrt系統(tǒng)上面。
    的頭像 發(fā)表于 06-29 09:11 ?2877次閱讀

    Openwrt開(kāi)發(fā)指南 17 驅(qū)動(dòng)開(kāi)發(fā)之字符設(shè)備驅(qū)動(dòng)程序

    首先將 RT5350_drv 文件夾傳到 OpenWrt 源碼的chaos_calmer/package/kernel 目錄下。然后進(jìn)入 OpenWrt 源碼的頂層目錄,執(zhí)行 make menuconfig。
    的頭像 發(fā)表于 07-02 09:20 ?3029次閱讀
    <b class='flag-5'>Openwrt</b><b class='flag-5'>開(kāi)發(fā)指南</b> <b class='flag-5'>第</b>17<b class='flag-5'>章</b> 驅(qū)動(dòng)<b class='flag-5'>開(kāi)發(fā)</b>之字符設(shè)備驅(qū)動(dòng)程序

    Openwrt開(kāi)發(fā)指南 22 Openwrt串口的使用2

    在上一中,我們成功的讓驅(qū)動(dòng)程序支持了串口 2,并且做了簡(jiǎn)單的測(cè)試。接下來(lái),我們就為串口 2 添加一個(gè)應(yīng)用程序,從而實(shí)現(xiàn) Wi-Fi 串口。實(shí)現(xiàn)過(guò)程非常簡(jiǎn)單,首先進(jìn)入 OpenWrt 系統(tǒng)源碼,然后運(yùn)行 make menuconfig 命令進(jìn)行配置。
    的頭像 發(fā)表于 07-05 09:09 ?3816次閱讀
    <b class='flag-5'>Openwrt</b><b class='flag-5'>開(kāi)發(fā)指南</b> <b class='flag-5'>第</b>22<b class='flag-5'>章</b> <b class='flag-5'>Openwrt</b>串口的使用2

    Openwrt開(kāi)發(fā)指南 24 配置開(kāi)發(fā)板支持U盤(pán)

    Openwrt開(kāi)發(fā)指南 24 配置開(kāi)發(fā)板支持U盤(pán)
    的頭像 發(fā)表于 07-13 08:55 ?2647次閱讀
    <b class='flag-5'>Openwrt</b><b class='flag-5'>開(kāi)發(fā)指南</b> <b class='flag-5'>第</b>24<b class='flag-5'>章</b> 配置<b class='flag-5'>開(kāi)發(fā)</b>板支持U盤(pán)

    Openwrt開(kāi)發(fā)指南 29 OpenWrt 防火墻介紹

    Openwrt 是一個(gè) GNU/Linux 的發(fā)行版, 和其他大多數(shù)的發(fā)行版一樣,Openwrt 的防火墻同樣也是基于 iptables。 在 OpenWRT 下防火墻的默認(rèn)行為已經(jīng)可以滿足路由器的需要,一般情況下也無(wú)需修改。
    的頭像 發(fā)表于 07-15 16:24 ?3273次閱讀
    <b class='flag-5'>Openwrt</b><b class='flag-5'>開(kāi)發(fā)指南</b> <b class='flag-5'>第</b>29<b class='flag-5'>章</b> <b class='flag-5'>OpenWrt</b> 防火墻介紹

    RT5350 Wi-Fi 模塊開(kāi)發(fā)指導(dǎo)_物聯(lián)網(wǎng) openwrt 開(kāi)發(fā)概述

    物聯(lián)網(wǎng)的資料 物聯(lián)網(wǎng)openwrt開(kāi)發(fā)概述 物聯(lián)網(wǎng)openwrt開(kāi)發(fā)概述 物聯(lián)網(wǎng)openwrt開(kāi)發(fā)
    發(fā)表于 11-16 14:52 ?0次下載

    openwrt開(kāi)發(fā)教程1~6

    openwrt開(kāi)發(fā)教程1~6
    發(fā)表于 03-17 14:23 ?53次下載

    openwrt都有什么功能_openwrt詳細(xì)功能介紹_openwrt刷機(jī)教程

    penWrt作為一個(gè)嵌入式的Linux發(fā)行版已經(jīng)得到廣泛的運(yùn)用,本文主要介紹了openWRT開(kāi)發(fā)背景、OpenWrt功能、openWRT特點(diǎn)以及op
    發(fā)表于 12-27 10:21 ?16.6w次閱讀
    <b class='flag-5'>openwrt</b>都有什么功能_<b class='flag-5'>openwrt</b>詳細(xì)功能介紹_<b class='flag-5'>openwrt</b>刷機(jī)教程