欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

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

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

1. 概述

Linux系統(tǒng)啟動(dòng)過(guò)程中通過(guò)init_task創(chuàng)建0號(hào)idle進(jìn)程。然后通過(guò)kernel_thread創(chuàng)建1號(hào)init進(jìn)程。創(chuàng)建該進(jìn)程時(shí)通過(guò)系統(tǒng)調(diào)用,在內(nèi)核空間執(zhí)行用戶(hù)空間的/sbin/init程序,通過(guò)該程序產(chǎn)生出shell,并依賴(lài)init衍生出其他進(jìn)程。通過(guò)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代碼中通過(guò)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)行訪(fǎng)問(wè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方式

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

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

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

    關(guān)注

    4

    文章

    596

    瀏覽量

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

    關(guān)注

    0

    文章

    28

    瀏覽量

    8351
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    init_lite是kernel調(diào)用的第一個(gè)用戶(hù)態(tài)進(jìn)程; 3. 第一個(gè)用戶(hù)態(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開(kāi)發(fā)板中,
    發(fā)表于 12-08 14:39

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

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

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

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

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

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

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

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

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

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

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

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