女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

kernel執(zhí)行第一個(gè)init應(yīng)用程序的實(shí)現(xiàn)原理

冬至子 ? 來源:linux與SoC ? 作者:linux與SoC ? 2023-06-05 14:53 ? 次閱讀

1. 概述

Linux系統(tǒng)啟動(dòng)過程中通過init_task創(chuàng)建0號(hào)idle進(jìn)程。然后通過kernel_thread創(chuàng)建1號(hào)init進(jìn)程。創(chuàng)建該進(jìn)程時(shí)通過系統(tǒng)調(diào)用,在內(nèi)核空間執(zhí)行用戶空間的/sbin/init程序,通過該程序產(chǎn)生出shell,并依賴init衍生出其他進(jìn)程。通過top命令查看當(dāng)前系統(tǒng)環(huán)境下的進(jìn)程列表,可以發(fā)現(xiàn)1號(hào)進(jìn)程的為{linuxrc} init

[root@iTOP-4412]# top
Mem: 26404K used, 948572K free, 0K shrd, 3199543672K buff, 0K cached
CPU:  0.0% usr  6.0% sys  0.0% nic 94.0% idle  0.0% io  0.0% irq  0.0% sirq
Load average: 0.00 0.00 0.00 1/78 162
  PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND
  162   132 root     R     3264  0.3   0  4.5 top
    3     2 root     IW       0  0.0   0  1.5 [kworker/0:0]
  132     1 root     S     3268  0.3   2  0.0 -/bin/sh
    1     0 root     S     3264  0.3   2  0.0 {linuxrc} init
...

我們?cè)趉ernel代碼中會(huì)發(fā)現(xiàn),創(chuàng)建1號(hào)init進(jìn)程的方式,主要包括以下3種,如下圖所示:

圖片

2. 創(chuàng)建init進(jìn)程的方式

2.1 ramdisk方式

在ramdisk環(huán)境下創(chuàng)建init進(jìn)程時(shí),需要在kernel CMDLINE中設(shè)置init程序的路徑位置,如下所示:

CONFIG_CMDLINE="...root=/dev/ram rdinit=/sbin/init..."

在kernel代碼中通過rdinit_setup()解析kernel CMDLINErdinit=字符串,賦值給全局變量ramdisk_execute_command。

static int __init rdinit_setup(char *str)
{
 unsigned int i;

 ramdisk_execute_command = str;
 /* See "auto" comment in init_setup */
 for (i = 1; i < MAX_INIT_ARGS; i++)
  argv_init[i] = NULL;
 return 1;
}
__setup("rdinit=", rdinit_setup);

當(dāng)完成ramdisk_execute_command賦值后,在kernel_init_freeable()對(duì)ramdisk_execute_command進(jìn)行檢查,若未檢查到有效的字符串,則將ramdisk_execute_command賦值為/init。然后,對(duì)ramdisk_execute_command進(jìn)行訪問權(quán)限檢查,若失敗,則進(jìn)行rootfs掛載。

static noinline void __init kernel_init_freeable(void)
{
...
 if (!ramdisk_execute_command)
  ramdisk_execute_command = "/init";

 if (ksys_access((const char __user *)
   ramdisk_execute_command, 0) != 0) {
  ramdisk_execute_command = NULL;
  prepare_namespace();
 }
...
}

ramdisk_execute_command檢查成功,則進(jìn)入kernel_init()中,執(zhí)行指定的init程序。

static int __ref kernel_init(void *unused)
{
 int ret;

 kernel_init_freeable();
 ...
 if (ramdisk_execute_command) {
  ret = run_init_process(ramdisk_execute_command);
  if (!ret)
   return 0;
  pr_err("Failed to execute %s (error %d)\\n",
         ramdisk_execute_command, ret);
 }
...
}

2.2 execute_command方式

通過kernel CMDLINE可以設(shè)定執(zhí)行的init程序,例如:

