1. 程式人生 > >核心、裝置、驅動、檔案系統、核心空間、使用者空間

核心、裝置、驅動、檔案系統、核心空間、使用者空間

學習驅動過程中有一些疑問,記錄下來,並希望能在2015-6-30之前能夠有一個明確的答案。

疑問:

一、當裝置插上的時候,核心怎麼發現裝置並更新/sys、/dev、/proc檔案系統、怎麼通知給使用者空間?更具體一點是probe的過程

二、device和driver怎麼配對?例如一個掛載在IIC匯流排下的裝置,我們看到i2c_bus_type中有一個i2c_device_match,這個到底怎麼觸發的,只是大概瞭解通過name來匹配的,但是具體流程一點不知道。

三、device、driver等都是包含kobjec,然後有一個sys_dirent,這樣來建立/sys/中檔案節點,sysfs.h中提供了很多的介面,具體何時使用的,好像是將device tree形成的dtb解析,這個本身就是一個樹狀結構,然後對應的/sys結構,具體怎樣形成的呢?

四、當來了一箇中斷時,怎麼觸發的呢?從硬體觸發到最後的driver過程是怎樣的呢?

五、driver中那些是優先重點呢?初始化、中斷處理?

很多都是通過大嬸們的文章理解的,對這個有一個模糊的認識,但是具體是怎樣的,自己一點都不瞭解,希望自己能夠慢慢摸索出來。

核心和檔案系統的關係

核心:

Linux核心就像人的心臟,靈魂,指揮中心。核心是一個作業系統的核心,它負責管理系統的程序,記憶體,裝置驅動程式,檔案和網路系統,決定著系統的效能和穩定性。核心以獨佔的方式執行最底層任務,保證系統正常執行。協調多個併發程序,管理程序使用的記憶體,使它們相互之間不產生衝突,滿足程序訪問磁碟的請求等.
作業系統是一個用來和硬體打交道併為使用者程式提供一個有限服務集的低階支撐軟體。一個計算機系統是一個硬體和軟體的共生體,它們互相依賴,不可分割。計算機的硬體,含有外圍裝置、處理器、記憶體、硬碟和其他的電子裝置組成計算機的發動機。但是沒有軟體來操作和控制它,自身是不能工作的。完成這個控制工作的軟體就稱為作業系統,在Linux的術語中被稱為“核心”,也可以稱為“核心”。Linux核心的主要模組(或元件)分以下幾個部分:

儲存管理、CPU和程序管理、檔案系統、裝置管理和驅動、網路通訊,以及系統的初始化(引導)、系統呼叫等。

檔案系統:

如果只有核心的話,想想一下我們像DOS時代一樣,比DOS更加困難,看不到/目錄時是怎樣一種表情?

轉載:http://blog.chinaunix.net/uid-8698570-id-1763151.html

一.什麼是檔案系統

上圖就是硬碟的結構,一個硬碟有很多的碟片組成,然後一個碟片上根據半徑打大小不同分了很多圈的磁軌,從外向內0、1、2...來表示;然後又根據不同的同心角將每一個磁軌劃分了很多的扇區

所以磁碟容量的計算公式為:

扇區容量×扇區×磁軌×磁頭數×碟片

儲存容量=磁頭數×磁軌(柱面)數×每道扇區數×每扇區位元組數

要點:

1)硬碟有數個碟片,每碟片兩個面,每個面一個磁頭

2)碟片被劃分為多個扇形區域即扇區

3)同一碟片不同半徑的同心圓為磁軌

4)不同碟片相同半徑構成的圓柱面即柱面

5)公式:儲存容量=磁頭數×磁軌(柱面)數×每道扇區數×每扇區位元組數

6)資訊記錄可表示為:××磁軌(柱面),××磁頭,××扇區

linux系統中怎麼管理起來?

它將磁碟塊分為以下三個部分:

1)        超級塊,檔案系統中第一個塊被稱為超級塊。這個塊存放檔案系統本身的結構資訊。比如,超級塊記錄了每個區域的大小,超級塊也存放未被使用的磁碟塊的資訊。

2)        I-切點表。超級塊的下一個部分就是i-節點表。每個i-節點就是一個對應一個檔案/目錄的結構,這個結構它包含了一個檔案的長度、建立及修改時間、許可權、所屬關係、磁碟中的位置等資訊。一個檔案系統維護了一個索引節點的陣列,每個檔案或目錄都與索引節點陣列中的唯一一個元素對應。系統給每個索引節點分配了一個號碼,也就是該節點在陣列中的索引號,稱為索引節點號

3)        資料區。檔案系統的第3個部分是資料區。檔案的內容儲存在這個區域。磁碟上所有塊的大小都一樣。如果檔案包含了超過一個塊的內容,則檔案內容會存放在多個磁碟塊中。一個較大的檔案很容易分佈上千個獨產的磁碟塊中。

這部分的結構體內容見include/fs.h中super_block和inode,裡面也介紹了VFS的許多介面

檔案主要有屬性、內容以及檔名三項。核心將檔案內容存放在資料區,檔案屬性存放在i-節點,檔名存放在目錄中。

檔案系統會根據超結塊裡的內容決定選擇哪種檔案系統來解讀這個檔案系統的內容,然後

