1. 程式人生 > >Linux核心課程學習心得

Linux核心課程學習心得

羅曉波 + 原創作品轉載請註明出處 + 《Linux核心分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000 

不知不覺,八週課程一晃而過,回想起當初選擇這門課到學習完最後一個課件,也是一個習慣的養成了,到現在我倒是習慣性地在週五和週日上一下課程主頁,不過在這八週的線上課程學習中,我還是有所收穫的,下面把我的一點小感想分享一下吧。

課程第一週,通過一段反彙編程式碼淺析計算機工作方式,這一週主要是通過實驗“通過反彙編一個簡單的C程式,分析彙編程式碼理解計算機是如何工作的”,通過反彙編,得到一段C程式的對應的彙編程式碼,通過在反彙編中esp,ebp,eip的變化以及堆疊的變化來說明了馮諾依曼體系結構下計算機的工作方式,函式的呼叫棧的狀態變化等。

課程第二週,通過一段精簡的程序切換程式碼,聊一下OS是如何工作,這一週主要通過老師給的一個精簡的MyKernel 核心,分析精簡的mykernel程式碼,Mykernel OS對於程序的啟動以及切換較之linux 核心都是有一定相似性的,但是真正的linux核心考慮的東西遠比這個mykernel多得多,但是都是從一個初始化上下文環境的函式開始執行,即start_kernel函式,建立很多程序或者fork若干程序,當中斷髮生的時候,如mykernel中就是時鐘中斷髮生之後,接下來OS就會為各程序進行排程,在排程佇列中選取出一個適合的程序,由CPU和核心堆疊儲存前一個程序的各暫存器資訊(程序描述塊中的thread結構體儲存大部分CPU暫存器,但是諸如eax、ebx等等這些通用暫存器是儲存在內和堆疊中的),將eip指向要排程的程序執行的地址,開始執行。

課程第三週,初看linux核心啟動過程,這一週主要通過用gdb來跟蹤一下linux核心的啟動過程,從start_kernel開始到結束的過程就是整個核心初始化的過程,在初始化之前,那個後來淪為idle程序的也就是核心靜態建立的一個pcb,也就是0號程序,通過rest_init進一步fork出了兩個程序,一個是init程序,另外一個是kthread程序。

課程第四周,談談對linux系統呼叫的理解,本週主要通過一個簡單的系統呼叫,程式設計師通過API來進行系統呼叫,例如一些libc庫提供的posix API,如getpid就是這樣一個posix API,它提供了使用者態到核心態的訪問,在核心態儲存大多數暫存器的內容;呼叫名為系統呼叫服務例程的響應的C函式來處理系統呼叫;退出到系統呼叫處理程式,用儲存在核心棧中的值載入暫存器,cpu從核心態切換回使用者態。


課程第六週,Linux核心建立一個新程序的過程,本週學習了linux核心在建立一個新程序的過程,通過系統呼叫,不管是clone、fork、還是vfork這三個系統呼叫都是對應的一個系統服務例程,那就是do_fork()函式,在dofork之後,就緊接著建立新程序的程序描述符以及子程序執行所需要的其他核心資料結構,也就是copy_process函式裡所做的東西。由於將父程序的當前堆疊都拷貝到了子程序的堆疊中,在上述分析中,當子程序的程序描述符中的已經將eip、esp以及各暫存器和核心棧、資料段的值都準備好了,程序排程之後,便可以開始執行子程序了。

課程第七週,Linux核心如何裝載和啟動一個可執行程式,本週主要通過一個elf檔案的執行過程,分析execve系統呼叫,當從核心態返回到使用者態的時候,上下文被新的可執行的檔案大面積更改和替換,原本呼叫系統呼叫的使用者態程式碼也不會再繼續執行了。

課程第八週,淺談 程序排程的時機和程序切換,主要是學習了在schedule函式中,著重於switchto這個函式中的彙編程式碼,並通過堆疊即暫存器的變化,瞭解了程序間的切換時上下文的改變。

