日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

实验三 Linux的启动与关闭,实验三:跟踪分析Linux内核的启动过程

發布時間:2024/9/19 linux 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实验三 Linux的启动与关闭,实验三:跟踪分析Linux内核的启动过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Ubuntu?16.04下搭建MenuOS的過程:

1、下載內核源代碼編譯內核

1 # 下載內核源代碼編譯內核

2 cd ~/LinuxKernel/

3 wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz

4 xz -d linux-3.18.6.tar.xz

5 tar -xvf linux-3.18.6.tar

6 cd linux-3.18.6

7 make i386_defconfig

8 make # 一般要編譯很長時間,少則20分鐘多則數小時

9

10 # 制作根文件系統

11 cd ~/LinuxKernel/

12 mkdir rootfs

13 git clone https://github.com/mengning/menu.git # 如果被墻,可以使用附件menu.zip

14 cd menu

15 gcc -o init linktable.c menu.c test.c -m32 -static -lpthread

16 cd ../rootfs

17 cp ../menu/init ./

18 find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img

19

20 # 啟動MenuOS系統

21 cd ~/LinuxKernel/

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

2、重新配置編譯Linux使之攜帶調試信息

1 $ sudo apt-get install ncurses-dev

2

3 首先需要安裝圖形化調試工具ncurses,ncurses-dev是一個庫,利用它就可以顯示圖形化的控制頁面了。

4

5 $ make menuconfig

6

7 選擇kernelhacking—>

8

