從linux內核啟動,學習Linux內核啟動過程:從start_kernel到init

一、實驗步驟:

1:運行menuos:

a)cd LinuxKernel/

b)qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

啟動后啟動了MenuOS。

0818b9ca8b590ca3270a3433284dd417.png

2:使用gdb調試跟蹤menuos內核啟動和運行過程;

a)qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S

-S:freeze CPU at startup

-s:shorthand for -gdb tcp::1234 如果不想使用1234端口則可以好似用 -gdb tcp:xx 來取代-s選項

0818b9ca8b590ca3270a3433284dd417.png

在另外一個窗口調試程序打開gdb;

0818b9ca8b590ca3270a3433284dd417.png

然后按c運行到剛才的斷點,如下圖:

0818b9ca8b590ca3270a3433284dd417.png

然后使用list,查看start_kernel的代碼

0818b9ca8b590ca3270a3433284dd417.png

如果想跟蹤那里,結合代碼,設置斷點繼續跟蹤;

二、從start_kernel到init進程啟動過程的詳細分析

1.Linux內核啟動時首先調用start_Kernel函數,該函數相當于應用程序中的main()函數,在start_kernel函數中會調用大量的init函數來對內核環境進行初始化;包括CPU初始化、內存管理初始化、進程管理初始化、文件系統初始化、中斷、同步互斥等。例如:

asmlinkage __visible void __init start_kernel(void)

{

.......

/*init_task即手工創建的PCB,0號進程就是最終的idle進程*/

thread_info_cache_init();//初始化thread info

cred_init();

fork_init(totalram_pages);//初始化fork

proc_caches_init();//初始化proc的catch

buffer_init();

key_init();

security_init();

dbg_late_init();//文件系統初始化

vfs_caches_init(totalram_pages);

signals_init();

/* rootfs populating might need page-writeback */

page_writeback_init();

proc_root_init();

cgroup_init();

cpuset_init();

taskstats_init_early();

delayacct_init();

check_bugs();

sfi_init_late();

if (efi_enabled(EFI_RUNTIME_SERVICES)) {

efi_late_init();

efi_free_boot_services();

}

ftrace_init();

/*以上就是各種初始化*/

/* Do the rest non-__init'ed, we're now alive */

rest_init();

}

2.從上面代碼我們看到最后一步就是:調用rest_init()函數來啟動第一個用戶進程,該進程被稱為1號進程,代碼及分析如下所示:(這個函數可以直接斷點到這里,然后按c運行到這里即可)

static noinline void __init_refok rest_init(void)

{

int pid;

rcu_scheduler_starting();

/*

* We need to spawn init first so that it obtains pid 1, however

* the init task will end up wanting to create kthreads, which, if

* we schedule it before we create kthreadd, will OOPS.

*/

kernel_thread(kernel_init, NULL, CLONE_FS);//啟動1號進程,也稱為init進程,是第一個用戶進程

numa_default_policy();

pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);

rcu_read_lock();

kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);

rcu_read_unlock();

complete(&kthreadd_done);

/*

* The boot idle thread must execute schedule()

* at least once to get things moving:

*/

init_idle_bootup_task(current);

schedule_preempt_disabled();

/* Call into cpu_idle with preempt disabled */

cpu_startup_entry(CPUHP_ONLINE); //由1號進程完成剩下的初始化工作

}我們可以看到這個進程,有一個while(1)在無限的執行下去;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372090.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372090.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372090.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【轉】nginx的優缺點

原博文出自于:http://blog.csdn.net/a454211787/article/details/22494485 感謝! 1、nginx相對于apache優點: 輕量級同樣起web 服務比apache占用更少內存及資源 抗并發nginx 處理請求異步非阻塞而apache 則阻塞型高并發下nginx 能保持低資源低消耗高…

與Maven 3,Failsafe和Cargo插件的集成測試

