歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux內核

對Linux系統的理解以及學習Linux內核的心得

在上了Linux內核這門課後,我對Linux內核開始有了初步的了解,關於Linux內核,我覺得最重要的部分還是進程的創建以及切換,這是整個內核的核心部分。以下是一些我在學習Linux內核過程中的總結:
1、計算機是如何解讀高級語言的
2、操作系統是怎麼進行任務操作的
3、Linux內核的啟動過程
4、系統調用的工作機制
5、系統調用system_call的處理過程
6、Linux系統是如何創建一個新進程的
7、Linux內核如何裝載和啟動一個可執行程序
8、Linux進程調度時機和進程切換
縱觀整個過程,最讓我覺得難學的是操作系統是怎麼進行任務操作的以及進程的調度時機和切換。有一點始終不是很明白,就是這段代碼
"movl $1f,%1\n\t"
/* save eip */
為何每次將當前進程的eip保存為$1f,那樣每次任務切換回來時都會從1f開始,如果此時出現嵌套的話會不會引起紊亂等等。而關於進程之間的切換則需要內核堆棧的配合才能完成,堆棧是整個多任務運行的基礎,中斷的實現也是依靠堆棧實現的,所以堆棧是計算機多任務運行的核心,學習好堆棧的運行機制是學習Linux內核的基礎。
對於進程的創建,我是這麼理解的,先是有start_kernel這個函數通過init_task創建了0號進程,再由函數kernel_thread通過變量kernel_init和kthreadd又生成了1號和2號進程,而1號進程是所有用戶態進程的祖先,2號進程是所有內核線程的祖先,繼而可以創建更多的進程了。
而對於系統調用,我任務系統調用首先需要通過中斷向量與指令int
$0x80匹配起來進入到內核態,再由內核態中以system_call為起點的一段匯編代碼進行系統調用,其中需要用到系統調用號,然後進入系統調用函數sys_xyz(),系統調用完成後會查看有無其他掛起的任務,有就轉入syscall_exit_work,沒有就返回系統調用。
而關於Linux內核是怎麼創建進程的,我的總結是Linux系統創建一個新進程的全過程,創建一個新進程需要通過內核調用sys_clone來完成,大體的過程便是先對父進程的數據和環境進行復制,然後修改新進程的一些屬性,比如pid號等,之後通過do_fork函數和ret_from_fork函數完成對新進程的創建以及運行。但是進程又是怎麼裝載的,首先是通過sys_execve將函數的命令行參數和環境變量傳遞到內核堆棧中去,再由load_elf_binary將二進制文件加載到內核中去,再通過start_thread修改內核堆棧,創建新堆棧,然後將命令行參數和環境變量拷貝到新程序堆棧中,再進行任務調度,運行新程序。而新程序的起始入口為elf_entry。
關於進程的切換,我的理解是內核線程可以直接調用schedule()進行進程切換,也可以在中斷處理過程中進行調度,也就是說內核線程作為一類的特殊的進程可以主動調度,也可以被動調度;而用戶態進程無法實現主動調度,僅能通過陷入內核態後的某個時機點進行調度,即在中斷處理過程中進行調度。
系統通過調用schedule()函數選擇一個新的進程來運行,並調用context_switch進行上下文的切換,這個宏調用switch_to來進行關鍵上下文切換。

實驗總結:

學習完這個課程之後,我覺得最大的收獲就是我了解到了Linux內核強大的工作機制以及它對進程的管理,但是也有部分的遺憾,就是關於任務切換的某些細節不是很了解。但是因為這門課,我對Linux內核產生了濃厚的興趣,我希望在以後的學習中能更加深入的去了解Linux內核,包括那些我還不是很清楚的細節。

葉濤

《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000
Copyright © Linux教程網 All Rights Reserved