CONFIG_CMDLINE="root=/dev/mmcblk1p2 rw console=ttySAC2,115200 init=/linuxrc rootwait"

在kernel代碼中通過init_setup()解析命令行參數(shù)"init=",并賦值給execute_command

static int __init init_setup(char *str)
{
 unsigned int i;

 execute_command = str;
 ...
 for (i = 1; i < MAX_INIT_ARGS; i++)
  argv_init[i] = NULL;
 return 1;
}
__setup("init=", init_setup);

最后,在kernel_init()中執(zhí)行execute_command所指定的init程序。

static int __ref kernel_init(void *unused)
{
...
 if (execute_command) {
  ret = run_init_process(execute_command);
  if (!ret)
   return 0;
  panic("Requested init %s failed (error %d).",
        execute_command, ret);
 }
...
 panic("No working init found.  Try passing init= option to kernel. "
       "See Linux Documentation/admin-guide/init.rst for guidance.");
}

2.3 默認(rèn)方式

若以上兩種指定init程序的方式均以失敗告終,那么內(nèi)核代碼kernel_init()會(huì)執(zhí)行如下4個(gè)默認(rèn)的init程序,若也失敗,則內(nèi)核上報(bào)panic。

static int __ref kernel_init(void *unused)
{
 ...
 if (!try_to_run_init_process("/sbin/init") ||
     !try_to_run_init_process("/etc/init") ||
     !try_to_run_init_process("/bin/init") ||
     !try_to_run_init_process("/bin/sh"))
  return 0;

 panic("No working init found.  Try passing init= option to kernel. "
       "See Linux Documentation/admin-guide/init.rst for guidance.");
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux系統(tǒng)
    +關(guān)注

    關(guān)注

    4

    文章

    602

    瀏覽量

    28270
  • CMD命令
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    8506
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    編寫第一個(gè)QT程序

    學(xué)習(xí)種編程語言或編程環(huán)境,通常會(huì)先編寫個(gè)“Hello World”程序。我們也用 Qt Creator 編寫
    發(fā)表于 11-21 10:41 ?1156次閱讀

    第一個(gè)arm9的應(yīng)用程序helloworld需要掌握哪些內(nèi)容?

    arm9的第一個(gè)應(yīng)用程序 helloworld 的軟件 硬件平臺(tái)都有哪些?比如軟件開發(fā)環(huán)境需要搭建個(gè)什么平臺(tái) 等等 ,路過的朋友不妨看看,謝謝。
    發(fā)表于 11-12 14:41

    【MiCOKit試用體驗(yàn)】+第一個(gè) MiCO 應(yīng)用程序

    【MiCOKit試用體驗(yàn)】+第一個(gè) MiCO 應(yīng)用程序對(duì)于開發(fā)板程序設(shè)計(jì),第一個(gè)程序,hello world 是少不了的,今天我們來研究下
    發(fā)表于 10-23 21:50

    【Intel Edison試用體驗(yàn)】+第一個(gè)應(yīng)用程序“Hello World!”(3)

    本帖最后由 滿嘴讒言 于 2016-7-1 21:54 編輯 刷好了系統(tǒng),我們就來配置交叉編譯環(huán)境和編寫第一個(gè)應(yīng)用程序。1.第一步,下載交叉編譯工具鏈。因?yàn)槲乙贚inux的虛擬機(jī)下操作,所以
    發(fā)表于 07-01 21:49

    【HarmonyOS HiSpark IPC DIY Camera試用連載 】鴻蒙OS內(nèi)核如何啟動(dòng)第一個(gè)用戶進(jìn)程init_lite

    和源碼位置,包括了kernel、startup子系統(tǒng)。Startup中的init_lite是kernel調(diào)用的第一個(gè)用戶態(tài)進(jìn)程; 3.第一個(gè)
    發(fā)表于 11-20 10:27

    [文章] 【HarmonyOS HiSpark IPC DIY Camera試用連載 】鴻蒙OS內(nèi)核如何啟動(dòng)第一個(gè)用戶進(jìn)程init_lite

    位置,包括了kernel、startup子系統(tǒng)。Startup中的init_lite是kernel調(diào)用的第一個(gè)用戶態(tài)進(jìn)程;3.第一個(gè)用戶態(tài)進(jìn)
    發(fā)表于 11-20 16:44

    鴻蒙liteos-a如何啟動(dòng)第一個(gè)用戶進(jìn)程init_lite

    init_lite是kernel調(diào)用的第一個(gè)用戶態(tài)進(jìn)程; 3. 第一個(gè)用戶態(tài)進(jìn)程init_liteInit_lite的位置: 官方手冊(cè)中對(duì)
    發(fā)表于 12-10 12:04

    鴻蒙liteos-a如何啟動(dòng)第一個(gè)用戶進(jìn)程init_lite

    init_lite是kernel調(diào)用的第一個(gè)用戶態(tài)進(jìn)程; 3. 第一個(gè)用戶態(tài)進(jìn)程init_liteInit_lite的位置: 官方手冊(cè)中對(duì)
    發(fā)表于 12-10 15:02

    Niobe第一個(gè)應(yīng)用程序

    Niobe第一個(gè)應(yīng)用程序HelloWorld沿襲程序界的傳統(tǒng),第一個(gè)程序都是Hello World。在Niobe WiFi IoT開發(fā)板中,
    發(fā)表于 12-08 14:39

    Niobe第一個(gè)應(yīng)用程序

    Niobe第一個(gè)應(yīng)用程序HelloWorld沿襲程序界的傳統(tǒng),第一個(gè)程序都是Hello World。在Niobe WiFi IoT開發(fā)板中,
    發(fā)表于 12-08 17:36

    使用單片機(jī)STM32執(zhí)行第一個(gè)程序是什么

    使用單片機(jī)STM32執(zhí)行第一個(gè)程序是startup_stm32f407xx.s指令名稱含義EQU給數(shù)字常量取個(gè)符號(hào)名,相當(dāng)于C語言中的d
    發(fā)表于 01-21 12:13

    Linux系統(tǒng)下init進(jìn)程的前世今生

    kernel_thread產(chǎn)生的進(jìn)程,其開始在內(nèi)核態(tài)執(zhí)行,然后通過個(gè)系統(tǒng)調(diào)用,開始執(zhí)行用戶空間的/sbin/
    發(fā)表于 04-28 17:23 ?1067次閱讀

    第一個(gè)Xilinx Vitis IDE入門helloworld程序

    第一個(gè)Xilinx Vitis IDE入門helloworld程序
    發(fā)表于 01-23 06:37 ?8次下載
    <b class='flag-5'>第一個(gè)</b>Xilinx Vitis IDE入門helloworld<b class='flag-5'>程序</b>

    嵌入式Linux應(yīng)用程序開發(fā)-(1)第一個(gè)嵌入式QT應(yīng)用程序

    第一個(gè)嵌入式QT應(yīng)用程序在成功安裝 Qt Creator 開發(fā)環(huán)境后,我們通過個(gè)簡(jiǎn)單的嵌入式Qt應(yīng)用程序,來說明
    發(fā)表于 11-01 17:21 ?16次下載
    嵌入式Linux<b class='flag-5'>應(yīng)用程序</b>開發(fā)-(1)<b class='flag-5'>第一個(gè)</b>嵌入式QT<b class='flag-5'>應(yīng)用程序</b>

    如何編寫第一個(gè)hello world程序

    本文簡(jiǎn)單介紹如何編寫第一個(gè)hello world程序,以及程序是如何被執(zhí)行
    的頭像 發(fā)表于 03-02 17:31 ?8797次閱讀
    如何編寫<b class='flag-5'>第一個(gè)</b>hello world<b class='flag-5'>程序</b>