1. 程式人生 > >Linux系統初始化流程

Linux系統初始化流程

linux系統的啟動,指的是從系統加電到系統控制檯顯示“login:”登入提示符為止的系統執行階段,與這部分動作密切相關的程式碼主要是:

  • 四個彙編程式:bootsect.S setup.S head.S entry.S
  • init目錄下的main.c檔案

    主要檢視init/main.c中的start_kernel函式:
    這裡寫圖片描述

在系統啟動過程中,主要關注一下幾個方面:

  1. 中斷系統及排程系統
  2. 檔案系統的初始化
  3. 裝置管理系統的初始化
  4. 網路協議的初始化

init/main.creset_init函式:
這裡寫圖片描述

在此函式中,有kernel_thread函式,這個函式建立了核心執行緒,原型如下:

int kernel_thread(int (*fn), void *arg, unsigned long flags)

此函式定義在arch/xxx/kernel/process.c中,它利用do_fork()函式建立一個新的核心態執行緒,linux的核心執行緒是沒有虛擬儲存空間的程序,它們執行在核心中,直接使用實體地址空間。
kernel_thread建立的新的核心執行緒是init,然後返回,執行unlock_kernel(與start_kernel中的lock_kernel對應),接著執行cpu_idle(),這實際是執行初始化主執行緒的歸宿:它觀察自己是否處於TIF_NEED_RESCHED

——在need_resched實現,如果不是,就讓自己睡眠,否者完成schedule()函式。TIF即Thread Information Flag的意思。

下一步轉入init函式中:
這裡寫圖片描述

init執行緒呼叫了許多函式,但與網路有關的在do_basic_setup中初始化的sock_init(),然後繼續執行do_initcalls函式,此函式定義在c檔案中,有兩個重要的變數__initcall_start__initcall_end,它們的定義如下:

extern initcall_t __initcall_start, __initcall_end;
static void __init do_initcalls(void)
{
    initcall_t *call
;
int count = preempt_count(); /*從start遍歷到end*/ for(call = &__initcall_start; call < &__initcall_end; call++){ char *mesg; ...... (*call)(); msg = NULL; } }

initcall_t類與__initcall_start__initcall_end定義在include/linux目錄下的init.h檔案中。

相關推薦

Linux系統初始流程

linux系統的啟動,指的是從系統加電到系統控制檯顯示“login:”登入提示符為止的系統執行階段,與這部分動作密切相關的程式碼主要是: 四個彙編程式:bootsect.S setup.S he

青蛙學Linux系統初始init及執行級

Linux系統的啟動首先從BIOS開始,接下來Linux的載入程式將核心映像載入到記憶體,進行核心初始化。在核心初始化的最後一步,就是啟動PID為1的init程序,這個程序是系統的第一個程序,負責啟動那些開機時需要啟動的服務。 大多數的Linux發行版的init系統都是和System V相容的,所以也被稱為

Linux 系統初始指令碼;

1.背景日常伺服器申請完畢後需要各種系統指標初始化,實施思路(編寫系統初始化指令碼,ansible 批量拷貝到目標機器執行); 初始化指令碼如下; #!/bin/bash function install_pkg(){ yum -y install l

Linux核心初始流程筆記

好文章,轉載一下! 作者:[email protected] 部落格:blog.focus-linux.net   linuxfocus.blog.chinaunix.ne

一鍵linux系統初始指令碼

一、前言一般我們在安裝新的系統時,系統的一些預設配置對我們來說是不行的,所以我們要自定義初始化系統。 二、需求1)設定時區並把同步時間加入計劃任務2)禁用selinux3)清空原防火牆預設策略只保留ssh4)歷史命令顯示操作時間級使用者5)建立ALL許可權使用者並禁止root遠端登入6)禁止定時任務傳送郵件

一鍵linux系統初始腳本

auto 新的 isa 必須 buck etc shang gre 謝謝 一、前言一般我們在安裝新的系統時,系統的一些默認配置對我們來說是不行的,所以我們要自定義初始化系統。 二、需求1)設置時區並把同步時間加入計劃任務2)禁用selinux3)清空原防火墻默認策略只保留s

LINUX系統初始

轉載地址:https://blog.csdn.net/runner668/article/details/79844423 說明BIOS是位於位於主機板flash rom(掉電不丟失0)中的程式,作業系統Boot Loader位於硬碟MBR中。BIOS在完成 硬體檢測和資源分配後。將硬碟MB