上面就是八週的mooc學習得清單列表,當然,線上下,我也學習了linux相關的知識,在對應著老師課堂的內容學習著深入理解linux核心書中提到的相關知識點,雖然有的只是從概念層面的瞭解,但是終歸是有一定收穫的,比如linux檔案系統的掛載、start_kernel函式裡面的初始化工作、linux通過8259A中斷控制器對中斷和異常的種種處理等等。

在學習《Linux核心分析》課程中最大的收穫:

最大的收穫就是掌握瞭如何去學習linux核心的方法,雖然linux核心龐大無比,但是就像老師說的那樣,從start開始一環一環的研究,先搞清楚每一環之間的聯絡,弄清楚如何運轉之後再結合書本和老師的講解和網際網路上的搜尋深入的理解某一個環節,進行較為深入地學習,當然,每一環的學習最好都是有實驗的輔助,效果是最佳的了。實驗樓就是這樣的一個環境,提供了方便的學習環境和支援。

學習完《Linux核心分析》課程後您最大的遺憾:

最大的遺憾莫過於自己沒有親手在自己的linux系統上,自己折騰一下屬於自己的Mykernel,沒有自己親自去體會製作一個簡易的linux系統的。這是我最大的遺憾了。不過後期有時間會彌補這個遺憾的。

相關推薦

Linux核心課程學習心得

羅曉波 + 原創作品轉載請註明出處 + 《Linux核心分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000  不知不覺,八週課程一晃而過,回想起當初選擇這門課到學習完最後一個課件,也是一個習慣的養成了,到現在我

課程學習心得體會

協作 項目 project er圖 範圍 product 學習 people 感覺 當看到課程表有軟件工程導論大的時候,就覺得好奇,這是一門什麽樣的課程。如今已學了一個學期的這門課了,雖然不能說完全掌握全部內容,但也知道了軟件工程導論的大概了,說來慚愧,覺得學

Linux基礎入門---學習心得大資料學習|小白學習大資料需要滿足這六個條件你就能學好大資料

有很多學習大資料的朋友,在初期學習時,通常會對如何學習而感到迷茫。我經常收到零基礎的朋友關於如何入門、如何規劃學習大資料、大資料的學習流程是什麼的一些問題。今天我就粗淺的總結幾點學習大資料方法。 一、興趣建立 興趣是可以讓一個人持續關注一個事物的核心動力,那麼興趣的培養就非常重要了。如果你把寫程式單純作為

linux核心程式設計學習筆記

常見問題 一、核心模組A呼叫核心模組B 檢視匯出的核心符號表 cat /proc/kallsyms | grep 'func_m2' 1、一個核心模組A呼叫另一個核心模組B的匯出函式,需要做到三點 1.模組B先載入 2.模組B函式匯出成功 3.模組B編譯後會有個Module.sy

心得丨吳恩達Deeplearning.ai 全部課程學習心得分享

選自Medium作者:Ryan Shrott    機器之心編譯 本文作者,加拿大國家銀行首席分析師 Ryan Shrott 完成了迄今為止(2017 年 10 月 25 日)吳恩達在 Coursera 上釋出的所有深度學習課程,併為我們提供了課程解讀。 目前 Coursera 上可用的課程中,

一點點linux系統的學習心得

我相信你正在閱讀本文的時候,可能是因為你渴望學習Linux技術。我想分享一下過去兩年中我自己的一些學習經歷,希望你能更順利地成為Linuxer。 兩年前在Linux系統的執行和維護方面找到了一份工作(當時估計該公司非常缺乏,哈哈),我在收到錄取通知後才開始學習Linux技術。但是,由於本科生不是計算機專業,

Linux核心驅動學習(二)----根檔案系統的構成 (root filesystem)

1、建立根檔案系統目錄和檔案 1.1建立目錄 1.2建立裝置檔案(命令mknod);必須建立裝置檔案---consle\null 1.3建立配置檔案---複製已有的/etc目錄下的檔案

Arm+Linux核心驅動學習筆記

