欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1634|回復: 0
打印 上一主題 下一主題
收起左側

我對linux內核的總結認識

[復制鏈接]
跳轉到指定樓層
樓主
ID:107189 發表于 2016-3-5 17:47 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
第一次接觸linux是高三那時,后來在大學里舍友T總的影響便開始了對linux的不斷追求與學習。讀萬卷書不如行萬里路,以前在學校里看了那么多書還不如工作中在代碼中煅練,當然關鍵是找到個入門口點,我選擇驅動程序開始!下面總結和談下學習驅動后對其的理解與認識。



1.內核是怎樣實現其管理的職能?

以前在學校時一直不能理解內核是怎么做管理?比如內核如何知道在什么時候對各個進程做調度,又在什么時候知道缺頁從而執行內存比如內核如何知道在什么時候對各個進程做調度,又在什么時候知道缺頁從而執行內存管理的代碼,內核為什么在會需要它管理的時候被喚醒,進程在用戶態跑的好好的,又是誰喚醒內核轉入核心態去check一下?內核管理職能的實現一方面可以是通過中斷觸發,這些中斷包括系統調用,硬件中斷;另一方面有一些內核線程長期運行在內核態。因為系統調用往往觸發相應驅動程序代碼的執行,而驅動程序本身包含大量可以導致進程休眠的代碼,例如一個系統調用read把CPU從用戶態轉到核心態,經過虛擬文件系統VFS傳入到設備相關的驅動程序中file_operations的真正實現函數read,這個系統調用可能引發內核中很多管理模塊的執行,假如驅動中發現設備沒有可用的數據時對于阻塞型的調用,驅動程序會把與其相關聯的用戶執行線程掛起休眠,從而讓出了CPU實現了進程調度器的調度。另外,一般來說CPU定時器會周期性地喚醒內核讓其check一下,看一下有沒有東西需要它處理的(主要是引發了軟中斷的產生,進而可能執行一些軟中斷的任務,稍后解釋什么是軟中斷)。這就是內核的“心跳”,一般PC上會把這個心跳值HZ(每秒定時器中斷次數)設置為100~1000,jiffies是開機累計心跳值。同樣,CPU外部的器件會產生大量的中斷,這樣使得內核也知道了它將要干什么。最后,內核線程kernel thread在內核態周期性地執行,例如磁盤高速緩存的刷新,網絡連接的維護,頁面的換入換出等。



2.代碼執行空間及其可見度

以前看一本書操作系統的書搞得好頭痛,x86上又是什么GDT,又是什么LDT,MMU的存在搞得內存這塊非常的難懂。現在看來在區分用戶態和核心態的32位系統上,用戶進程所能看到的空間僅僅分配給它的4G虛擬地址空間,用戶進程要想通往內核的唯一途徑是內核事先定義的有限數目的“系統調用”。系統調用的實質是該進程把數據(包括中斷號,系統調用的參數)放進 CPU特定寄存器并向CPU發送一個異常。通往內核并不意味著用戶進程就能看到并且干預內核空間,它能且僅能通過系統調用給定的接口參數向內核申請服務,這樣內核會接手和代表用戶進程并借用該用戶進程的上下文繼續執行(英文context的翻譯,是指程序計數器、棧和一組寄存器等),CPU轉入核心態,內核代碼就執行該系統調用在內核中的“實現部分”以滿足用戶進程對數據操作的需要,就執行路線上說,此時的內核執行處于“該用戶進程上下文” 中,內核能夠看到該用戶進程的空間并且該執行路線是與用戶進程相關,內核訪問用戶空間的代碼隨體系結構不同而有不同的實現,而且需要經過地址轉換。待內核處理完系統調用返回后,則轉回用戶態,用戶態進程就在該系統調用返回繼續前行。在這種多任務的操作系統中,內核代碼存在著多條執行路線,所以內核代碼非常講究代碼可重入性設計。在內核中,中斷不與任何一個用戶進程相關,包括定時器中斷或者外圍硬件中斷和甚至“軟中斷”,即不是運行在任何一個進程的上下文中而是運行在中斷上下文擁有自己的程序計數器、棧和一組寄存器;常常硬件中斷的發生并且被響應必定意味著切換CPU上下文。中斷上下文不代表用戶進程,所以中斷執行例程不能訪問用戶空間的一切內容。