當我們需要檢視檔案時,我們會通過檔案系統的介面來查詢inode分割槽離得內容,會把inode分割槽裡的內容載入到記憶體,然後可以看到這個檔案/目錄的屬性;如果需要進行讀寫,然後我們會根據inode中的dentry來查詢物理盤上的實體可能是多個磁碟塊載入到記憶體中,現在我們就可以進行讀寫了;

-----------------------------------------另一種角度的檔案系統

檔案系統指檔案存在的物理空間,linux系統中每個分割槽都是一個檔案系統,都有自己的目錄層次結構。
Linux檔案系統中的檔案是資料的集合,檔案系統不僅包含著檔案中的資料而且還有檔案系統的結構,所有Linux 使用者和程式看到的檔案、目錄、軟連線及檔案保護資訊等都儲存在其中。這種機制有利於使用者和作業系統的互動。
每個實際檔案系統從作業系統和系統服務中分離出來,它們之間通過一個介面層:虛擬檔案系統或VFS來通訊。VFS使得Linux可以支援多個不同的檔案系統,每個表示一個VFS 的通用介面。由於軟體將Linux 檔案系統的所有細節進行了轉換,所以Linux核心的其它部分及系統中執行的程式將看到統一的檔案系統。Linux 的虛擬檔案系統允許使用者同時能透明地安裝許多不同的檔案系統。
在Linux檔案系統中,EXT2檔案系統、虛擬檔案系統、/proc檔案系統是三個具有代表性的檔案系統。

----------------------------上面只是現在的理解,需要多讀程式碼來修正錯誤。

二.什麼是根檔案系統

根檔案系統首先是一種檔案系統,該檔案系統不僅具有普通檔案系統的儲存資料檔案的功能,但是相對於普通的檔案系統,它的特殊之處在於,它是核心啟動時所掛載(mount)的第一個檔案系統,核心程式碼的映像檔案儲存在根檔案系統中,系統引導啟動程式會在根檔案系統掛載之後從中把一些初始化指令碼(如rcS,inittab)和服務載入到記憶體中去執行。我們要明白檔案系統和核心是完全獨立的兩個部分。在嵌入式中移植的核心下載到開發板上,是沒有辦法真正的啟動Linux作業系統的,會出現無法載入檔案系統的錯誤。
那麼根檔案系統在系統啟動中到底是什麼時候掛載的呢?先將/dev/ram0掛載,而後執行/linuxrc.等其執行完後。切換根目錄,再掛載具體的根檔案系統.根檔案系統執行完之後,也就是到了Start_kernel()函式的最後,執行init的程序,也就第一個使用者程序。對系統進行各種初始化的操作。
根檔案系統之所以在前面加一個”根“,說明它是載入其它檔案系統的”根“,既然是根的話,那麼如果沒有這個根,其它的檔案系統也就沒有辦法進行載入的。它包含系統引導和使其他檔案系統得以掛載(mount)所必要的檔案。根檔案系統包括Linux啟動時所必須的目錄和關鍵性的檔案,例如Linux啟動時都需要有init目錄下的相關檔案,在 Linux掛載分割槽時Linux一定會找/etc/fstab這個掛載檔案等,根檔案系統中還包括了許多的應用程式bin目錄等,任何包括這些Linux 系統啟動所必須的檔案都可以成為根檔案系統。Linux啟動時,第一個必須掛載的是根檔案系統;若系統不能從指定裝置上掛載根檔案系統,則系統會出錯而退出啟動。成功之後可以自動或手動掛載其他的檔案系統。因此,一個系統中可以同時存在不同的檔案系統。在 Linux 中將一個檔案系統與一個儲存裝置關聯起來的過程稱為掛載(mount)。使用 mount 命令將一個檔案系統附著到當前檔案系統層次結構中(根)。在執行掛裝時,要提供檔案系統型別、檔案系統和一個掛裝點。根檔案系統被掛載到根目錄下“/”上後,在根目錄下就有根檔案系統的各個目錄,檔案:/bin /sbin /mnt等,再將其他分割槽掛接到/mnt目錄上,/mnt目錄下就有這個分割槽的各個目錄,檔案。

三.核心與檔案系統的關係

技術上說Linux是一個核心。“核心”指的是一個提供硬體抽象層、磁碟及檔案系統控制、多工等功能的系統軟體。一個核心不是一套完整的作業系統。一套基於Linux核心的完整作業系統叫作Linux作業系統,或是GNU/Linux。
檔案系統是kernel的一部分。檔案系統實現了系統上儲存介質和其他資源的互動。kernel tree中的fs目錄都是關於檔案系統的,可以說它是kernel的一個大子系統。
嵌入式系統在flash中分配了存放核心、根檔案系統的區域。bootloader載入了核心,核心啟動,載入檔案系統,進入Linux系統。
整個嵌入式系統而言,可以分為三個部分1.uboot 2.kernel 3.檔案系統。其中kernel中以VFS去支援各種檔案系統,如yaffs,ext3,cramfs等等。yaffs/yaffs2是專為嵌入式系統使用NAND型快閃記憶體而設計的一種日誌型檔案系統。在核心中以VFS來遮蔽各種檔案系統的介面不同,以VFS向kernel提供一個統一的介面。如開啟一個檔案時統一使用open,寫時採用write,而不用去考慮是那種檔案系統,也不用去考慮檔案系統是如何將資料寫入物理介質的。其中 kernel中的配置,只是讓VFS支援這種介面。

----------從不缺少有夢想的人,但是缺少為自己夢想奉獻自己的人