開箱即用,可以在Maven中進行單元測試。 因此,它也經常用于集成測試。 這樣做的主要缺點是集成測試可能需要花費更多的時間來執行,并且因為沒有人喜歡每次構建都要等待很長時間–使用-Dmaven.test.skiptrue標志可以跳過測試 為了執行與Maven的…

Spring入門第二十五課

使用具名參數 直接看代碼&#xff1a; db.properties jdbc.userroot jdbc.passwordlogan123 jdbc.driverClasscom.mysql.jdbc.Driver jdbc.jdbcUrljdbc:mysql://localhost:3306/selective-courses-systemjdbc.initPoolSize5 jdbc.maxPoolSize10 applicationContext.xml <?x…

linux強制回收內存,Linu系統cache強制回收

LINUX的內存管理機制&#xff0c;一般情況下不需要特意去釋放已經使用的cache。Cache機制的存在&#xff0c;使得Linux對磁盤的讀寫速度是有較大的好處的。 在 Linux 操作系統中&#xff0c;當應用程序需要讀取文件中的數據時&#xff0c;操作系統先分配一些內存&#xff0c;將…

HDU 1412 {A} + {B}

Problem Description給你兩個集合。要求{A} {B}.注:同一個集合中不會有兩個同樣的元素.Input每組輸入數據分為三行,第一行有兩個數字n,m(0<n,m<10000),分別表示集合A和集合B的元素個數.后兩行分別表示集合A和集合B.每一個元素為不超出int范圍的整數,每一個元素之間有一個…

Google API:如何訪問Google Analytics(分析)數據?

在深入研究Google Analytics&#xff08;分析&#xff09;API之前&#xff0c;了解一些Google Analytics&#xff08;分析&#xff09;術語及其關系總是很有用的。 Google帳戶&#xff1a;要訪問Google Analytics&#xff08;分析&#xff09;&#xff0c;用戶將需要一個Google…

為什么linux的新得立軟件下載,linux,debian_蝶變(Debian)_Xfce_新立得軟件管理_安裝不上軟件了,怎么處理?,linux,debian - phpStudy...

蝶變(Debian)_Xfce_新立得軟件管理_安裝不上軟件了,怎么處理&#xff1f;(synaptic:9573): GLib-CRITICAL **: g_child_watch_add_full: assertion pid > 0 failed正在預設定軟件包 ...(正在讀取數據庫 ... 系統當前共安裝有 343467 個文件和目錄。)正準備解包 .../libc6-db…

設計模式學習筆記(十六:橋接模式)

1.1概述 將抽象部分與它的實現部分分離&#xff0c;使他們都可以獨立地變化。這就是橋接模式的定義。 抽象類或接口中可以定義若干個抽象方法&#xff0c;習慣上將抽象方法稱作操作。抽象類或接口使程序的設計者忽略操作的細節&#xff0c;即不必考慮這些操作是如何實現的&…

Request的getParameter和getAttribute方法的差別

HttpServletRequest.getParameter("modelName");能取到想要的modelObject嗎&#xff1f;經過測試之后。發現是不能的。后來想想。其它道理挺簡單的&#xff0c;當兩個Web組件之間為轉發關系時&#xff0c;轉發源會將要共享request范圍內的數據先用setAttribute將數據…

Spring Social入門–第2部分

幾周前&#xff0c;我寫了一篇文章&#xff0c;展示了我認為可以使用Spring Social編寫的最簡單的應用程序。 該應用程序讀取并顯示了Twitter用戶的公共數據&#xff0c;并被編寫為Spring Social和社交編碼領域的介紹。 但是&#xff0c;讓您的應用程序顯示用戶的公共數據只是故…

linux靜默刪除文件夾,Linux常用命令10 - unzip