3.驅動程序是什么?及其與內核的關系

驅動程序本身就是內核的一部分,從www.kernel.org下載回來的內核代碼,單從代碼量來說驅動程序超過占65%,當然因為內核配置和條件編譯的關系,并不是所有的驅動都會被選上。內核中除掉驅動程序以外的代碼是一個框架,該框架提供一個公有的屬性,不隨CPU體系架構和具體硬件型號而變化,也是一個高度抽象模塊集,更是內核的“基礎設施”,這個基礎設施向驅動程序提供一些接口和定義一些標準。驅動程序的設計要遵循內核給定給驅動程序的標準并使用內核和接口,這樣就把操作具體硬件相關的工作交給了驅動程序,抽象出更一般的模塊,提高了操作系統的可移植性,可擴展性,和標準化。就像做填空題那樣,驅動程序在內核給定的空格上填好這個固定的空以使整個表達式是正確的。嚴格來說驅動程序包括:CPU體系架構驅動,各種各樣的硬件設施驅動。一般的驅動開發者其實工作的重點是除CPU外的設備的適配。基于CPU體系架構的實現依賴于具體的平臺如ARM,X86,SPARC,PPC,MIPS等,所以具體到平臺的實現部分有些是用匯編語言寫的,這些匯編因不同的體系結構而不同(某種原因是C語言實現不了的操作,某些是基于采用匯編實現效率更高更安全)。比如在關中斷開斷的實現又或切換進程上下文等操作采用匯編。除CPU外的設備一般C語言就完成了,因為大多數是與操作寄存器和數據讀寫有關。這里應該指明,現在的嵌入式芯片應該稱之為SOC(System On Chip)更適合,而本文的CPU指的是處理器內核比如ARM926EJ-S。設備驅動程序是跟設備操作相關的系統調用的內核實現版本。就是說對設備的操作(比如ioctl(fd,…))其在內核的實現是由驅動完成。所以驅動要做的事情就是實現file_operations結構的函數指針,安排中斷例程。當然驅動也有分層的,有些模塊純粹是一種軟件抽象。比如USB驅動分層。驅動程序是直接面對硬件,內核通過驅動與硬件交互。對內核的核心來說驅動屏蔽了硬件的實現細節。驅動對硬件的操作集中表現在對寄存器的訪問及數據讀寫。



4.內核線程,用戶線程,NPTL

以前的用戶態多線程的實現通過用戶態線程庫為其做調度與切換。想象一下,那時的多線程進程,在內核里只把該進程看成一個執行線程。多線間的切換調度是通達線程庫實現,這樣效率是比較差。現在的2.6內核NPTL線程庫其實是在1:1,就是說在用戶態進程的線程在內核里有對應的代表線程。在“內核”中 Linux并不區別線程與進程,也就是說線程和進程都用task_struct結構表示,我想這句話一定會讓困惑于線程與進程的朋友大為吃驚,不錯,在當代2.6的linux內核中的確如此,只不過,內核可以讓某一些線程共享資源從而讓這些線程組給用戶空間看起來就像是一個進程包含多個線程,這些共享的資源可以是打開的文件描述符,地址空間,信號處理程序和命名空間等等的任意組合。周期性運行的內核線程可以理解成在內核中運行的特殊進程,它有自己的“進程上下文”(借用調用它的用戶進程的上下文),所以同樣被進程調度程序調度,也可以睡眠——它和用戶進程屬性何其相似,不同之處就在于內核線程運行于內核空間,可訪問內核數據,運行期間不能被搶占。傳統的Unix系統把一些重要的任務委托給周期性執行的進程,這些任務包括刷新磁盤高速緩存,交換出不用的頁面,維護網絡鏈接等等。事實上,以嚴格線性的方式執行這些任務的確效率不高,如果把他們放在后臺調度,不管是對它們的函數還是對終端用戶進程都能得到較好地響應。因為一些系統進程只運行在內核態,現代操作系統把它們的函數委托給內核線程(Kernel Thread),內核線程不受不必要的用戶態上下文的拖累。在Linux中使用ps -eFT命令可以查看到所有內核線程和用戶線程,所有有中括號[]的都是內核線程,線程名后面跟著的數字代表該線程在哪個CPU上跑著,如果你的機器是SMP的話。