韋東山老師幫我們把框架搭建起來了,我們先來看一下: 框架: app:      open,read,write "1.txt" ---------------------------------------------  檔案的讀寫 檔案系統: vfat, ext2,

linux下raid學習心得和raid0的實現

常見的硬碟:SATA一般pc機主流的硬碟。SCSI一般伺服器應用廣泛。IDE比較老,二者均可。 RAID 的意思是廉價磁碟冗餘陣。是一些列放在一起,成為一個邏輯卷的磁碟集合。 軟體RAID和硬體RAID 軟體RAID的效能低,使用主機資源,載入RAID軟體,從軟體RAID卷

linux 核心hash_list學習筆記

linux核心為了方便進行連結串列的操作,定義了一系列很方便的巨集定義,在平時的專案開發中,應用巨集定義能使得專案事半功倍,下面是核心實現原始碼的實現,僅重定義了名字,正在學習,就暫時記錄下來吧: 結構定義: typedef struct hlist_node

Linux系統的學習心得

這個學期,我們學習了Linux系統的核心。主要學習了程序排程,中斷過程和系統呼叫。可以說,這些都是linux核心中的核心功能,正是由於這些功能的組成才組成了一個Liunx系統。下面,我就簡單地回顧一下這幾個核心功能。 中斷過程 中斷可以說是系統中最重要的

Linux核心驅動學習(四)----記憶體管理子系統

kmalloc()和vmalloc()介紹 kmalloc() 用於申請較小的、連續的實體記憶體 1. 以位元組為單位進行分配,在<linux/slab.h>中 2. void *kmalloc(size_t size, int flags) 分配的記憶體實體地址上連續,虛擬地址上自然

linux 核心模組學習

【存疑:The __exit macro causes the omission of the function when the module is built into the kernel, and like __exit, has no effect for loadable modules. ;

linux核心模組學習筆記 ----- 核心模組的編譯和載入

核心模組的編譯 編譯方法一: 在系統中已經存在核心程式碼樹結構的前提下,假定核心程式碼目錄位於 /usr/src/linux-4.17-rc3目錄下。編寫如下makefile檔案,makefile檔案內容如下: obj-m:=module.o module-ob

網易公開課《Linux核心分析》學習心得-Linux核心如何裝載和啟動一個可執行程式

實驗 設定斷點sys_execeve,並繼續 程式碼執行到了SyS_execve。在QEMU中執行exec,可以看到只能出現兩句,沒有完全執行完畢。 設定斷點load_elf_binary和start_thread,並執行,可以看到程式碼停在了

網易公開課《Linux核心分析》學習心得-理解程序排程時機跟蹤分析程序排程與程序切換的過程

首先在核心程式碼中搜索schedule,發現以下結果 在core.c檔案中是 實驗 設定斷點 跟蹤schedule的程序 可以看到 struct task_struct *tsk = current; sched_subm

linux find命令用法 linux學習心得體會

txt linux ali 學習心得 訪問 lin atime str 輸出 find命令用來在指定目錄下查找文件的命令,和locate不同,find命令是實時精確查找,不做模糊匹配,但是可以使用通配符查找,相對更精確。任何位於參數之前的字符串都將被視為欲查找的目錄名。如果

linux驅動開發學習--對中斷和核心定時器的學習筆記

一 中斷理解                             &nb

linux 核心學習過程(1)-硬體特性和核心設計之間的聯絡

該貼用來作為自己學習linux核心的記錄和筆記,很多東西都是自己理解後整理的內容,各位看官若覺得有問題的地方,可以留言或自行查閱。 linux核心在設計的過程中很多都是依據硬體晶片特性來設計,晶片在設計的過程中很多時候需要保持相容性,這樣就留下了很多令人費解的概念,比如分段和分頁機制,

Learning Linux Shell Scripting 學習Linux Shell指令碼 Lynda課程中文字幕

Learning Linux Shell Scripting 中文字幕 學習Linux Shell指令碼 中文字幕Learning Linux Shell Scripting Linux shell指令碼是消除重複,枯燥任務的有用工具 指令碼使得從程式設計到系統管理的許多工作更容易