9 選擇Comile-time checks and comp[iler options —>

10

11 按Y選中Compile the kernel with debug info

12

13 保存退出

14

15 重新make

3、使用gdb跟蹤調試內核

1 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 關于-s和-S選項的說明:

2 # -S freeze CPU at startup (use ’c’ to start execution)

3 # -s shorthand for -gdb tcp::1234 若不想使用1234端口,則可以使用-gdb tcp:xxxx來取代-s選項

4

5 另開一個shell窗口

6 gdb

7 (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加載符號表

8 (gdb)target remote:1234 # 建立gdb和gdbserver之間的連接,按c 讓qemu上的Linux繼續運行

9 (gdb)break start_kernel # 斷點的設置可以在target remote之前,也可以在之后

此時可以繼續list接著向下查看,也可以step單步運行,或者利用匯編碼ni(next?instruction)逐指令地運行調試。

一些常用的gdb的命令:

(gdb)?break?n?:在第n行處設置斷點

(gdb)?r:運行程序

(gdb)?n:單步執行

(gdb)?c:繼續運行

(gdb)?p?變量:打印變量的值

(gdb)?bt:查看函數堆棧

(gdb)?set?args?參數:指定運行時的參數

(gdb)?show?args:查看設置好的參數

(gdb)delete?斷點號n:刪除第n個斷點

(gdb)step:單步調試,若有函數調用,則進入函數(與命令n不同,n是不進入調用的函數的)

基礎的工作就是這些,下面我嘗試去分析一下內核從start_kernel到init進程啟動的大體過程

使用list命令看到的start_kernel源碼:

lockdep_init() : Linux有一個死鎖檢測模塊lockdep,看注釋說的是初始化hash表,應該是內核會依賴這個表來做其他的事。

set_task_stack_end_magic(&init_task) : init_task是一個全局變量,即是手工創建的PCB。 它是在具體的代碼是

struct?task_struct?init_task?=?INIT_TASK(init_task); ?那么task_struct應該就是一個類似于PCB結構的結構體,而INIT_TASK便是初始化該結構體的函數。

后面是一些模塊的初始化,水平有限就不一一解釋了,就說說老師提到的函數吧。

trap_init() : 初始化中斷向量,設置一些中斷門。

mm_init() : 內存管理模塊的初始化。

sched_init() : 調度模塊的初始化。

rest_init() : 源碼如下:

static noinline void __init_refok rest_init(void)

394 {

395 int pid;

396

397 rcu_scheduler_starting();

398 /*

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

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

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

402 */

403 kernel_thread(kernel_init, NULL, CLONE_FS);

404 numa_default_policy();

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

406 rcu_read_lock();

407 kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);

408 rcu_read_unlock();

409 complete(&kthreadd_done);

410

411 /*

412 * The boot idle thread must execute schedule()

413 * at least once to get things moving:

414 */

415 init_idle_bootup_task(current);

416 schedule_preempt_disabled();

417 /* Call into cpu_idle with preempt disabled */

418 cpu_startup_entry(CPUHP_ONLINE);

419 }從rest_init開始,Linux開始產生進程,因為init_task是靜態制造出來的,pid=0,它試圖將從最早的匯編代碼一直到start_kernel的執行都納入到init_task進程上下文中。

第403行的kernel_init函數中有一個run_init_process函數,它的作用便是建立init_process進程,也就是Linux系統中的1號進程。它是第一個用戶態進程。

而從最后的cpu_startup_entry中可以看到init_task以后便成為了一個idle進程,也就是0號進程,當系統沒有進程運行時,一直在運行這個空閑進程。

總結:

通過本次試驗,我對Liunx內核啟動的過程有了大體的了解。

內核啟動時,會先進行一部分硬件的初始化,這部分是匯編語言完成的,而后會運行start_kernel,也就是內核的C語言部分。start_kernel會繼續進行一些內核的初始化,建立0號進程

,最后通過rest_init()建立1號進程,也就是第一個用戶態進程,而以后0號進程便成為一個空閑(idle)進程,當沒有其他進程運行時,系統便運行0號進程。

總的來說,雖然明白了大體的過程,但還是感覺對于內核的了解只是浮于淺淺的表面,好像懂了點什么,又好像什么也不懂。希望繼續深入的學習能夠解答我的疑惑。同時也以此自勉吧。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的实验三 Linux的启动与关闭,实验三:跟踪分析Linux内核的启动过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 9久久9毛片又大又硬又粗 | 亚洲欧美精品一区二区三区 | 嫩草影院永久入口 | 国产福利视频导航 | 污污的网站在线观看 | 欧美三日本三级少妇99 | 国产精品久久久久久白浆 | 黄色网址国产 | 国产精品20p | xx视频在线| jizzjizz在线| 四虎午夜影院 | 九九热这里有精品视频 | 午夜精品久久久内射近拍高清 | av无码精品一区二区三区 | 不许穿内裤随时挨c调教h苏绵 | 中国一级特黄毛片 | 韩国禁欲系高级感电影 | 久久久久久久久久久久久久久久久久久 | 97se亚洲 | wwww欧美| 国产av自拍一区 | 亚洲综合一区在线 | 亚洲激情成人 | 国产精品麻豆视频 | 人人爽人人草 | 日本不卡一区在线 | 午夜在线视频免费 | 狠狠操狠狠操 | 久久精彩视频 | 日韩亚洲视频在线观看 | 美女尿尿网站 | 欧美涩色 | 国产精品久久久久久久久动漫 | 欧美性xxxx在线播放 | 久久麻豆视频 | 超碰997| 欧美自拍偷拍一区二区 | 夜色导航 | 欧美日韩片| 精品久久久久久无码中文野结衣 | 最近中文字幕在线中文高清版 | 国产探花在线精品一区二区 | 免费看操片| 丝袜脚交国产在线观看 | 国产在线拍揄自揄拍无码视频 | 9l视频自拍九色9l视频 | xxxx国产视频 | 欧美在线一区二区 | av剧情在线 | 精品一区二区三区中文字幕 | 俄罗斯毛片 | 麻豆国产精品视频 | 亚洲色图综合在线 | 国产一级网站 | 九九热在线免费视频 | 国产成人aa | 67194成人在线观看 | 99在线免费视频 | 9色视频| 丰满的人妻hd高清日本 | 好吊妞视频一区二区三区 | 黄色三级国产 | 丰满人妻妇伦又伦精品国产 | 美女裸体网站久久久 | 羞羞答答一区 | 欧美男女激情 | 韩国成人在线 | 日本美女日批视频 | 少妇太紧太爽又黄又硬又爽 | 蜜桃精品视频在线 | 天美乌鸦星空mv | 91福利视频在线 | 国产一级做a爰片久久毛片男 | 精品视频在线免费观看 | av在线免| 日韩av一区二区在线 | 制服丝袜手机在线 | 免费观看成人在线视频 | 亚洲精品中文字幕成人片 | 国产精品成人99一区无码 | 亚洲v视频| 日韩精品av一区二区三区 | 日韩不卡一二区 | 欧美亚洲激情 | wwwxxxx欧美| 轻轻色在线观看 | 亚洲欧美精品一区二区 | 免费黄色一区二区 | 色五夜| 国产成人精品999在线观看 | 国产伦理在线观看 | 欧美天天性影院 | 亚洲精品福利在线 | 欧美色图19p| 最全aⅴ番号库 | 中文字幕在线观看视频一区二区 | 亚洲精品自拍 | 色哟哟官网 |