ext2源碼
Linux的內核源代碼可以從很多途徑得到。一般來講,在安裝的linux系統下,/usr/src/linux目錄下的東西就是內核源代碼。
對於源代碼的閱讀,要想比較順利,事先最好對源代碼的知識背景有一定的了解。對於linux內核源代碼來講,我認為,基本要求是:1、操作系統的基本知識; 2、對C語言比較熟悉,最好要有匯編語言的知識和GNU C對標准C的擴展的知識的了解。
另外在閱讀之前,還應該知道Linux內核源代碼的整體分布情況。我們知道現代的操作系統一般由進程管理、內存管理、文件系統、驅動程序、網路等組成。看一下Linux內核源代碼就可看出,各個目錄大致對應了這些方面。Linux內核源代碼的組成如下(假設相對於linux目錄):
arch 這個子目錄包含了此核心源代碼所支持的硬體體系結構相關的核心代碼。如對於X86平台就是i386。
include 這個目錄包括了核心的大多數include文件。另外對於每種支持的體系結構分別有一個子目錄。
init 此目錄包含核心啟動代碼。
mm 此目錄包含了所有的內存管理代碼。與具體硬體體系結構相關的內存管理代碼位於arch/-/mm目錄下,如對應於X86的就是arch/i386/mm/fault.c 。
drivers 系統中所有的設備驅動都位於此目錄中。它又進一步劃分成幾類設備驅動,每一種也有對應的子目錄,如音效卡的驅動對應於drivers/sound。
ipc 此目錄包含了核心的進程間通訊代碼。
moles 此目錄包含已建好可動態載入的模塊。
fs Linux支持的文件系統代碼。不同的文件系統有不同的子目錄對應,如ext2文件系統對應的就是ext2子目錄。
kernel 主要核心代碼。同時與處理器結構相關代碼都放在arch/-/kernel目錄下。
net 核心的網路部分代碼。裡面的每個子目錄對應於網路的一個方面。
lib 此目錄包含了核心的庫代碼。與處理器結構相關庫代碼被放在arch/-/lib/目錄下。
scripts 此目錄包含用於配置核心的腳本文件。
Documentation 此目錄是一些文檔,起參考作用。
B. 怎樣著手研究 Android 源代碼
不需要全部了解,閱讀你感興趣或者與你工作相關的部分就可以了。比如:
頂層目錄:
.
|– bionic (bionic庫,Android的基礎庫)
|– bootable (bootloader, recovery等,ROM移植相關)
|– build (編譯和配置所需的腳本和工具)
|– dalvik (dalvik的Java虛擬機)
|– development (開發應用程序所需的模板和工具)
|– external (由其他平台移植過來的項目,對於移植工作是非常好的參考)
|– frameworks (應用程序框架層,請仔細閱讀此部分代碼,對於開發App會有很大幫助)
|– hardware (與硬體相關的庫,驅動開發相關)
|– kernel (linux內核)
|– out (編譯後生成的目錄,包含構建文件系統所需的文件)
|– packages (Android的原生應用程序,App開發者需要重點關注)
|– prebuilt (Android在各平台下編譯的預置腳本)
|– system (Android的底層庫)
`– vendor / device (設備相關的代碼,AOSP里不會有太多涉及,但是CM中卻是重點)
external目錄:
.
|– aes (ASE加密)
|– apache-http (網頁伺服器)
|– bison (自動生成語法分析器,將無關文法轉換為C,C++)
|– bluez (Linux下的藍牙工具)
|– bsdiff (diff工具)
|– bzip2 (壓縮工具)
|– clearsilver (html模板系統)
|– dbus (低延時,低開銷,高可用性的IPC機制)
|– dhcpcd (DHCP服務)
|– dosfstools (DOS文件系統工具)
|– dropbear (SSH2的伺服器/客戶端)
|– e2fsprogs (EXT2文件系統工具)
|– elf (ELF復制工具)
|– elfutils (ELF工具)
|– embunit
|– emma (Java代碼覆蓋率統計工具)
|– esd (將多種音頻流混合在一個設備上播放)
|– expat
|– fdlibm
|– freetype (字體)
|– gdata (google的無線數據)
|– genext2fs
|– giflib (gif庫)
|– googleclient (google用戶庫)
|– grub
|– icu4c
|– iptables (防火牆)
|– jdiff
|– jhead (jpeg頭部信息工具)
|– jpeg (jpeg庫)
|– libffi
|– libpcap (網路數據包捕獲函數)
|– libpng (png庫)
|– libxml2 (xml解析庫)
|– netperf (網路性能測試工具)
|– opencore (多媒體框架,最讓人詬病的模塊,Andoird 4.0中已被 stagefright 取代)
|– openssl (SSL模塊,需要注意的是一定要靜態編譯此模塊,否則會出現兼容問題)
|– qemu (Android 模擬器,Android 4.0之前只支持 arm-eabi,現在已支持 arm-v7)
|– skia (SKIA圖像引擎)
|– sqlite (資料庫)
|– strace (調試跟蹤工具)
|– tcpmp (TCP抓包軟體)
|– webkit (瀏覽器核心)
|– wpa_supplicant (無線網卡管理)
|– yaffs2 (yaffs文件系統)
C. Linux文件系統特點
Linux之所以能在嵌人式系統領域取得如此輝煌的成績,與其自身的優良特性是分不開的。與其他操作系統相比,Linux具有以下一系列顯著的特點。
1.模塊化程度高
Linux的內核設計非常精巧,分成進程調度、內存管理、進程間通信、虛擬文件系統和網路介面五大部分;其獨特的模塊機制可根據用戶的需要,實時地將某些模塊插入或從內核中移走,使得Linux系統內核可以裁剪得非常小巧,很適合於嵌入式系統的需要。
2.源碼公開
由於Linux系統的開發從一開始就與GNU項目緊密地結合起來,所以它的大多數組成部分都直接來自GNU項目。任何人、任何組織只要遵守GPL條款,就可以自由使用Linux 源代碼,為用戶提供了最大限度的自由度。這一點也正投嵌入式系統所好,因為嵌入式系統應用千差萬別,設計者往往需要針對具體的應用對源碼進行修改和優化,所以是否能獲得源代碼 對於嵌入式系統的開發是至關重要的。加之Linux的軟體資源十分豐富,每種通用程序在Linux上幾乎都可以找到,並且數量還在不斷增加。這一切就使設計者在其基礎之上進行二次開發變得非常容易。另外,由於Linux源代碼公開,也使用戶不用擔心有「後閘」等安全隱患。
同時,源碼開放給各教育機構提供極大的方便,從而也促進了Linux的學習、推廣和應用。
3.廣泛的硬體支持
Linux能支持x86、ARM、MIPS、ALPHA和PowerPC等多種體系結構的微處理器。目前已成功地移植到數十種硬體平台,幾乎能運行在所有流行的處理器上。
由於世界范圍內有眾多開發者在為Linux的擴充貢獻力量,所以Linux有著異常豐富的驅動程序資源,支持各種主流硬體設各和最新的硬體技術,甚至可在沒有存儲管理單元MMU 的處理器上運行,這些都進一步促進了Linux在嵌入式系統中的應用。
4.安全性及可靠性好
內核高效穩定。Linux內核的高效和穩定已在各個領域內得到了大量事實的驗證。
Linux中大量網路管理、網路服務等方面的功能,可使用戶很方便地建立高效穩定的防火牆、路由器、工作站、伺服器等。為提高安全性,它還提供了大量的網路管理軟體、網路分析軟體和網路安全軟體等。
5.具有優秀的開發工具
開發嵌入式系統的關鍵是需要有一套完善的開發和調試工具。傳統的嵌入式開發調試工具是在線模擬器(In Circuit Emulator,ICE),它通過取代目標板的微處理器,給目標程序提供一個完整的模擬環境,從而使開發者能非常清楚地了解到程序在目標板上的工作狀態,便於監視和調試程序。在線模擬器的價格非常高,而且只適合做非常底層的調試。如果使用的是嵌人式Linux,一旦軟硬體能支持正常的串口功能,即使不用在線模擬器,也可以很好地進行開發和調試工作,從而節省了一筆不小的開發費用。嵌入式Linux為開發者提供了一套完整的工具鏈(Tool Chain),能夠很方便地實現從操作系統到應用軟體各個級別的調試。
6.有很好的網路支持利文件系統支持
Linux從誕生之日起就與Internet密不可分,支持各種標準的Internet網路協議,並且很容易移植到嵌入式系統當中。目前,Linux幾乎支持所有主流的網路硬體、網路協議和文件系統,因此它是NFS的一個很好的平台。
另一方面,由於Linux有很好的文件系統支持(例如,它支持Ext2、FAT32、romfs等文件系統),是數據各份、同步和復制的良好平台,這些都為開發嵌入式系統應用打下了堅實的基礎。
7.與UNIX完全兼容
目前,在Linux中所包含的工具和實用程序,可以完成UNIX的所有主要功能。
但由於Linux不是為實時而設計的,因而這就成了Linux在實時系統中應用的最大遺憾。不過,目前有眾多的自由軟體愛好者正在為此進行不懈的努力,也取得了諸多成果
D. linux 文件系統 內核編譯
1、第一條命令沒問題;
2、第二條命令:
#mkfs.ext2 myfs
myfs is not a block special device.
無路如何也要繼續?(y,n)
這時要輸入y
3、第三條命令,linux kernel不支持myext2文件系統。我猜你是想要在紅帽或ubuntu上mount一個ext2文件系統的loop設備,但是想使用myext2的文件系統驅動,對吧。我沒有這么做過,猜不出你的myext2摘出來之後是什麼樣子的。我以前試過在linux安裝新的文件系統支持,比如fuse系統,源碼編譯通過後會生成一個.ko的模塊文件,使用insmod命令將其加入內核,才能獲得內核對該文件系統的支持。我想你可能也應該這樣做,你應該需要生成一個類似myext2.ko的模塊,然後將其insmod到內核中去。
E. 我在電腦上安裝了linux操作系統,linux的源碼應該是在系統的某個目錄下吧,請問是在哪個目錄呢謝謝
首先研究 Linux 源代碼樹的頂層目錄,它通常(但不總是)位於 /usr/src/linux-。我們不會研究得過於詳細,因為 Linux 源代碼經常會發生變化,但是,我們將嘗試讓給出的信息足以找出特定驅動程序或函數的位置。
Makefile:這個文件是整個源代碼樹的頂層 makefile。它定義了很多實用的變數和規則,比如默認的 gcc 編譯標記。
Documentation/:這個目錄中包含很多關於配置內核、運行 ramdisk 等任務的實用信息(但通常是過時的)。不過,與不同配置選項相應的幫助條目並不在這里 —— 它們在每個源代碼目錄的 Kconfig 文件中。
arch/:所有與體系結構相關的代碼都在這個目錄以及 include/asm- 目錄中。在此目錄中,每種體系結構都有自己的目錄。例如,用於基於 PowerPC 的計算機的代碼位於 arch/ppc 目錄中。在這些目錄里,可以找到底層內存管理、中斷處理、早期初始化、匯編常式,等等。
crypto/:這是內核本身所用的加密 API。
drivers/:按照慣例,在此目錄的子目錄中可以找到運行外圍設備的代碼。包括視頻驅動程序、網卡驅動程序、底層 SCSI 驅動程序,以及其他類似的驅動程序。例如,在 drivers/net 中可以找到大部分網卡驅動程序。將一類驅動程序組合在一起的某些更高層代碼,可能會(也可能不會)像底層驅動程序本身那些包含在同一目錄中。
fs/:通用文件系統的代碼(稱做 VFS,即 Virtual File System)和各個不同文件系統的代碼都可以在這個目錄中找到。ext2 文件系統是在 Linux 中最常廣泛使用的文件系統之一;在 fs/ext2 中可以找到讀取 ext2 格式的代碼。並不是所有文件系統都會編譯或運行;對某些尋找內核項目的人而言,更生僻的文件系統永遠都是理想的候選者。
include/:在 .c 文件的開頭所包含的大部分頭文件都可以在這個目錄中找到。 asm- 目錄下是與體系結構相關的包含(include )文件。部分內核構建過程創建從 asm 指定 asm- 的符號鏈接。這樣,無需將其固定編碼到 .c 文件 #include 就可以獲得用於那個體系結構的正確文件。其他目錄中包含的是 非-體系結構-相關 的頭文件。如果在不只一個 .c 文件中使用了某個結構體、常量或者變數,那麼它可能應該放入其中一個頭文件中。
init/:這個目錄中的文件包括 main.c、創建 早期用戶空間(early userspace) 的代碼,以及其他初始化代碼。可以認為 main.c 是內核「粘合劑(glue)」。在下一部分將深入討論 main.c。早期用戶空間提供了 Linux 內核引導起來時所需要的功能,而這些功能並不需要在內核本身運行。
ipc/:IPC 的意思是 進程間通信(interprocess communication)。它包含了共享內存、信號量以及其他形式 IPC 的代碼。
kernel/:不適合放在任何其他位置的通用內核級代碼位於此處。這里有高層系統調用代碼,以及 printk() 代碼、調度程序、信號處理代碼,等等。文件名包含很多信息,所以可以使用 ls kernel/,並非能常准確地猜到每個文件的功能。
lib/:這里是對所有內核代碼都通用的實用常式。常見的字元串操作、調試常式,以及命令行解析代碼都位於此處。
mm/:這個目錄中是高層次內核管理代碼。聯合使用這些常式以及底層的與體系結構相關的常式(通常位於 arch//mm/ 目錄中)來實現虛擬內存(Virtual memory,VM)。在這里會完成早期內存管理(在內存子系統完全建立起來之前需要它),以及文件的內存映射、頁高速緩存管理、內存分配、RAM 中頁的清除(還有很多其他事情)。
net/:這里是高層網路代碼。底層網路驅動程序與此層次代碼交換數據包,這個層次的代碼可以根據數據包將數據傳遞給用戶層應用程序,或者丟棄數據,或者在內核中使用它。net/core 包含大部分不同的網路協議都可以使用的代碼,和某些位於 net/ 目錄本身中的文件一樣。特定的網路協議在 net/ 的子目錄下實現。例如,在 net/ipv4 目錄中可以找到 IP(版本 4)代碼。
scripts/:這個目錄中包含的腳本可用於內核的構建,但並不將任何代碼加入到內核本身之中。例如,各種配置工具可以將它們的文件放在這里。
security/:在這里可以找到不同 Linux 安全模型的代碼,比如 NSA Security-Enhanced Linux 以及套接字和網路安全鉤子函數(hooks),以及其他安全選項。
sound/:這里放置的是音效卡驅動程序和其他與聲音相關的代碼。
usr/:此目錄中的代碼用於構建包含 root 文件系統映像的 cpio-格式 的歸檔文件,用於早期用戶空間。
F. Linux文件系統中包括的主要文件類型有哪些
主要文件類型包括如下:
ext: ext 是第一個專門為 Linux 的文件系統類型,叫做擴展文件系統。
ext2:ext2 是為解決 ext 文件系統的缺陷而設計的可擴展的高性能的文件系統.又被稱為 二級擴展文件系統
ext3: ext3 是由開放資源社區開發的日誌文件系統,. ext3 被設計成是 ext2 的升級版本。
jsf: jsf 提供了基於日誌的位元組級文件系統,該文件系統是為面向事務的高性能系統而開發的。
ReiserFS: ReiserFS 基於平 衡樹結構的 、ReiserFS 文件系統在網上公布.ReiserFS 3.6.x(作為 Linux 2.4 一部分 的版本),設計成員相信最好的文件系統是那些能夠有助於創建獨立的共享環境或者命名空間的文件系統。
Xfs: xfs 是一種非常優秀的日誌文件系統,它是 SGI 公司設計的.xfs 被稱為業界最先進 的,最具可升級性的文件系統技術.它是一個全 64 位,快速,穩固的日誌文件系統,
G. 我安裝了linux,怎麼才能看到源代碼呢
linux內核的源代碼都在www.hernel.org的/pub/linux目錄下軟體的源代碼在該一般項目主頁或發行版的「源」,或其他開源軟體的網站or: 隨著linux的逐步普及,現在有不少人對於Linux的安裝及設置已經比較熟悉了。與Linux 的蓬勃發展相適應,想深入了解Linux的也越來越多。而要想深入了解Linux,就需要閱讀和分析linux內核的源代碼。 Linux的內核源代碼可以從很多途徑得到。一般來講,在安裝的linux系統下,/usr/src/linux目錄下的東西就是內核源代碼。另外還可以從互連網上下載,解壓縮後文件一般也都位於linux目錄下。內核源代碼有很多版本,目前最新的穩定版是2.2.14。許多人對於閱讀Linux內核有一種恐懼感,其實大可不必。當然,象Linux內核這樣大而復雜的系統代碼,閱讀起來確實有很多困難,但是也不象想像的那麼高不可攀。只要有恆心,困難都是可以克服的。也不用擔心水平不夠的問題,事實上,有很多事情我們不都是從不會到會,邊干邊學的嗎?任何事情做起來都需要有方法和工具。正確的方法可以指導工作,良好的工具可以事半功倍。對於Linux 內核源代碼的閱讀也同樣如此。下面我就把自己閱讀內核源代碼的一點經驗介紹一下,最後介紹Window平台下的一種閱讀工具。對於源代碼的閱讀,要想比較順利,事先最好對源代碼的知識背景有一定的了解。對於linux內核源代碼來講,我認為,基本要求是:1、操作系統的基本知識;2、對C語言比較熟悉,最好要有匯編語言的知識和GNU C對標准C的擴展的知識的了解。另外在閱讀之前,還應該知道Linux內核源代碼的整體分布情況。我們知道現代的操作系統一般由進程管理、內存管理、文件系統、驅動程序、網路等組成。看一下Linux內核源代碼就可看出,各個目錄大致對應了這些方面。Linux內核源代碼的組成如下(假設相對於linux目錄):arch 這個子目錄包含了此核心源代碼所支持的硬體體系結構相關的核心代碼。如對於X86平台就是i386。include 這個目錄包括了核心的大多數include文件。另外對於每種支持的體系結構分別有一個子目錄。init 此目錄包含核心啟動代碼。mm 此目錄包含了所有的內存管理代碼。與具體硬體體系結構相關的內存管理代碼位於arch/*/mm目錄下,如對應於X86的就是arch/i386/mm/fault.c 。drivers 系統中所有的設備驅動都位於此目錄中。它又進一步劃分成幾類設備驅動,每一種也有對應的子目錄,如音效卡的驅動對應於drivers/sound。ipc 此目錄包含了核心的進程間通訊代碼。moles 此目錄包含已建好可動態載入的模塊。fs Linux支持的文件系統代碼。不同的文件系統有不同的子目錄對應,如ext2文件系統對應的就是ext2子目錄。kernel 主要核心代碼。同時與處理器結構相關代碼都放在arch/*/kernel目錄下。net 核心的網路部分代碼。裡面的每個子目錄對應於網路的一個方面。lib 此目錄包含了核心的庫代碼。與處理器結構相關庫代碼被放在arch/*/lib/目錄下。scripts此目錄包含用於配置核心的腳本文件。Documentation 此目錄是一些文檔,起參考作用。清楚了源代碼的結構組成後就可以著手閱讀。對於閱讀方法或者說順序,有所謂的縱向與橫向之分。所謂縱向就是順著程序的執行順序逐步進行;所謂橫向,就是分模塊進行。其實他們之間不是絕對的,而是經常結合在一起進行。對於Linux源代碼來講,啟動的代碼就可以順著linux的啟動順序一步一步來,它的大致流程如下(以X86平台為例):./larch/i386/boot/bootSect.S-->./larch/i386/boot/setup.S-->./larch/i386/kernel/head.S-->./init/main.c中的start_kernel()。而對於象內存管理等部分,則可以單獨拿出來進行閱讀分析。我的體會是:開始最好按順序閱讀啟動代碼,然後進行專題閱讀,如進程部分,內存管理部分等。在每個功能函數內部應該一步步來。實際上這是一個反復的過程,不可能讀一遍就理解。俗話說:「工欲善其事,必先利其器」。 閱讀象Linux核心代碼這樣的復雜程序令人望而生畏。它象一個越滾越大的雪球,閱讀核心某個部分經常要用到好幾個其他的相關文件,不久你將會忘記你原來在干什麼。所以沒有一個好的工具是不行的。由於大部分愛好者對於Window平台比較熟悉,並且還是常用Window系列平台,所以在此我介紹一個Window下的一個工具軟體:Source Insight。這是一個有30天免費期的軟體,可以從www.sourcedyn.com下載。安裝非常簡單,和別的安裝一樣,雙擊安裝文件名,然後按提示進行就可以了。安裝完成後,就可啟動該程序。這個軟體使用起來非常簡單,是一個閱讀源代碼的好工具。它的使用簡單介紹如下:先選擇Project菜單下的new,新建一個工程,輸入工程名,接著要求你把欲讀的源代碼加入(可以整個目錄加)後,該軟體就分析你所加的源代碼。分析完後,就可以進行閱讀了。對於打開的閱讀文件,如果想看某一變數的定義,先把游標定位於該變數,然後點擊工具條上的相應選項,該變數的定義就顯示出來。對於函數的定義與實現也可以同樣操作。別的功能在這里就不說了,有興趣的朋友可以裝一個Source Insight,那樣你閱讀源代碼的效率會有很大提高的。怎麼樣,試試吧!
H. 如何把linux的文件系統從ext2無損升級到ext4
基本步驟:
1確認內核版本和系統環境支持ext4 (推薦升至2.6.28以上,lsmod |grep ext4)
2卸載要升級的分區(在線卸不掉則需要進單用戶)
3 tune2fs -O has_journal,extents,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize來給分區加入ext4的特性
4 e2fsck -fDC0 /dev/sdb1 –y修復分區錯誤
5修改fstab中分區格式為ext4,reboot
關鍵點:
1tune2fs版本要高於1.41 否則不支持ext4的特性
2官方推薦使用2.6.28以上內核才穩定支持ext4
3對在使用的分區如var,一定要先卸載再操作,並且重啟之前一定要挨個執行完tune2fs,e2fsck,和vi /boot/fstab的修改,再重啟,否則掛載就會出問題
網路資料:
一、測試場景
操作系統:CentOS 5.6 x86 64bit(內核2.6.18)
文件系統:ext3
硬碟:2塊(sda1、sdb1),sdb1的掛載點為/Android,專門用來存儲編譯文件,在編譯時報錯。
二、升級前狀態
查看系統內核版本:
# uname -r
2.6.18-238.el5
查看文件系統的情況:
# df -T
文件系統 類型 1K-塊 已用 可用 已用% 掛載點
/dev/mapper/VolGroup00-LogVol00
ext3 13077624 3342968 9059636 27% /
/dev/sda1 ext3 101086 15876 79991 17% /boot
tmpfs tmpfs 257452 0 257452 0% /dev/shm
/dev/sdb1 ext3 8254240 149624 7685324 2% /android
查看ext4特徵是否激活:
# tune2fs -l /dev/sdb1 | grep extent
執行上述命令後無任何信息返回,說明/dev/sdb1的ext4特徵沒有激活,唯一的解決辦法就是升級文件系統到ext4了。
三、軟體下載及安裝
e2fsprogs軟體包下載頁面:http://ftp.kernel.org/pub/linux/kernel/people/tytso/e2fsprogs/
接下來是源碼編譯安裝過程:
# wget http://ftp.kernel.org/pub/linux/kernel/people/tytso/e2fsprogs/e2fsprogs-1.41.14.tar.gz
# tar -zxvf e2fsprogs-1.41.14.tar.gz
# cd e2fsprogs-1.41.14
# ./configure
# make && make install
安裝完畢後暫時不需要重啟系統。第一次安裝完畢時我就重啟系統了,結果系統竟然崩潰了,因此e2fsprogs軟體包安裝完畢後不要立即重啟伺服器。