一、答案
https://blog.csdn.net/gatieme/article/details/51532804
仔細讀一下作者的博客,都是操作系統底層相關。
二、補充:
1、linux代碼,arch下是不同CPU的代碼,計算機下我們關心X86
2、init文件下,main.c下的start_kernel函數是啟動的初始化函數;
3、x86 CPU啟動的第一個動作CS:EIP=FFFF:0000H(換算為物理地址為000FFFF0H,因為16位CPU有20根地址線),即BIOS程序的位置。http://wenku.baidu.com/view/4e5c49eb172ded630b1cb699.html
4、BIOS例行程序檢測完硬件並完成相應的初始化之后就會尋找可引導介質,找到后把引導程序加載到指定內存區域后,就把控制權交給了引導程序。這里一般是把硬盤的第一個扇區MBR和活動分區的引導程序加載到內存(即加載BootLoader),加載完整后把控制權交給BootLoader。
5、引導程序BootLoader開始負責操作系統初始化,然后起動操作系統。啟動操作系統時一般會指定kernel、initrd和root所在的分區和目錄,比如root (hd0,0),kernel (hd0,0)/bzImage root=/dev/ram init=/bin/ash,initrd (hd0,0)/myinitrd4M.img
6、內核啟動過程包括start_kernel之前和之后,之前全部是做初始化的匯編指令,之后開始C代碼的操作系統初始化,最后執行第一個用戶態進程init。
一般分兩階段啟動,先是利用initrd的內存文件系統,然后切換到硬盤文件系統繼續啟動。initrd文件的功能主要有兩個:1、提供開機必需的但kernel文件(即vmlinuz)沒有提供的驅動模塊(modules) 2、負責加載硬盤上的根文件系統並執行其中的/sbin/init程序進而將開機過程持續下去
7、init進程詳解
Linux內核中的init_task進程和idle進程,道生一(start_kernel....cpu_idle),一生二(kernel_init和kthreadd),二生三(即前面0、1和2三個進程),三生萬物(1號進程是所有用戶態進程的祖先,2號進程是所有內核線程的祖先),新內核的核心代碼已經優化的相當干凈,都符合中國傳統文化精神了。
二、內核的棧
https://www.cnblogs.com/dormant/p/5456491.html