天天看點

linux核心分析第三周

20135103王海甯

linux核心分析第三周

http://mooc.study.163.com/course/USTC-1000029000 

按照課堂提供的方法,指令行一行行敲上去,我是手機緩存,隻能打。
  
        
linux核心分析第三周
  shell,執行下面的指令:   
linux核心分析第三周
  設定完斷點後,可以使用c讓核心繼續進行加載,加載到第一個斷點start_kernel。   vim編譯器阿 gdb之類的東東面試會很多的,上學期百度面試的人有一個問題是否熟悉Linux,是否掌握vim。   
linux核心分析第三周
  3.start_kernel所在函數的源代碼。    我們可以在linux-3.18.6/init/main.c這裡找到start_kernel所在函數的源代碼。   Archlinux對qemu做了細分,啟動指定架構的核心要用對應的qemu指令,這裡就是qemu-system-i386執行完上述指令後,我們會看到qemu停留在start_kernel調用前   
linux核心分析第三周
  
        
其實我們首先看第一個函數調用lockdep_init()函數,目的是為了初始化一張lockdep hash,這是什麼呢?我們可以在kernel/locking/lockdep.c看到相關說明,從lockdep.c的注釋部分我們可以了解,lockdep.c裡實作的功能大概是對運作時的一些[lock]鎖操作的正确性進行驗證,具體詳細沒有進行分析。
           

上面内容00引自《深入了解Linux核心》

在gdb中s到set_task_stack_end_magic函數,然後用p列印傳入的參數,可以看到傳入的參數是個task_struct,此結構定義位于include/linux/sched.h,這裡調用set_task_stack_end_magic時傳入的參數是由位于include/linux/init_task.h中的INIT_TASK宏進行初始化,實際上它就是我們的0号程序,即目前程序,在此宏中我們可以看到0号程序的所有資訊,同時通過檢視gdb中列印的參數資訊,我們可以确定這裡确實是在對0号程序進行處理。 

接下來是smp_setup_processer_id(),這個 是什麼, 沒有弄明白。 

接着 debug_objects_early_init() 此函數用于核心的對象調試,其定義位于lib/debugobjects.c,根據其定義處的注釋描述,其會初始化一個hash buckets并且把static object pool裡的objects鍊入一個poll list。此函數調用完成後object tracker将可以正常工作 

在執行start_kernel時,期初會對CPU、記憶體等各種硬體裝置進行初始化,這期間涉及到非常多的不同核心子產品的加載。在start_kernel的最後一項初始化,就是有關核心程序管理的初始化了。一旦這一項初始化完成,核心就加載成功了,在上一次我們自行編寫的簡單系統核心,實際上是在rest_init前插入了一段我們自己的函數my_start_kernel,插入這個函數之後,我們自己的核心通過PCB的程序管理單元來管理了我們依次建立的四個簡單程序,并通過時間片輪轉的方式進行了排程。那麼在實際的linux核心代碼中,rest_init()到底是幹什麼才使得我們需要在它之前執行my_start_kernel呢?原因就是rest_init實際上是linux核心初始化程序的函數。如果我們在它執行之前自行建立我們自己的程序,并且利用自己的排程算法來排程之後建立的程序,那麼rest_init則永遠不會被執行。

rest_init代碼部分

linux核心分析第三周

在rest_init的代碼中,kernel_thread,被定義在檔案arch/x86/kernel/fork.c中,它的功能是用來fork一個核心線程。 

代碼:

linux核心分析第三周

在執行kernel_thread時,kernel_init作為将要執行的函數指針傳入,程序ID會被置為1。是以在這裡,kernel_init核心線程被建立,程序号為1。在完成核心程序的建立後,會建立kthreadd核心線程,作用則是管理和排程其他的核心線程

linux核心分析第三周

在kthreadd函數中kthread_create_list全局連結清單中維護的核心線程。當調用kthread_create時,會建立一個kthread,并被添加到kthread_create_list連結清單中。當程序執行完畢後,就會被從連結清單中删除。下面的代碼我們可以看到,在tast_struct的目前程序被設定為kthread

linux核心分析第三周

schedule()代碼:

linux核心分析第三周

代碼繞開kernel_init和kthreadd并會繼續執行到complete(&kthreadd_done);這時,說明kthreadd已經建立成功了,并通過一個complete變量kthreadd_done來通知kernel_init線程。 

再看

linux核心分析第三周

最後,cpu_startup_entry 就會使得CPU在idle這樣一個循環内進行工作,死循環。

上一篇: 第六周
下一篇: 實驗五