ZigBee網路的建立 & ZigBee系統初始流程

Osal_int_disable(INTS_ALL):關閉所有中斷HAL_BOARD_INIT():初始化系統時鐘Zmain_vdd_check():檢測晶片電壓是否正常Zmain_ram_init();初始化堆疊InitBoard(OB_COLD):初始化LED,配置系統定時器HalDriverInit()

ECS Linux系統初始後重新掛載資料盤

如果伺服器需要初始化系統,資料盤資料不需要改變,初始化伺服器後需要對資料盤重新掛載。操作如下: 1、輸入 mount 命令可以看到並沒有掛載資料盤,輸入fdisk -l 命令,看到已經分割槽的資料盤 /dev/xvdb1 (裝置編號以實際情況為準)。新購買資料盤分割槽格式化請參考這裡。      

linux文件系統 - 初始(一)

成員函數 cat 文章 記錄 inf htm 源代碼 設備驅動模型 proxy 術語表: struct task:進程 struct mnt_namespace:命名空間 struct mount:掛載點 struct vfsmount:掛載項 struct file:文件

linux文件系統 - 初始(三)

視圖 div 目錄遷移 oca script 方式 不能 輸出 str 一、目的 內核加載完initrd文件後,為掛載磁盤文件系統做好了必要的準備工作,包括掛載了sysfs、proc文件系統,加載了磁盤驅動程序驅動程序等。接下來,內核跳轉到用戶空間的init程序,

linux文件系統 - 初始(二)

軟鏈接 復制代碼 模式 文件的 操作 pop 臨時 console mini 一、目的 本文主要講述linux3.10文件系統初始化過程的第二階段:加載initrd。 initrd是一個臨時文件系統,由bootload負責加載到內存中,裏面包含了基本的可執

systemd---Linux初始系統

控制 -abort ola ted 主機 end strong timeout idl 一、概述 systemd是一套Linux系統的基本構建塊。它提供了一個系統和服務管理器,它作為PID 1運行,並啟動系統的其余部分。systemd提供了積極的並行化能力,使用Socket

Linux記憶體初始之夥伴系統(三)

這裡主要分析zone/zonelist的初始化,以及把系統空閒記憶體釋放到夥伴系統 1.zone的初始化 呼叫關係:start_kernel->setup_arch->paging_init->bootmem_init->zone_sizes_init->fre

Linux例項初始系統盤後重新掛載資料盤

在Linux例項中,重新初始化系統盤不會改變資料盤裡的內容,但是資料盤的掛載資訊會丟失,所以,在Linux重啟後,按以下步驟建立新的掛載點資訊並掛載資料盤分割槽。 1,檢視資料盤掛載資訊:執行命令 mount。返回結果中沒有/dev/vdb1的資訊。 sysfs on /sys ty

Linux EMMC子系統分析-初始流程(轉載)

最近在解EMMC的一個bug,發現Linux EMMC有點小複雜,先整理個文件出來吧 用的是TI 平臺,僅分析MMC,不分析SD和SDIO mmc_init 2769 static int __init mmc_init(void

linux檔案系統初始過程(5)---載入initrd(下)

一、目的     linux把檔案分為常規檔案、目錄檔案、軟連結檔案、硬連結檔案、特殊檔案(裝置檔案、管道檔案、socket檔案等)幾種型別,分別對應不同的新建函式sys_open()、sys_mkd

Linux系統之啟動流程

linux系統啟動流程開機自檢(bios)MBR引導GRUB菜單加載內核(kernel)init 進程初始化·由linux內核加載運行/sbin/init·是系統的第一個進程·PID永遠為1init進程的配置文件參數說明/etc/inittab配置默認運行級別/etc/sysconfig/init控制tty終

Linux系統啟動了流程

linux開機開機自檢(BIOS)MBR引導(光盤、磁盤)GRUB菜單(選擇內核,一般只有一個內核)加載內核運行init進程,選擇運行級別(Linux的第一個運行程序)讀取/etc/inittab配置文件執行/etc/rc.d/rc.sysinit腳本(系統的初始化腳本,設置主機名和IP地址)執行/etc/r

Spring Core Container 源碼分析三:Spring Beans 初始流程分析

turn raw time -c rri add 步驟 引用 lin 前言 本文是筆者所著的 Spring Core Container 源碼分析系列之一; 本篇文章主要試圖梳理出 Spring Beans 的初始化主流程和相關核心代碼邏輯; 本文轉載自本人的私人博客,傷神