天天看點

linux學習總結

linux學習總結

                                                 20135103王海甯

《Linux核心分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000

一、學習感想

  九個星期的學習時間結束了,真的對linux是又愛又恨,愛它的變化多端應用性強,恨它的難以捉摸自己操作起來實在不容易。linux不同于所學的其他東西,捧着一本書死啃一個月也不會有什麼進展,除了要自己動手實踐之外,還需要一個領路人把你領進去,當你摸索到門道之後才能順着大路走,否則可能會原地打轉,甚至誤入歧途,在此真的很榮幸碰到孟老師,将我領入linux的大門,讓我去探索,去前進。孟老師的講解是真心好,每周一個小時的視訊,即使那不算實驗,到後來,幾乎每次都要花上三個多小時的時間去了解它,不下功夫真的跟不上,在此再次感謝孟老師的教導,以及網易雲課堂提供的這麼一個可以免費學習了解linux的機會,孟老師辛苦了,您的辛苦沒有白費,學生們都很敬重您,感激您,感謝您的教導。

    除了所學知識外,還有一點讓我很感動的是,linux本身并沒有一個目的,他并沒有一個準确的目标說我的任務是什麼,他就是一個核心,還有許多開發者從不同地方弄過來的東西,這些亂七八糟的東西拼湊在一起卻成為了一大筆财富,他并沒有說我做什麼,我不做什麼,他的存在就是為了友善所有人,用它去做所有可以的事情。

   除了網易雲的公開課,我們還跟着自己的老師上課,得知linux是開源的,就是一種分享,你可以從網站上找到任何你想要的,這不是為了自由,而是為了讓所有人找到他們需要的,去更改,去定制自己的代碼,給與人們友善。

   linux最大的優點就是它将所有都視為檔案,這樣最大的好處就是便于管理,雖然應用上有些不便,但這也是一個相當好的思路。

二、每周重點

    第一周:反彙編

            顧名思義,就是将彙編語言變成電腦語言,從cpu的角度主要就是堆棧和出棧,将資料放入棧中進行存儲、運算和輸出,用過ebp,esp控制寄存器的變化

    第二周:精簡核心分析(基于時間片輪轉)

            這裡我們了解了計算機的三大法寶:(1)存儲程式計算機(2)函數調用堆棧(3)中斷機制

    第三周:跟蹤分析核心的啟動過程

            rest_init()就是start_kernel從程序核心一啟動的時候就一直會存在,就是0号程序;

            0号程序建立了1号程序以及其他的一些服務的核心線程,這樣整個系統就啟動起來了。

    第四周:系統調用

            系統調用三層皮:(1)xyz( API )    (2)system_call( 中斷向量 )    (3)sys_xyz( 服務程式 )

    第五周:system_call過程分析

            (1)int 0x80從使用者态進入核心态,跳到system_call()函數處執行相應服務程序。在此過程中核心先儲存中斷環境,然後執行系統調用函數。

            (2)system_call()函數通過系統調用号查找系統調用表sys_cal_table來查找具體系統調用服務程序。

            (3)執行完系統調用後,iret之前,核心會檢查是否有新的中斷産生、是否需要程序切換、是否學要處理其它程序發送過來的信号等。

            (4)核心是處理各種系統調用的中斷集合,通過中斷機制實作程序上下文的切換,通過系統調用管理整個計算機軟硬體資源。

            (5)如沒有新的中斷,restore儲存的中斷環境并傳回使用者态完成一個系統調用過程。

    第六周:程序建立過程學習

             (1)無論用三種系統調用clone、fork、vfork中的哪種來建立一個新程序,都是通過調用do_fork來實作的

             (2)通過複制父程序PCB的task_struct建立一個新程序

             (3)子程序修改複制後的PCB,如pid、程序連結清單等

             (4)fork()系統調用産生的子程序從ret_from_fork處開始執行,p->thread.ip = (unsigned long)ret_from_fork

             (5)可通過傳回值判斷目前程序是父程序還是子程序,父程序處傳回程序号,子程序自己傳回0

    第七周:可執行檔案的裝載和運作

           可執行程式是怎麼得來的:C代碼經過編譯器的預處理編譯、編譯成彙編代碼、編譯器将其編譯成目标代碼、連結成可執行檔案

            Linux核心裝載和啟動一個可執行程式

                 (1)建立新程序

                 (2)新程序調用execve()系統調用執行指定的ELF檔案

                 (3)調用核心的入口函數sys_execve(),sys_execve()服務例程修改目前程序的執行上下文 

            ELF格式中主要有3種可執行檔案:可重定位檔案.o,可執行檔案,共享目标檔案  

            ELF可執行檔案會被預設映射到0x8048000這個位址           

           指令行參數和環境變量是如何進入新程式的堆棧的

            Shell程式-->execve-->sys_execve,然後在初始化新程式堆棧時拷貝進去。

            先函數調用參數傳遞,再系統調用參數傳遞

            目前程式執行到execve系統調用時陷入核心态,在核心中用execve加載可執行檔案,把目前程序的可執行檔案覆寫掉,execve系統調用傳回到新的可執行程式的起點

            動态連結庫的裝載過程是一個圖的周遊過程,ELF格式中的.interp和.dynamic需要依賴動态連結器來解析,entry傳回到使用者态時不是傳回到可執行程式規定的起點,傳回到動态鍊            接器的程式入口

    第八周:程序排程過程分析

           Linux中程序切換的一般步驟為:  

      (1)檢測目前程序的狀态,挂起目前程序的IO請求以防止死鎖

      (2)擷取目前運作CPU,以及它的可運作程序隊列

      (3)從程序隊列中擷取目前程序的task_struct,并通過程序排程算法從隊列中選擇一個合适的程序作為待調入程序

      (4)檢測待調入程序的狀态以確定其正确性

      (5)使用switch_to宏來進行目前程序與待調入程序的切換(期間完成新程序的資源準備工作)

      (6)新程序完成schedule(),結束整個程序切換過程

 三、部落格彙總

  第一周: http://www.cnblogs.com/haiye/p/5213800.html 

  第二周: http://www.cnblogs.com/haiye/p/5245593.html 

  第三周: http://www.cnblogs.com/haiye/p/5271563.html 

  第四周: http://www.cnblogs.com/haiye/p/5296174.html 

  第五周: http://www.cnblogs.com/haiye/p/5325347.html

  第六周: http://www.cnblogs.com/haiye/p/5350333.html

  第七周: http://www.cnblogs.com/haiye/p/5374272.html

  第八周: http://www.cnblogs.com/haiye/p/5402162.html

四、總結

  說實話,不是恭維,這門課的遺憾在于時間太短,好多東西沒能繼續學下去,如果孟老師能接着講下去就好了,真的能學到很多東西。有些東西學的并不隻是一門學科,更重要的是老師的思路,知識如果隻是學到,而不能融會貫通,我覺得和沒有學過差别不大,提綱挈領比硬塞知識,真的好的多太多,隻有邏輯搞清楚,主線弄明白,腦子裡的條理才會清晰,這樣才能說真的我學了這門課。

    雖然這門課在網易雲上學完了,但我的課程還沒有結束,感謝孟老師把我領進門,帶我走過最開始的懵懂階段,接下來我會自己認真的走下去。多謝孟老師,辛苦了。