zip 是最廣泛使用的歸檔文件, 除了linux&#xff0c;windows也是非常的廣泛。&#xff0c;支持無損數據壓縮。 zip 文件是包含一個或多個壓縮文件或目錄的數據容器。接下來&#xff0c;我將解釋如何使用 unzip 命令通過命令行解壓縮 Linux 系統中的文件。 還有與之對應就是 zip…

Git學習筆記(一) 安裝及版本庫介紹

安裝Git 最早Git是在Linux上開發的&#xff0c;很長一段時間內&#xff0c;Git也只能在Linux和Unix系統上跑。不過&#xff0c;慢慢地有人把它移植到了Windows上。現在&#xff0c;Git可以在Linux、Unix、Mac和Windows這幾大平臺上正常運行了。 在Linux上安裝Git 首先&#xff…

python基礎:迭代器、生成器(yield)詳細解讀

1. 迭代器 迭代器是訪問集合元素的一種方式。迭代器對象從集合的第一個元素開始訪問&#xff0c;知道所有的元素被訪問完結束。迭代器只能往前不會后退&#xff0c;不過這也沒什么&#xff0c;因為人們很少在迭代途中往后退。 1.1 使用迭代器的優點 對于原生支持隨機訪問的數據…

LazyInitializationException的四種解決方案–第2部分

本文從教程??的第1部分繼續。 使用PersistenceContextType.EXTENDED的有狀態EJB加載收集 該方法只能應用于與Full JEE環境兼容的應用程序&#xff1a;將EJB與PersistenceContextType.EXTENDED一起使用。 檢查下面的代碼&#xff0c;DAO的樣子&#xff1a; package com.ejb…

Linux將硬盤轉化為pv,Linux擴展硬盤 物理卷(PV) 卷組(VG) 邏輯卷(LV)

1、給虛擬機添加兩塊新的sata虛擬硬盤&#xff0c;容量8G和10G# fdisk -l 命令2、分別在這兩個硬盤上建立pvPvcreate /dev/sdb 創建一個物理卷/dev/sdb 磁盤名是 fdisk -l 查詢出來的Pvscan 查看當前所有物理卷Pvdisplay 查看當前所有物理卷的詳情3、創建VG&#xff0c;使得…

ubuntu 16.10 shu rufa meiy ou l e geng xi zhi hou

轉載于:https://www.cnblogs.com/ganmk--jy/p/6035894.html

ZOJ Monthly, November 2012

A.ZOJ 3666 Alice and Bob 組合博弈&#xff0c;SG函數應用#include<vector> #include<cstdio> #include<cstring> #include<algorithm>using namespace std;const int maxn 10000 100; int SG[maxn]; vector<int> g[maxn];int mex(int u) { /…

使用Aspect和Spring Profile進行電子郵件過濾

在Web應用程序開發期間&#xff0c;經常需要發送電子郵件。 但是&#xff0c;有時數據庫中會包含來自生產的數據&#xff0c;并且存在在電子郵件測試執行期間向真實客戶發送電子郵件的風險。 這篇文章將解釋如何避免在沒有在發送電子郵件功能中明確編寫代碼的情況下避免這種情…

紅旗linux 進不去圖形界面,進不了紅旗Linux6.0的圖形界面請高手幫忙

習生 于 2008-11-02 11:08:42發表:引用:原帖由 zhaoruiqi 于 2008-11-2 10:03 發表 我的也是進不了圖形界面&#xff0c;用文本安裝后進系統也一樣正常按rtl的方法對xorg.conf進行修改,已經能進入圖形界面。你看看樓上rtl的回復的能否對你有幫助。zhaoruiqi 于 2008-11-02 10:0…

總結繼承的幾種方式

簡單總結繼承的幾種方式 JavaScript作為一門弱類型的語言&#xff0c;本著精簡的原則&#xff0c;它取消了類的概念&#xff0c;只有對象的概念&#xff0c; 更是有萬物皆對象的說法。在基于類的面向對象方式中&#xff0c;對象&#xff08;object&#xff09;依靠類&#xff0…