week3-構造一個簡單的linux系統

潘恆  原創做品轉載請註明出處  《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000linux

1、gdb跟蹤調試內核從start_kernel到init進程啓動tcp

1.qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 關於-s和-S選項的說明:
    // -S freeze CPU at startup (use ’c’ to start execution) cpu初始化以前把它凍結起來
    // -s shorthand for -gdb tcp::1234 在1234端口上創建了一個gdb server
     若不想使用1234端口,則能夠使用-gdb tcp:xxxx來取代-s選項函數

          

2.啓動Linux內核的三個參數:調試

  • kernel
  • initrd
  • root所在分區目錄

  代碼:rest

qemu -kernel (文件名) -initrd (rootfs.img)

  1)qemu至關於打開一個虛擬機code

  2)kernel啓動一個內核,位置由其後的文件名指定。若是在當前目錄下,能夠直接輸入文件名,若是不是,則須要輸入該內核的全路徑。server

  3)initrd指令是掛了一個ramdisk虛擬硬盤,是內核的重要補充,rootfs.img就是這個虛擬硬盤,內有分區,而後啓動的實際上是其中的init文件,這個文件是由以前的menuOS編譯而成,gcc -o命名爲init。    blog

3.使用gdb跟蹤調試:進程

  1)加載符號表、創建鏈接、設置斷點:虛擬機

         

  2)輸入c讓qemu上的linux繼續運行:

         

  3)輸入list查看設置斷點處的代碼:

         

2、總結

init中main.c中有一個start_kernel函數,在start_kernel函數的尾部調用了一個rest_init

  1)0號進程
    有一個全局變量init_task,即手工建立的PCB,0號進程,即最終的idle進程。0號進程一直存在,系統沒有進程須要執行時調度到0號進程。

  2)0號進程建立了1號進程和其餘
    rest_init()中有kernel_thread(kernel_init,NULL,CLONE_FS)
    kernel_init中有run_init_process,
    run_init_process建立了1號進程,默認路徑下的程序。

相關文章
相關標籤/搜索