5.內核信號量的設計與實現,自旋鎖,與休眠隊列

暫時我的理解是自旋鎖其實就是while(鎖){}循環檢測鎖是否可用。這個過程CPU被死鎖在死循環中,可以想像這時除了等待鎖被釋放外啥也干不了。而內核中信號量的設計里邊有自旋鎖和休眠方面操作。down(),up()及其變種版本,這兩個函數比較深奧,只能理解到這里。呵呵



6.什么是軟中斷,tasklet, 中斷的bottom half(下半部分)

澄清一些概念,軟件中斷與軟中斷的區別(因為不同的書籍使用不同的術語可能導致混淆),軟件中斷大多指向CPU發送一個異常引發從用戶態到核心態的轉換,而軟中斷則是Linux的一個非常重要也挺復雜的一個機制那就是“延后執行,但最晚不會晚于下一個定時器中斷的到來”,它并非一個真正意義上的中斷所以稱它為虛擬中斷。以前只知道定時器是可以給我們在一個固定的時間后執行定時器中斷例程來執行我們的任務,同時,外圍硬件中斷也有很多,有些是很急也有不急的,像都不能在中斷例程里做太多操作與運算,這樣中斷的處理的時間太長從而影響了下一個中斷,但是環境客觀上又需要中斷例程處理很多數據,比如網卡收到數據包發生中斷請求,此時中斷要做的事情是把數據復制和解析給用戶,這對中斷例程來說,他需要做的事情太多,但也不得不做。基于這種情況,內核提供了一種設施,把中斷例程要做的事情分成兩半,上半部分和下半部分,上半部分只是做一些非常緊急和必要的操作然后退出,把其余的放在下半部在CPU不是那么緊急的或相對緩松的時刻來執行,以致不影響下一個中斷。如果中斷例程任務不重大可不必分上半和下半。如需要分下半部分,那么下半部分怎樣的實現在CPU的一個比較寬松的環境里執行呢?提供這種機制的是軟中斷!Linux的軟件中斷概念又是什么一回事?軟中斷(softirq)不象硬中斷那樣是由硬件中斷信號觸發執行的,所以也不同于硬件中斷那樣時隨時都能夠被執行,籠統來講,軟中斷會在內核處理任務完畢后返回用戶級程序前得到處理機會。具體的講,有三個時刻它將被執行(do_softirq()):硬件中斷操作完成后;系統調用返回時;內核調度程序中;(另外,內核線程ksoftirqd周期執行軟中斷)。從中可以看出軟中斷會緊隨硬中斷處理(好象狐假虎威),所以搶占內核任務--至少在定時器中斷(時鐘中斷)后總有機會運行一次。還要記得軟中斷可以在不同處器上并發執行。在有對稱多處理器的機器上,那么兩個任務就可以真正的在臨界區中同時執行了,這種類型被稱為真并發。相對而言在,單處理器上并發其實并不是真的同時發生,而是相互交錯執行,是偽并發。但它們都同樣會造成競爭條件,而且也需要同樣的保護。軟中斷是很底層的機制,一般除了在網絡子系統和SCSI子系統這樣對性能要求很高以及要求并發處理的時候,才會選擇使用軟中斷。軟中斷雖然靈活性高和效率高,但是你自己必須處理復雜的同步處理(因為它可在多處理器上并發),所以通常都不直接使用,而是作為支持tasklet和bottom half的根本。需要說明的是,軟中斷的執行也處于中斷上下文中,所以中斷上下文對它的限制是和硬中斷一樣的。Tasklet與定時器的不同其中之一在于tasklet是沒有一個固定的執行延遲時間。



7.內核編程與用戶態空間編程的差別

對于從事應用程序開發來說,用戶空間的任務調度與同步之間的關系相對簡單,無需過多考慮需要同步的原因。這一是因為在用戶空間中各個進程都擁有獨立的運行空間,進程內部的數據對外不可見,所以各個進程即使并發執行也不會產生對數據訪問的競爭。第二是因為用戶空間與內核空間獨立,所以用戶進程不會與內核任務交錯執行,因此用戶進程不存在與內核任務并發的可能。以上兩個原因使得用戶同步僅僅需要在進程間通訊和多線程編程時需要考慮。作為驅動程序的一部分,內核代碼的可重入設計需求非常迫切。其實還有很多。。。到時再寫。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表