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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2018-2019-1 20189210 《LInux内核原理与分析》第四周作业

發布時間:2025/3/15 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2018-2019-1 20189210 《LInux内核原理与分析》第四周作业 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第三章
這一章接觸內核源代碼,對內核源碼進行編譯和調試跟蹤
一、預備知識:
內核:整個操作系統的最底層,它負責了整個硬件的驅動以及提供各種系統所需的內核功能。內核實質上是系統上面的一個文件而已,這個文件包含了驅動主機各項硬件的檢測程序與驅動模塊。當系統讀完BIOS并加載MBR內的引導裝載程序后,就能夠加載內核到內存當中。然后內核開始檢測硬件,掛載根目錄并取得內核模塊來驅動所有的硬件,之后調用/sbin/init就能依序啟動多有系統所需要的服務了。
Qemu :以GPL許可證分發源碼的模擬處理器,能啟動那些為不同中央處理器編譯的Linux程序。

二、構造一個簡單的Linux內核
構造的MenuOS系統是由Linux內核鏡像和根文件系統集成起來的。
Linux內核在PC上以文件的形式存在(保存成磁盤文件形式),就是所謂的“映像文件”。內核編譯(make)之后會生成兩個文件,一個Image,一個zImage,其中Image為內核映像文件,而zImage為內核的一種映像壓縮文件,Image大約為4M,而zImage不到2M。為了能使用zImage這個壓縮版本,必須在它的開頭加上解壓縮的代碼,將zImage 解壓縮之后才能執行,因此它的執行速度比Image要慢。但考慮到嵌入式系統的存儲空容量一般都比較小,內核要常駐內存,采用zImage可以占用較少的存儲空間,因此犧牲一點性能上的代價也是值得的,所以一般嵌入式系統均采用壓縮的內核映像文件,即zImage。
根文件系統首先是一種文件系統,該文件系統不僅具有普通文件系統的存儲數據文件的功能,但是相對于普通的文件系統,它的特殊之處在于,它是內核啟動時所掛載(mount)的第一個文件系統,內核代碼的映像文件保存在根文件系統中,系統引導啟動程序會在根文件系統掛載之后從中把一些初始化腳本(如rcS,inittab)和服務加載到內存中去運行。先將/dev/ram0掛載,而后執行/linuxrc.等其執行完后。切換根目錄,再掛載具體的根文件系統.根文件系統執行完之后,也就是到了Start_kernel()函數的最后,執行init的進程,也就第一個用戶進程。對系統進行各種初始化的操作。

在實驗樓中的虛擬機里,直接進入LinuxKernel目錄使用如下命令就可以運行Linux內核源碼和跟文件系統

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

其中bzImage是vmlinux經過gzip壓縮后的文件,適用于大內核;vmLinux是編譯出來的最原始的內核ELF文件;initrd是內存根文件系統,只創建了一個rootfs.img,其中只有一個init的功能,用menu程序替代init, 內核啟動完成后進入menu程序。

三、跟蹤調試Linux內核的啟動過程
Qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rotes.img -s -S

-S CPU初始化之前將其凍結起來

-s 是默認在tcp::1234端口上創建了一個gdb-server

再打開一個窗口,啟動gdb,把內核加載進來,建立連接
file linux-3.18.6/vmlinux #把帶有符號表的內核鏡像加載進來
target remote:1234 #用tcp:1234端口來鏈接gdb server

然后在start_kernel函數和rest_init處設置端點,調試運行

四、對于start_kernel( )和rest_init( )的分析
start_kernel( )相當于main.c中的main函數,是首先運行的,在此函數調用之前,內核代碼主要是匯編語言編寫的,用于完成硬件系統的初始化工作,為C代碼的運行設置環境。這個函數主要進行各個模塊初始化工作,trap_init()(中斷向量的初始化)、mm_init()(內存管理的初始化)sched_init()(調度模塊的初始化)等。
init_task() :0號進程,初始化的起點
struct task_struct init_task = INIT_TASK(init_task);
可以看出 init_task(0號進程)是 task_struct 類型,是進程描述符,使用宏INIT_TASK對其進行初始化,并且init_task是唯一沒有通過fork方式產生的進程。

rest_init( ):
在此函數中調用kernel_thread進程來創建kernel_init和kthreadd內核線程

kernel_init()內核線程為1號內核線程,負責執行內核的部分初始化工作及進行系統配置,最后調用do_execve加載init程序,最后演變成用戶態1號進程——init進程。
kthreadd()函數的任務是管理和調度其他內核線程 kernel_thread。for 循環中運行 kthread_create_list 全局鏈表中維護的 kthread, 在create_kthread()函數中,會調用 kernel_thread 來生成一個新的進程并被加入到此鏈表中,因此所有的內核線程都是直接或者間接的以 kthreadd 為父進程。
小結:
本周學習了Linux內核源代碼,對于內核的源代碼目錄,編譯過程有了進一步的了解,但在學習中總會遇到新的問題,例如kernel_thread進程是由init零號進程fork出來的,以及idle進程與0號進程的關系,內核線程與用戶進程的區別,這些問題在CSDN論壇中大部分都以解決,但發現內核內部的知識非常高深,還需多多查閱資料

轉載于:https://www.cnblogs.com/20189210mujian/p/9906672.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的2018-2019-1 20189210 《LInux内核原理与分析》第四周作业的全部內容,希望文章能夠幫你解決所遇到的問題。

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