Linux學習心得

2021-07-02 06:05:48 字數 3238 閱讀 9687

一、首先我分享一下我對linux學習過程的幾篇部落格:

1. 通過反編譯乙個簡單的c程式,解釋堆疊的變化

2. 乙個精簡的linux核心分析

3. 跟蹤分析乙個簡單的linux核心的執行

4. 分析乙個api的呼叫機制

5. 分析linux核心建立乙個新程序的過程

6. linux核心如何裝載和啟動乙個可執行程式

7. 理解程序排程時機跟蹤分析程序排程與程序切換的過程

二、我對linux的理解

1、linux下使用的彙編和windows下的彙編是不太一樣的。首先,windows的運算結果都是存在左邊的暫存器中,而linux下彙編的運算結果是儲存在右邊的暫存器中的。其次,關於定址的表示方法上也有一些不同:

這裡末尾的b,w,l,q分別代表8位,16位,32位和64位;%代表暫存器;$代表數值;

call指令相當於:

pushl eip

movl f,eip (f為跳轉位址)

ret指令相當於:

popl eip(*)

//*表示使用者是無法進行這樣的操作的

2、在呼叫函式時,函式的引數傳遞是從右至左一次傳遞的。所以要從右至左依次進行push,等引數傳遞完畢之後進行call操作。系統呼叫號的引數傳遞是通過eax來進行傳遞的。

3、在進入乙個函式呼叫之後需要為函式開闢乙個新的堆疊空間。具體操作如下:

push

%ebp

mov %esp,%ebp

在離開呼叫函式之前,需要將這塊堆疊空間釋放。具體操作如下:

mov  %ebp,%esp

popl %ebp

4、學會在c程式中嵌入彙編**,將會使我們的功能更加靈活。具體例子如下:

需要注意的就是output和input部分的編號是從0依次增大的。

5、使用者態和核心態:

linux中,使用0級表示核心態;3級表示使用者態。

cs暫存器的最低兩位表明了當前**的特權級;

0xc0000000以上的位址空間只能在核心態訪問,0x00000000—-0xbfffffff的位址空間在兩種狀態下都可以訪問。

6、使用gdb對程式進行跟蹤除錯是乙個十分重要的程式分析手段,我們可以通過跟蹤程式的執行過程來搞清楚程式的執行機制。下面我們演示一下dgb的使用方式:

# 啟動menuos系統

cd linuxkernel/

qemu -kernel linux-3.18.6/arch/x86/boot/bzimage -initrd rootfs.img

# 使用gdb跟蹤除錯核心

qemu -kernel linux-3.18.6/arch/x86/boot/bzimage -initrd rootfs.img -s -s # 關於-s和-s選項的說明:(這個是在linuxkernel目錄下執行的)

# -s freeze cpu at startup (use 』c』 to start execution)

# -s shorthand for -gdb tcp::1234 若不想使用1234埠,則可以使用-gdb tcp:***x來取代-s選項

另開乙個shell視窗

gdb(gdb)file linux-3.18.6/vmlinux # 在gdb介面中targe remote之前載入符號表

(gdb)target remote:1234

# 建立gdb和gdbserver之間的連線,按c 讓qemu上的linux繼續執行

(gdb)break start_kernel # 斷點的設定可以在target remote之前,也可以在之後

7、程序的建立:

#include 

#include

#include

int main(int argc, char * argv)

else

if (pid == 0)

else

}

fork()的呼叫是比較特殊的,一次呼叫兩次返回。一次返回是父程序的返回,還有一次是子程序的返回。子程序返回後的執行位置是ret_from_fork。

8、程序排程的時機

1) 中斷處理過程(包括時鐘中斷、i/o中斷、系統呼叫和異常)中,直接呼叫schedule(),或者返回使用者態時根據need_resched標記呼叫schedule();

2) 核心執行緒可以直接呼叫schedule()進行程序切換,也可以在中斷處理過程中進行排程,也就是說核心執行緒作為一類的特殊的程序可以主動排程,也可以被動排程;

3) 使用者態程序無法實現主動排程,僅能通過陷入核心態後的某個時機點進行排程,即在中斷處理過程中進行排程。

9、程序的切換

1)為了控制程序的執行,核心必須有能力掛起正在cpu上執行的程序,並恢復以前掛起的某個程序的執行,這叫做程序切換、任務切換、上下文切換;

2)掛起正在cpu上執行的程序,與中斷時儲存現場是不同的,中斷前後是在同乙個程序上下文中,只是由使用者態轉向核心態執行;

3)程序上下文包含了程序執行需要的所有資訊

(1)使用者位址空間:包括程式**,資料,使用者堆疊等

(2)控制資訊:程序描述符,核心堆疊等

(3)硬體上下文(注意中斷也要儲存硬體上下文只是儲存的方法不同)

4)schedule()函式選擇乙個新的程序來執行,並呼叫context_switch進行上下文的切換,這個巨集呼叫switch_to來進行關鍵上下文切換

二、總結

這裡總結的一些心得只是我linux學習過程中的一部分,只起到乙個總領的作用,具體內容的學習還是要要進入相關的部落格正文進行學習。相關部落格已經在最前面給出了鏈結,需要使用時請到對應的部落格進行檢視。

這次的學習收穫很多,尤其是系統呼叫和程序的切換這一塊。以前對使用者態和核心態完全沒有任何概念,現在通過對中斷的學習,對核心態有了乙個基本的認識。

但是這次的學習還是不足,對linux核心的整體工作機制還是不是很理解,對知識的掌握比較片面,不能將這些知識點串聯起來。接下來要做的就是對這些知識點進行一下梳理,把零散的知識點連成一片。

linux學習心得

在使用linux系統時,如要利用一些終端服務。都需要開啟linux中的相應伺服器。其中可以利用chkconfig list 或 chkconfig list more命令檢視服務是否起動。如檢視ftp服務 可用chkconfig list grep vsftpd 如果其狀態是關閉的,就要用chkco...

Linux學習心得

說起linux,就難免讓人想起windows 但反過來,談起windows,卻不一定會讓人想起linux,可見linux還有很長的一段路要走 基本上都會將linux與windows放到一起來比較,比如哪個系統操作更方便,哪個系統更加安全,哪個系統使用更加高效等等。拿桌面端來講,自然是windows系...

學習心得 python學習心得

自從來了深圳工作以後,尤其是屢屢面試碰壁以後。發現其實自己的知識面很窄,做筆試題的時候絞盡腦汁還是漏洞百出,並不是不會做,而是出現一大堆不該有的失誤。每次被問道,對資料庫了解嗎?說一大堆看起來很高階的東西 好啊,那我們寫幾個sql語句吧。馬上完蛋了,沒了手冊關鍵字都記不起。了解哪幾種指令碼語言,sh...