1. 程式人生 > >來著豆瓣經典點評《深入理解linux核心>>

來著豆瓣經典點評《深入理解linux核心>>

曾幾何時,我們為除錯成功第一段彙編小程式而歡欣鼓舞,為寫完C語言小程式通宵達旦,為自己的資料結構解決了一個實際問題而躊躇滿志。再後來我們學習了計算機組成原理或者高階點的計算機系統結構,學習過作業系統的實現和設計,看過演算法導論...但好像一切又漸漸變得遙遠了,雖然書本上的一切也都感覺上能理解,但總是朦朦朧朧覺得缺少點什麼,或許是覺得所有的知識都是斷斷續續的,感覺很多知識是無本之源。但這本書拂去了一切擋在眼前的薄薄塵埃,讓我看見所有的一切都在這裡完美結合了,有如靈魂和肉體的結合,一切都富有活力起來。彙編、資料結構、演算法、作業系統理論、計算機系統結構、C語言、編譯器等等好像都在這裡閃動著五顏六色的極富魅力的小光線,我揉了揉乾澀的眼睛,漸漸地,我看清了它們組成的光芒照耀著的是作業系統...
  
    看的是影印版,本書特點:
      1.也是最大的特點,用足夠多的彙編來介紹作業系統的一些功能如啟動、切換、同步、中斷。彙編(不是DOS下的彙編)是瞭解作業系統跳不過去的坎,有了至少一種CPU彙編的理解,其實相當於理解了相應CPU的架構,這才算真正的開始瞭解作業系統。這本書是彙編和Linux作業系統的橋樑。
      2.對編譯作業系統需要的編譯選項也做了不少鋪墊,真的算體貼入微了。
      3. 有如外科手術刀,提供了很好的幾個斷面來了解Linux。即使這麼複雜的系統,也能這樣娓娓道來,非常不容易。 循序漸進、深入淺出,書中出現的未知內容或者重要概念一般會提示你在哪裡查詢。
    
      本書是我看過花費時間最長的書,總結原因如下:
      1. 知識量大:作業系統本身概念多、難點多、平時接觸少。
      2. 細節太多:本書主要從下至上的形式講解,一開始就有太多的細節(彙編、資料結構、函式),需要熟讀幾遍的基礎上才有可能再從上到下的方法進行總結,知道了重點和紐帶,思路才變得慢慢清晰起來。遺忘和迷失方向是經常的,每次學習也帶來新的自我提問。檢視相關程式碼的資料結構、函式、相互引用、書本內容的確認需要很多時間。另外Linux 2.6是個實際執行系統,太多的錯誤處理、介面、引數和擴充套件等,使得原始碼變得更加晦澀難懂。
      3. 內容交織:書中幾乎每一章與其他章節都聯絡緊密。僅僅一個函式,可能引用了書中很多其他章節或作業系統的許多概念,變得非常難以理解(如Page Fault Exception Handler(P376)),因此你根本無法僅依賴熟讀某一章裡面就完全瞭解這一章內容,而且幾乎每一章都包含一些後面章節未介紹的概念,很多時候覺得有點無處下手。每個功能的區別可能用一個位來表示,變得非常隱晦,很難記住這麼多。作業系統的概念介紹一般包括功能、實現方式、資料結構、相關函式(演算法)、彙編實現、全域性變數、初始化、正常關閉等。同時每個概念的實現中還可能包括系統呼叫、特殊檔案目錄(/proc或/sys)、shell命令、系統初始化(start_kernel下的函式)、許可權、資源、中斷、訊號、編譯選項、統計等。因此也積累了無限的可能,這也許作業系統難學的原因吧。作業系統的複雜也許來自於層次性和不可分割性。
  
    看了本書的體會:
  1. linux作業系統讓資料結構、演算法、計算機系統結構、彙編、驅動、有了馳騁的疆場。作業系統的設計理念得到實現或試驗,而不是僅僅停留在白紙上。
  2. 問題的思考層次,程式設計中出現的問題能嘗試從多層次出發進行考慮,如CPU指令/作業系統實現(包括模組和驅動)/系統函式介面/C函式介面/應用系統,理解作業系統在其中能起到的橋樑作用,同時兼顧編譯器的幫助。
  3. 這本書打開了無數扇窗,每一扇風景都等著你去發現。這本書只是認識Linux作業系統的開始,這本書理論為主,實戰少。但是經過這本書磨練,實際工作中的碰到的作業系統中大部分的概念,你都可以自己在原始碼中得到證實,而不是“好像覺得","牛人說","書上說"。
  4. 對windows作業系統也會有新的認識,並且嘗試重新認識資料庫、java虛擬機器等。
  
    本書的重點總結:
  1. 彙編 head.S entry.S 與啟動、切換、中斷、系統呼叫等相關
  2. 記憶體管理(P35,P294)
  3. 程式切換和排程(P102, P290)
  4. ext2檔案讀(寫)過程:結構圖(P561) 理解每一層的做什麼
  5. 各個層的快取、各種快取技術(LRU,cache, hot/cold page…),,以及頁面回收演算法RFPA
  6. exec過程(P828):
  
  
  ext2檔案讀(寫)過程:結構圖(P561) 理解每一層的做什麼
  read(P508)                                                  【層:User Mode】
  -->sys_read-->vfs_read-->file->f_op->read()                 【層:VFS】
    ---->generic_file_read(P632)                                【層:Disk File(Block Device File)】
      ------>do_generic_file_read(p635)-->do_generic_mapping_read 【層:Page Cache (inode)】
        -------->ext2_read_page(P638)-->mpage_readpage()            【層:ext2】
          ---------->submit_bio()-->generic_make_request(P570)        【層:Generic Block Layer】
            ------------>__make_request -->q->add_request()             【層:I/O Scheduler】
    相關request在I/O Scheduler佇列中的 q->request_fn函式(即do_hd_request)呼叫:
    do_hd_request(以HD.c為例)                                 【層:Block Device Driver 取佇列,發起讀請求】
       -->elv_next_request(),
       -->hd_request()      
    read_intr()                                               【層:Block Device Driver中斷,讀資料,從佇列中刪除,再發起請求】 
      -->end_request()
         ---->end_that_request_first()  
         ---->blkdev_dequeue_request()
         ---->end_that_request_last()
  
  共享記憶體(P801)、檔案對映(P657)、直接檔案讀寫的區別
  a. 共享記憶體的缺頁:
  do_no_page (預先在mmap()-->shmem_zero_setup設定shmem_nopage )
    -->vma->vm_ops->nopage  
    -->shmem_nopage 
      ---->shmem_getpage
         ------>find_lock_page                                   
         ------>shmem_alloc_page
         ------>add_to_page_cache_lru                            
  b. 檔案對映的缺頁:
  do_no_page(預先在mmap-->file->f_op->mmap設定filemap_nopage)
    -->vma->vm_ops->nopage 
    -->filemap_nopage                                       
      ---->find_get_page
      ---->mapping->a_ops->readpage(一般為ext2_aops.read)   
      ---->ext2_readpage 函式直接讀寫 ext2檔案系統,inode快取由前面的步驟建立了。
                            
  c. 檔案對映和直接讀寫檔案相同點:
    i. 都呼叫ext2_readpage函式,則ext2層以下完全相同
    ii. 都採用inode的Page Cache,由直接檔案讀寫的do_generic_file_read和檔案對映的filemap_nopage分別建立
    iii. 都可能嘗試磁碟的預讀。
  d. 檔案對映和直接檔案讀寫不同點:
    直接讀檔案,修改後並寫入檔案:資料需要從核心態-->使用者態複製一次,再從使用者態-->核心態複製一次,還可能需要兩次高階對映。
                                   
  
  相關參考書目:
    <深入理解計算機系統>
    <Intel Achitecheture Software developer's manual>
    <Unix 高階程式設計>
    <Linker & Loader>
    gcc 文件
  
  附:
    不過就在昨天,我覺得自己是個碎片,在生命的蒼穹中毫無節奏地顫動。
    如今我知道自己就是蒼穹,一切生命都是節奏分明的碎片,在我內在活動。.....紀伯倫

因為要懂得指標,深入學習C就是在學習指標。

要構架知識,彙編還不是一般的8086的,要32位的,具體的要求比樓主的高多了,具體要求的課程有:

C語言(精通指標),資料結構,組合語言(32位),intel知識構架,最好讀intel的程式開發員手冊第三卷,可以到intel網站申請寄過來(免費),計算機組成原理。大概就這樣。