❶ 如何開始學習linux內核
首先,你需要知道一個linux的論壇,在這里所有對內核有興趣的人都會在這里討論跟內核代碼有關的東西,這里我介紹的網站叫:https://lkml.org/, 通過網頁上的鏈接,你可以了解很多跟linux有關的東西。注意,網頁是英文的,如果英文不好的就只能怪自己沒有好好的念書了。
接著,你需要有人指點你如何進行linux內核的學習,在上面論壇的最下面有一個FAQ的鏈接,裡面詳細的給出了linux內核學習的一些資料,後面,我將會把全部的內容翻譯出來,給需要的人使用。
網頁的原址:
http://www.tux.org/lkml/#s1-1
linux內核郵件列表FAQ
在你考慮發送郵件到linux內核郵件列表前,請至少閱讀第三節。
頻繁被問到的問題被劃分為若干目錄中。如果你覺得有必要也請對這些菜單和Q/A指出不足之處。如果你有額外的信息需要提供,你也可以對於任何問題增加你自己的回答。
網站的官方網址為: http://www.tux.org/lkml/ (位於美國東海岸)。非常感謝Sam Chessman和David Niemi為FAQ提供了高帶寬和高管理質量的linux伺服器。下列鏡像同樣可以使用:
http://www.atnf.csiro.au/~rgooch/linux/docs/lkml/ in Sydney, Australia
http://www.ras.ucalgary.ca/~rgooch/linux/docs/lkml/ in Calgary, Canada
http://www.kernel.org/pub/linux/docs/lkml/ in the west coast of the U.S.A
在開始抱怨linux內核的編譯問題前,請閱讀下面的章節,來確認是否已經有很多人已經注意到同樣的問題或者是已經發布了修復的補丁。
目錄:
Basic Linux kernel documentation
Contributors and some special expressions
Related mailing lists
Question Index
General questions
Driver specific questions
Mailing list questions
"How do I" questions
"Who's who" questions
CPU questions
OS questions
Compiler/binutils questions
Feature specific questions
"What's changed between kernels 2.0.x and 2.2.x" questions
Primer documents
Kernel Programming Questions
Mysterious kernel messages
Odd kernel behaviour
Programming Religion
User-space Programming Questions
Answers
Contributing
基本linux內核文檔(稍後,我會將文檔進一步翻譯,並放在博客上)
下面列出linux內核相關文檔,在你發送郵件到linux內核郵件列表前應該進行閱讀:
The Linux Kernel Hackers' Guide, compiled by Michael K. Johnson of Red Hat fame. Includes among other documents selected Q/As from the linux-kernel mailing list.
The Linux Kernel book, by David A. Rusling, available in various formats from the Linux Documentation Project and mirrors. Still being worked on, but explains clearly the main structure of the Linux kernel.
The Linux FAQ by Robert Kiesling has many high quality Q/As.
The Linux Kernel HOWTO by Brian Ward. Fundamental reading for anybody wanting to post to the linux-kernel mailing list.
Various Linux HOWTOs on specific questions, such as the BogoMips mini-HOWTO by Wim van Dorst. These are all by definition LDP documents.
The Linux kernel source code for any particular kernel version that you may be using. Note that there is a /Documentation directory which holds some very useful text files about drivers, etc. Also check the MAINTAINERS file in the kernel source root directory.
Some drivers even have Web pages, with additional up to date information e.g. the network drivers by Donald Becker, etc. Check the Hardware section in the LDP site.
Similarly, Linux implementations for some CPU architectures have dedicated Web pages, mailing lists, and sometimes even a HOWTO e.g. the Linux Alpha HOWTO by Neal Crook. Check the LDP site and its mirrors for Web links to the various architecture specific sites.
Linux device drivers, a book written by Alessandro Rubini. C. Scott Ananian reviewed it for Amazon.com.
Linux kernel internals, a book by Michael Beck (Editor) et al. Also reviewed for Amazon.com.
Another useful site is: http://www.kernelnewbies.org/
Here is a general guide on how to ask questions in a way that greatly improves your chances of getting a reply: http://www.catb.org/~esr/faqs/smart-questions.html. If you have a bug to report, you should also read http://www.chiark.greenend.org.uk/~sgtatham/bugs.html.
Extra instructions, specific to the Linux kernel are available here.
貢獻者與特殊的說明
This is the list of contributors to this FAQ. They are listed in alphabetic order of their abbreviations, used in the Answers sections below to identify the author(s) of each answer.
AC : Alan Cox
AV : Alexander Viro
ADB: Andrew D. Balsa
CP : Colin Plumb
DBE: Daniel Bergstrom
DSM: David S. Miller (co-postmaster)
DW : David Woodhouse
JBG: Jan-Benedict Glaw
KGB: Krzysztof G. Baranowski
KO : Keith Owens
MEA: Matti E. Aarnio (co-postmaster)
MRW: Matthew Wilcox
PG : Paul Gortmaker
RC : Ralph Corderoy
REG: Richard E. Gooch (FAQ maintainer)
REW: Roger E. Wolff
RML: Robert M. Love
RRR: Rafael R. Reilova
TAC: Thomas A. Cort
TJ : Trevor Johnson
TYT: Theodore Y. Ts'o
VKh: Vassilii Khachaturov
❷ 請問Linux內核里,USB鍵盤和滑鼠的驅動都是哪些文件
usbhid和usbmouse.c都在/usr/src/linux/drivers/hid/usbhid目錄下
USB 匯流排引出兩個重要的鏈表!
一個 USB 匯流排引出兩個重要的鏈表,一個為
USB 設備鏈表,一個為 USB 驅動鏈表。設備鏈表包含各種系統中的USB 設備以及這些設備的所有介面,驅動鏈表包含 USB 設備驅動程序(usb
device driver)和 USB 驅動程序(usb driver)。
USB 設備驅動程序(usb device driver)和 USB 驅動程序(usb driver)的區別是什麼?
USB 設備驅動程序包含 USB 設備的一些通用特性,將與所有 USB 設備相匹配。在 USB core 定義了:struct usb_device_driver usb_generic_driver。usb_generic_driver 是 USB 子系統中唯一的一個設備驅動程序對象。而 USB 驅動程序則是與介面相匹配,介面是一個完成特定功能的端點的集合。
設備是如何添加到設備鏈表上去的?
在設備插入 USB 控制器之後,USB core 即會將設備在系統中注冊,添加到 USB 設備鏈表上去。
USB 設備驅動程序(usb device driver)是如何添加到驅動鏈表上去的?
在系統啟動注冊 USB core 時,USB 設備驅動程序即將被注冊,也就添加到驅動鏈表上去了。
介面是如何添加到設備鏈表上去的?
在 USB 設備驅動程序和 USB 設備的匹配之後,USB core 會對設備進行配置,分析設備的結構之後會將設備所有介面都添加到設備鏈表上去。比如滑鼠設備中有一個介面,USB core 對滑鼠設備配置後,會將這個介面添加到設備鏈表上去。
USB 驅動程序(usb driver)是如何添加到驅動鏈表上去的?
在每個 USB 驅動程序的被注冊時,USB 驅動程序即會添加到驅動鏈表上去。
比如滑鼠驅動程序,usb_mouse_init 函數將通過 usb_register(&usb_mouse_driver)
將滑鼠驅動程序注冊到 USB core 中,然後就添加到驅動鏈表中去了。其中 usb_mouse_driver 是描述滑鼠驅動程序的結構體。
已配置狀態(configured status)之後話
當滑鼠的設備、介面都添加到設備鏈表,並且滑鼠驅動程序也添加到驅動鏈表上去了,
系統就進入一種叫做已配置(configured)的狀態。
要達到已配置狀態,將經歷復雜的過程,USB core 為 USB
設備奉獻著無怨無悔。在這個過程中,系統將會建立起該設備的的設備、配置、介面、設置、端點的描述信息,它們分別被
usb_device、usb_configuration、usb_interface、usb_host_interface、
usb_host_endpoint 結構體描述。
設備達到已配置狀態後,首先當然就要進行 USB 驅動程序和相應介面的配對,對於滑鼠設備來說則是滑鼠驅動程序和滑鼠中的介面的配對。USB core 會調用usb_bus 匯流排的usb_device_match
函數,通過比較設備中的介面信息和 USB 驅動程序中的 id_table,來初步決定該 USB 驅動程序是不是跟相應介面相匹配。通過這一道關卡後,USB core 會認為這個設備應該由這個驅動程序負責。
然而,僅僅這一步是不夠的,接著,將會調用 USB 驅動程序中的 probe 函數對相應介面進行進一步檢查。如果該驅動程序確實適合設備介面,對設備做一些初始化工作,分配 urb 准備數據傳輸。
當 滑鼠設備在用戶空間打開時,
將提交 probe 函數構建的 urb 請求塊,urb 將開始為傳送數據而忙碌了。urb 請求塊就像一個裝東西的「袋子」,USB
驅動程序把「空袋子」提交給 USB core,然後再交給主控制器,主控制器把數據放入這個「袋子」後再將裝滿數據的「袋子」通過 USB core
交還給
USB 驅動程序,這樣一次數據傳輸就完成了。
❸ Linux內核編譯出錯。
你的編譯環境有問題。
as 提示不支持某個參數,而且從上面看你應該在編譯 arm 架構的內核,但後面的提示是 as 命令,這種名字的命令(沒有架構前綴)應該是本地編譯器。我想你不太可能在 arm 上本地編譯內核吧(實際上確實可以,而且我以前玩 arm 也都傾向於 arm 上本地編譯,就是速度慢,需要用 distcc 加速,但兼容好)?
貌似是 -EL 參數 ix86 架構不支持。所以不太可能這步就是應該用本地 as 編譯。
如果不是 arm 本地編譯,那有可能這步用錯了 as 這個匯編器命令。你的台式計算機 as 是 x86 或者 amd64 的,肯定不支持 arm 特有的編譯參數和代碼。
你看看你的編譯文章吧。可能有錯,不符合現在內核編譯的規范了。或者 GCC 版本太老或者太新不支持這個參數。不排除你的交叉編譯環境有問題。
別聽那匿名胡扯的,內核源代碼根本沒有 configure 。
❹ linux系統是怎麼回事可以簡單的介紹下嗎
什麼是 Linux ?什麼是操作系統?
要了解 Linux 之前,就不能不知道什麼是操作系統 ( Operation System, OS ),所以,首先我們來簡單的說一說什麼是操作系統吧!先來想一想,當我們使用計算機時,屏幕上面顯示的咚咚是由哪裡來的?嗯!是由顯示卡與屏幕顯像的;那麼你現在可以藉由網路看到這篇文章,則是藉由 Internet 、網路卡、網路線以及所有相關的電子器材與網路器材所完成的一項任務!如果你要看 VCD 呢?那麼就需要光碟機、光碟、音效卡的發聲等等的支持。這么說來的話,所以在『工作』的東西都是『硬體』的工作呀!對了!就是這些計算機硬體在工作的。那麼硬體怎麼工作呢?那就是藉由『操作系統』來達成的啰!這個操作系統就是在溝通你這個使用者跟硬體之間的訊息傳遞啦!也就是說,沒有操作系統,那麼你的計算機硬體就只是一堆廢鐵,什麼工作都不能做的!
那麼操作系統裡面含有什麼東西呢?簡單的來說,操作系統主要分為兩個東西,一個是『核心』、一個是『一堆核心提供的工具』我們以使用者常使用的 Windows 計算機來做一個簡單的說明好了。大家應該都使用過 Windows 計算機裡面的檔案總管吧?那麼當你開啟檔案總管的時候,他是否會顯示你硬碟當中的資料?這個顯示硬碟裡面的資料,就是『核心』幫你做的,但是,你要核心去顯示硬碟哪一個目錄下的資料,則是由『檔案總管』這個『工具』幫你達成的!這樣可以理解嗎?再來,如果您曾經使用過 Windows 2000 或 Windows XP 的話,那就更好了!你就應該聽過有所謂的『FAT32 與 NTFS 檔案格式』吧?在 Windows 98 這個早期的 Windows 版本中,他並無法讀取或者是找到 Windows XP 的 NTFS 檔案格式的硬碟,為什麼呢?因為他的『核心』本來就不認識 NTFS 啊!所以,即使你有檔案總管,但是由於核心根本不認識 NTFS ,所以,檔案總管也是沒有能力幫你達到你想要做的事情!這樣應該就更清楚了吧?沒錯!你的整個硬體是由核心來管理的,而如果核心不認識你的硬體,那麼你將無法使用該硬設備,例如上面提到的 NTFS 檔案格式的硬碟!核心就是『 Kernel 』,他是一個操作系統的最底層的東西,由他來掌管整個硬體資源的工作狀態,而 Linux 有 Linux 自己的核心, Windows 也有他自己的核心。所以說,當有新的硬體加入到你的系統中的時候,那麼若你的『 Kernel 』並沒有支持他的時候,呵呵,這個新的硬體就肯定無法工作的,因為控制他的 Kernel 並不認識他呀!這樣了解了嗎?!先有個概略性的了解,後面我們提到『核心編譯』的時候會在更詳細的談到他!
一般來說,Kernel 管理的事項有:
System call interface :一些服務與 kernel 溝通之後,將硬體的資源進一步的利用;
Process control :系統過程式控制制中心,所以核心編的越小越好;
Memory management :控制整個系統的內存管理;
File system management :檔案系統的管理,例如 I/O 等等的工作啦!還有不同檔案格式的支持啦等等,如果你的核心不認識某個檔案系統,那麼您將無法使用該檔案格式的檔案啰!例如上面提到的 Windows 98 不認識 NTFS 檔案格式的硬碟;
Device drivers :就如同上面提到的,硬體的管理是 Kernel 的主要工作之一,當然啰,裝置的驅動程序就是核心需要做的事情啦!好在目前都有所謂的『可載入模塊』功能,可以將驅動程序編輯成模塊,就不需要重新的編譯核心啦!這個也會在後續的核心編譯當中提到的!
所以啦!所有硬體的資源都是他來管理的!至於我們要達成一些工作時,除了藉由核心本身提供的功能 ( 例如上面提到的檔案總管 ) 之外,還可以藉由其它的應用軟體來達成喔!舉個例子來說,你要看 VCD 影片是吧!那麼除了 Windows 提供的媒體播放程序之外,你也可以自行安裝 VCD 播放程序來播放 VCD 啰!這個播放程序就是應用軟體啰,而這個應用軟體可以幫你去控制核心來工作 ( 就是放映影片啰 ) ,因此,我們可以這樣說,核心是控制整個硬體支持的咚咚,也是一個操作系統的最底層,然而要讓整個操作系統更完備的話,那還需要含有相當豐富的核心提供的工具,以及核心相關的應用軟體來支持!
OK!提到這里那麼您知道 Linux 是什麼了嗎?呵呵!對啦!其實 Linux 就是一個操作系統,這個操作系統里頭含有最主要的 kernel 以及 kernel 提供的工具啦!他提供了一個完整的操作系統當中最底層的硬體控制與資源管理的完整架構,這個架構是沿襲 Unix 良好的傳統來的,所以相當的穩定而功能強大!此外,由於這個優良的架構可以在目前的個人計算機 ( X86 系統 ) 上面跑,所以很多的軟體開發者將他們的工作心血移轉到這個架構上面,那就是很多的應用軟體啦!雖然 Linux 僅是其核心與核心提供的工具,不過,由於核心、核心工具與這些軟體開發者提供的軟體的整合,使得 Linux 成為一個更完整的、功能強大的操作系統啰!我們可以將 Linux 的系統與使用者的相關性看成底下的圖標:
圖一、使用者、使用者介面與核心工具、核心、與硬體之相關性
約略了解 Linux 是何物之後,接下來,我們要談一談,『為什麼說 Linux 是很穩定的操作系統呢?他是如何來的?』
從 Unix 到 Linux 這一段歷史
為什麼大家常常會說, Linux 是很穩定的一套操作系統呢?這是因為, Linux 他有個老前輩,那就是 Unix 家族啰!有這個前輩的提攜,讓 Linux 這個小老弟很快的就成為一套穩定而優良的操作系統啦!所以,底下我們來談一談 Unix 到 Linux 的這一段歷史吧!
早在 Linux 出現之前的二十年 ( 大約在 1970 年代 ), 就有一個相當穩定而成熟的操作系統存在了!那就是 Linux 的老大哥『 Unix 』是也!怎麼這么說呢?!他們這兩個傢伙有什麼關系呀?這里就給他說一說啰!眾所皆知的, Linux 的核心是由 Linus Torvalds 在 1991 年的時候給他開發出來的,並且丟到網路上提供大家下載,後來大家覺得這個小東西 ( Linux Kernel ) 相當的小而精巧,所以慢慢的就有相當多的朋友投入這個小東西的研究領域裡面去了!但是為什麼這的小東西這么棒呢?!然而又為什麼大家都可以免費的下載這個東西呢?!嗯!等鳥哥慢慢的唬xx....喔不!聽我慢慢的道來!
一個沒有完成的夢想: Bell, MIT 與 GE 的『 Multics 』系統
早期的計算機並不像現在的個人計算機一般,他可不是一般人碰的到的玩意兒,除非是軍事或者是高科技用途才有可能接觸到這類的 Computer !而如前面所言,有計算機硬體還需要操作系統的配合才能夠發揮計算機的效能,不過,在那個年代,由於計算機算是『奢侈品』,喔~應該說是『貴重物品』,所以,可能一間學校就只有一部大型主機當然,那個年代所謂的大型主機仍然無法提供適度的運算能力的。不過,既然只有一部大型主機,然而有許許多多的教師、學生要想要來使用,怎麼辦呢?為了解決這個問題,在 1960 年代初期,麻省理工學院 ( MIT ) 發展了所謂的『兼容分時系統 ( Compatible Time-Sharing System, CTSS )』,就字面上的意義來看,他主要讓大型主機可以提供多個終端機聯機進入主機使用主機的資源, ( 附帶一提,當時的終端機 ( Terminal ) 本身並沒有軟體或者可供使用的資源,這些終端機要能使用,一定必需要聯機登入主機之後,才能夠使用主機的資源來工作!) 當時可以讓約 30 位使用者聯機使用主機。而為了讓這個分時系統更加的強大,所以,在 1965 年前後由貝爾研究室 ( Bell )、 麻省理工學院 ( MIT ) 及奇異電器公司 ( GE ) 開始來共同開發一個名為 Multics 的大型計畫,目標是想讓大型主機可以聯機 300 位以上的使用者。不過,在奮鬥了四年之後,該計畫仍然宣告不治...喔!是失敗啦!(註: Multics 有復雜、多數的意思。)
一個小型檔案系統的產生:1969 年 Ken Thompson 的小型 file server system
在復雜的 Multics 系統的計畫失敗後,貝爾研究室當然就退出該計畫。就在這個計畫解散之後,曾經參與 Muitics 的貝爾研究室的成員 Ken Thompson 由於自己工作上的需求,需要一套檔案存取的小型操作系統,便在 1969 年的時候以 DEC 公司 ( Digital Equipment Corporation ) 的計算機 PDP-7 為硬體基準,設計了一個適合自己工作環境的小型檔案系統,其中也含有他自行開發的一些小工具。那個系統就是最早期的 Unix 的源頭!當初 Ken 設計這個檔案系統時,主要是為了自己的存取方便所設計的簡單 OS ,因此將原有的 Multics 系統大幅度的簡化,不過,在當時還並沒有 Unix 這個名詞的出現!
Unix 的正式誕生:1973 年 Ritchie 等人以 C 語言寫出第一個正式 Unix 核心
由於 Thompson 寫的那個操作系統實在太好用了,所以在 Bell 研究室內部廣為流傳,並且數度經過改版。到了 1973 年, Bell 研究室的 Dennis Ritchie 等人為了讓這個系統的執行效能更佳化,所以使用編譯效能更好的 C 語言將原有的 1969 年的那個系統之核心大幅度的改寫過,並且確定該操作系統名稱為 Unix,呵呵!那就是最早的 Unix 操作系統啰!不過,由於這個操作系統是由這一群工程師所開發完成的,而且使用者也大多是這方面的工程師,因此造成了後來 Unix 系統介面較難被一般使用者接受的情況 @_@ (註: 相對於 Multics ,Unix 具有單一的意思!)
重要的 Unix 分支: 1977 年 BSD 的誕生
在 Unix 早期的發展中,有一件相當重要的事情,那就是 BSD 的誕生!由於 C 語言是一種高級語言,他可以被應用在不同的硬體架構上面,而 Unix 本身就是 C 語言寫成的!在 Unix 發表之後, 柏克萊大學 ( Berkeley ) 的教授對於這個操作系統相當的有興趣,在經過取得 Unix 的原始碼,並且幾經修改之後,終於在 1977 年發表了第一代的 Berkeley Software Distribution ( BSD ) 。這個 BSD 是 Unix 的一個分支,他的發展對於 Unix 有相當大的影響,例如後來的 Sun 公司就是使用 BSD 發展的核心進行自己商業的 Unix 版本的發展的!
百家齊鳴的 Unix 版本:
由於 C 語言是一個相當高階的程序語言,他與硬體沒有很直接的相關性,例如你的 Windows 也可以執行 C 程序語言!而由於 Unix 是由 C 語言寫成的,因此,也就是說,你只要經過稍微的原始碼修改程序,就可以在不同的硬體架構上面執行這個操作系統!後來,由於 Unix 的方便性,因此很多的商業公司及學術機構就加入這個操作系統的研發啰。不過,也由於 Unix 的便利性與改寫容易,因此就造成了很多的不同版本的 Unix 啰,例如 ATT 的 System V 、 加州大學的 BSD 版、 IBM 的 AIX 等等。
由於『操作系統的核心 ( Kernel ) 必須要跟硬體配合,以提供及控制硬體的資源進行良好的工作!』,而在早期每一家生產計算機硬體的公司還沒有所謂的『協議』的概念,所以每一個計算機公司出產的硬體自然就不相同啰!因此他們必須要為自己的計算機硬體開發合適的 Unix 系統,所以,他們自行開發的 Unix 當然只能配合本身的硬體配備啰!例如在學術機構相當有名的 Sun 、 Cray 與 HP 就是這一種情況,他們開發出來的 Unix 並沒有辦法在其它的硬體架構下工作的! ( 我們都稱呼這種系統與配備為『超級計算機』 ) !由於沒有廠商針對個人計算機設計 Unix 系統,因此,在早期並沒有支持個人計算機的 Unix 操作系統的出現 ( 當然,這是由於早期的個人計算機並沒有現在這樣風行就是了! ) ,每一家公司自己出的 Unix 雖然在架構上面大同小異,但是卻真的僅能支持自身的硬體,所以啰,早先的 Unix 只能與伺服器 ( Server ) 或者是大型工作站 ( Workstation ) 劃上等號!
此外,由於版本太多了,而大家都是同樣來自於 Unix 這個老祖宗,當然也都稱自己是 Unix ,好了,如此一來,許多商業公司自然就會有類似的軟體發表,喝!那麼自然就有些許的商業糾紛啰!真是傷腦筋~
1984 年的 GNU 與 Free Software Foundation:
Unix 在商業上面的問題讓許多對於 Unix 喜好者感到相當的憂心,其中一個就是有名的 Richard M. Stallman 先生。他認為, Unix 是一個相當好的操作系統,在這個系統上面,如果大家能夠將自己所學的貢獻出來,那麼這個系統將會更加的優異!Stallman 先生認為最大的快樂就是讓自己發展的良好的軟體讓大家來使用了!而且,由於每個人的工作環境 ( 指軟硬體平台 ) 可能都不太相同,所以,他也強調應該要有 Open Source 的概念,讓大家都能夠分享這一份的心得!他認為,有了 Open Source 之後,你的程序將有很多的人可以幫忙檢驗,將使得 Unix 社群更佳的茁壯。為了自己的理想, Stallman 在 1984 年實際創立了 GNU 與 自由軟體基金會 ( Free Software Foundation, FSF ),並創作了許多『自由軟體』供大眾來使用,此外,對於其作品以自由 ( free ) 的 GNU General Public License ( GPL ) 的授權模式提供大眾使用。這個 FSF 的核心觀念是『版權制度是促進社會進步的手段,版權本身不是自然權力。』對於 FSF 有興趣或者對於 GNU 想要更深入的了解時,請參考朝陽大學的洪朝貴教授的網站,裡面有更為深入的解說!而且,Stallman 的 GNU General Public License 一直強調 Free 這個字眼!他是這樣說的:『"Free software" is a matter of liberty, not price. To understand the concept, you should thik of "free speech", not "free beer". "Free software" refers to the users freedom to run, , distribute, study, change, and improve the software』大意是說,自由軟體並不是指『免費』的,而是指具有『自由度, freedom』的軟體,什麼是自由度呢?也就是你在取得這個軟體之後,可以進行修改、進一步發表與復制在不同的計算機平台上面。這無疑是個好消息!因為如此一來,你所拿到的軟體可能原先只能在 Unix 上面跑,但是經過原始碼的修改之後,你將可以拿他在 Linux 或者是 Windows 上面來跑!Stallman 先生更直接對自由度下了這樣的說明:
你可以根據任何你想要的提議 ( purpose ) 來跑這個 Free 的程序;
你可以在理解了這支 Free 的程序的運作之後,將他修改成你所想要的樣式與功能;
你可以將你自己修改過的 Free 的程序再次的發表,以幫助你的朋友們;
你可以將這支 Free 的程序進行改良,並將改良過的程序公開發表,以造福社群!
簡單的來說, GPL 授權具有幾個特點:
任何軟體掛上 GPL 授權之後,即為自由的軟體,任何人均可取得,同時,亦可取得其原始碼 ( Source Code );
取得 GPL 授權之軟體後,任何人均可進行修改原始碼,以符合自己的喜好;
除此之外,經過修改的 Source Code 應回報給網路社會,提供大家來參考!
但請特別留意,並非掛上 GPL 之後的軟體就不可販賣,這個是不同的兩回事呦!舉個例子來說,在 Red Hat 的官方網站上面提供 Red Hat 釋出的 Linux 安裝光碟提供大眾下載,但是 Red Hat 本身依然有在賣 Linux 的套件,而且還賣的『很不便宜!』為何可以如此呢?呵呵!因為 Red Hat 他們賣的資料當中,含有相當大量經過整了的文件資料,這些資料雖然在網路上面可以下載,然而花了這么多的時間來整理這些資料,當然應該要給予相當程度的報酬啰!您說是吧!所以,請留意喔!並非 GPL 不可用來營利!
這個 GNU 對於後來的 Linux 有相當深遠的影響,由於 Stallman 先生發展了 GNU 這個計畫中,主力在推出各種方便而優異的工具軟體,例如廣為大家所知的 Emacs 文書編輯器、GCC, BASH..然而沒有作業平台怎麼使用這些軟體呢?然而,由於他倡導的自由軟體,讓後來的心血能很快的接觸原始碼來發展軟體,這就是後來的 Linux 的故事....這是後來的故事,等一下來說~
1988 年的圖形介面 X-Free86 project:
有鑒於圖形使用者介面 ( Graphical User Interface, GUI ) 的需求日益加重,在 1984 年由 MIT 與其它協力廠商首次發表了 X Window System ,並且更在 1988 年成立了非營利性質的 XFree86 這個組織。所謂的 XFree86 其實是 X window system 與 Free 及 x86 系統架構的整合名稱呢!而這個 XFree86 的 GUI 介面更在 Linux 的核心 1.0 版於 1994 年釋出時,整合於 Linux 操作系統當中!
1991 年 芬蘭大學生 Linus Torvalds 的一則簡訊:
在後來的幾年內,由於計算機硬體工業的強力運作,以 intel 主導的 x86 系統架構的個人計算機大行其道,所以個人計算機算是相當流行的一個機器了!但在此時,人們使用的大多還是舊舊而且需要吃很多系統資源的 DOS 系列或其它的操作系統。 此時,有個芬蘭的郝爾辛基大學 (Helsinki )Linus Torvalds 學生做了件不尋常的事情! Linus 手邊有個 Minix 系統 ( 這也是 Unix 的分支 ) ,他對這個操作系統相當的有興趣!此外,由於當時他正好買了一部 386 的計算機,所以他就想說,咦!這個 Unix 這么棒!這么穩定,那我可不可以將他移植到個人計算機 ( X86 架構 ) 來使用呢?!好在由於 Stallman 提倡的 Open Source 風氣,他得以接觸到一些 source code ,而就經由這樣的一個想法,呵呵!他就很有心的讀取 Unix 的核心,並且去除較為繁復的核心程序,將他改寫成可以適用於一般個人計算機的 x86 系統上面,到了 1991 年,他終於將 0.02 版的 hobby 放到網路上面供大家下載,並且由於 hobby 受到大家的肯定,相當多的朋友一起投入這個工作中!終於到了 1994 年將第一個完整的核心 Version 1.0 釋出!並且造成目前的大流行.....由於 Linux kernel 的發展是由『虛擬團隊』所達成的,大家都是透過網路取得 Linux 的核心原始碼,經由自己精心改造後再回傳給 Linux 社群,進而一步一步的發展完成完整的 Linux 系統,至於 Torvalds 先生是這個集團中的發起者。由於這個群策群力的緣故, Torvalds 先生將 Linux 定為同樣造福大家的 GNU 授權模式!
企鵝的來源:
1994年發表 Linux 正式核心 1.0 的時候,大家要 Linus Torvalds 想一隻吉祥物,怪怪的 Torvalds 突然想到小時候去動物園被一隻企鵝追著滿地打滾~還被咬了一口!既然想不到其它的吉祥物了,乾脆就以這支企鵝來當吉祥物算了!所以,呵呵!目前我們常常看到這一隻企鵝就是這么來的咯!
--------------------------------------------------------------------------------
什麼是 distribution
好了,經由上面的說明,我們知道 Linux 是個『操作系統』,而且他是 GNU 的授權模式,並且有個老大哥是 Unix 。不過,畢竟由 Torvalds 先生負責維護的 Linux 提供的僅是『核心』與『核心工具』的集合,對於需要更完整功能的操作系統來說,畢竟還不夠完備,例如如果你要桌面程序,還得要加入 X-Window 系統對吧!?如果你要架設 WWW 還得加入伺服器軟體對吧?所以,雖然 Linux 的核心已經提供了相當多的支持與工具程序,但畢竟還不足以構成一個很完整的操作系統。
好在,由於 Linux 的穩定性良好,並且可以在便宜的 x86 架構下的計算機平台運作,所以吸引了很多的套件商與自由軟體的開發團隊在這個 Linux 的核心上面開發相關的軟體,例如有名的 sendmail, wu-ftp, apache 等等。此外,亦有一些商業公司發現這個商機,因此,這些商業公司或者是非營利性的工作團隊,便將 Linux 核心、核心工具與相關的軟體集合起來,並加入自己公司或團隊的創意的系統管理模塊與工具,而釋出一套可以完整安裝的操作系統,這個完整的 Linux 操作系統,我們就稱呼他為 distribution,或者是中文所謂的『安裝套件』啰!當然啰,由於是基於 GNU 的架構下,因此各家公司所發行的光碟套件是可以在網路上面自由下載的。不過,如果想要有較佳的服務,那麼購買該公司發行的光碟也是不錯的!
不過,由於發展的 Linux 公司實在太多了,例如有名的 Red Hat, OpenLinux, Mandrake, Debian, SuSE 等等,所以很多人都很擔心,如此一來每個 distribution 是否都不相同呢?這就不需要擔心了,由於各個 distribution 都是架構在 Linux Kernel 下來發展屬於自己公司風格的 distribution,因此大家都遵守 Linux Standard Base ( LSB ) 的規范,也就是說,各個 distribution 其實都是差不多的!反正用到的都是 Linux Kernel 啊!只是各個 distribution 裡面所使用的各套件可能並不完全相同而已。所以啰,大家可以按照自己的喜好來選擇 Linux 的 distribution 光碟啰!底下列出幾個主要的 Linux 發行者網址:
Red Hat: http://www.redhat.com
Mandrake: http://www.linux-mandrake.com/en/
Slackware: http://www.slackware.com/
SuSE: http://www.suse.com/index_us.html
OpenLinux: http://www.caldera.com/
Debian: http://www.debian.org/
Linpus: http://www.linpus.com.tw/
UniteLinux:http://www.sco.com/unitedlinux/
當然發行套件者不僅於此,您可以查閱其它的 Linux 新聞來發現喔!而其中中文化較為有名的就屬 CLE 這個套件發行者了!有興趣的話也可以到底下的網頁上看看!
CLE:http://cle.linux.org.tw/
好了,那麼哪一個安裝套件比較好呢?!就如同 VBird 前面提到的,每一個發行者所使用的 Linux 核心其實是一樣的,都是由 www.kernel.org 開發出來的核心呀!所以其架構,甚至包括其檔案放置的目錄,都是大同小異的,基本上除了某些內容套件不太一樣之外 ( 例如有人使用 wu-ftpd 有人使用 proftpd 等等 ) ,其它的檔案架構與指令系統其實幾乎都是相同的,因此我們不去探討哪一個套件比較棒!而是要來介紹如何學習與使用一個套件!至於下載的地點,網友提供了一個相當棒的多種 Linux distributions 的下載網站:
www.linuxiso.org
--------------------------------------------------------------------------------
Linux 的功能與優缺點
Linux 的起源:
前面提到了,Linus Torvalds 先生一直以來就喜歡那個小小的操作系統核心,而核心是管理一個系統的最底層的東西,所有的硬體資源都是由 kernel 來管控的!但是,就如同前面說的,早期的 Unix 並不支持 x86 的個人計算機架構,一直到了 1991 年在 BBS 裡面 Linus 先生貼了個小布告之後,才有了重大的轉變: Hello everybody out there using minix-
I'm doing a (free) operation system (just a hobby,
won't be big and professional like gnu) for 386(486) AT clones.
這封 BBS 的郵件即是由當時還是芬蘭的大學生 Linus Torvalds 所發表的,他說他修改了一個簡單的操作系統核心,核心名稱為 hobby,這個 hobby 的核心 ( Kernel ) 即為第一個 Linux 的核心系統!此外,由於他是基於 GNU 的協議而開發這個操作系統,所以他是 Free 的,任何人都可以下載使用!( 註:hobby 是個人興趣,just a hobby, won't be big and professional like gnu,其意思是:僅為個人興趣,不會玩得跟 gnu 那麼大啦~~~)
Linus 所開發的這個 hobby 是基於 Unix 的系統所發展出來的,他將 Unix 裡面的很多資料又加以簡化,並且使之可以適用於 intel 主導的 x86 的系統下(當初的個人計算機系統為 386 與 486 架構),因此當初他所發表的這個最新的系統核心就被稱為 linus's unix ,簡稱為 Linux !當然,由於這個核心很像是當時的 Unix 系統,因此也稱為 Unix-like 系統啰!( 註:其實 Unix-Like 可以說是目前伺服器類型的操作系統的統稱啦!因為,不論是 FreeBSD, BSD, Sun Unix, SCO Unix, HP Unix, Red Hat Linux, Mandrake Linux 等等,都是由同一個祖先『Linux』來的,因此,這些咚咚都被統稱為 Unix-Like 的操作系統啰! )
那麼這個系統有什麼特異功能呢?簡單的說:
免費:由於他是基於 GPL ( General Public License ) 的架構之下,因此他是 Free 的,也就是任何人都可以免費的使用或者是修改其中的原始碼的意思!這就是所謂的『開放性架構』,這對科學界來說是相當重要的!因為很多的工程師由於特殊的需求,常常需要修改系統的原始碼,使該系統可以符合自己的需求!而這個開放性的架構將可以滿足各不同需求的工程師!因此當然就有可能越來越流行啰!
配備需求低廉:而他可以支持個人計算機的 X86 架構,系統資源不必像早先的 Unix 系統那般,僅適合於單一公司 ( 例如 Sun ) 設備!單就這一點來看,就可以造成很大的流行啰!
功能強大而穩定:也且由於功能並不會輸給一些大型的 Unix 工作站,因此,近年來越來越多的公司或者是團體、個人投入這一個操作系統的開發與整合工作!
獨立作業:另外,由於很多的軟體套件逐漸被這套操作系統來來使用,而很多套件軟體也都在 Linux 這個操作系統上面進行發展與測試,因此, Linux 近來已經可以獨力完成幾乎所有的工作站或伺服器的服務了,例如 Web, Mail, Proxy, FTP.....。
所以,目前他已經是相當成熟的一套操作系統啰!而且不耗資源又免費,呵呵,可以說造成微軟相當大的壓力呀!此外,由於他的系統硬體要求很低,加上目前很多的人由於『Intel 的陰謀』(呵呵!開玩笑的,因為 Tom 的硬體評論網站常常這樣說 Intel 的不是!呵!很好笑!)而造成手邊有相當多的淘汰掉的硬體配備, Linux
❺ linux下pcie驅動開發,該看些什麼資料
linux下pcie驅動開發大概可以分為4個階段,水平從低到高:
從安裝使用=>linux常用命令=>linux系統編程=>內核開發閱讀內核源碼
系統編程推薦《高級unix環境編程》;
還有《unix網路編程》;
內核開發閱讀內核源碼階段,從寫驅動入手逐漸深入linux內核開發
參考書如下:
1.《linux device drivers》
2.《linux kernel development》
3.《understading the linux kernel》
4.《linux源碼情景分析》
然後還需要看資料理解elf文件格式,連接器和載入器,cmu的一本教材中文名為《深入理解計算機系統》比較好。
❻ 問下《linux設備驅動程序》和《深入理解linux內核》有出下一版的趨勢嗎
Linux這幾年發展迅猛,勢如破竹。
雖然內核 3.0版本,並沒有什麼重大的修改,不過,這已經預示著Linux將迎來一個新的時代。
《linux設備驅動程序》是基於2.6.10來寫的。《深入理解linux內核》是基於2.6.11來寫的。雖然2.6.x的內核,在主要內容上變化不大,不過已經有些顯得跟不上內核更迭的速度了。
目前內核方面寫的不錯的書籍中,最新的算是《深入Linux內核架構》了,一個德國人寫的。這本書是基於2.6.24寫的。這本書在國外是作為教材用的,個人覺得,從自學的角度上講,要比ULK更好,而且裡面與最新的內核更貼近,看起來更舒服一些。
《linux device drivers》英文第三版序言里有這樣一段話:「I'm excited by what I witness in the embedded arena, and I hope this text helps by doing more; but ideas are moving fast these days, and it's already time to plan for the fouth edition, and look for a fourth author to help.」
不難看懂,我就不翻譯了。從這里可以看出,作者們已經做好找第四位合作者寫第四版的准備了:)
萬事都是需要與時俱進的。所以,這兩本書都是會不斷更新的。否則,就只能說明一點,出版商發現有更好的書籍替代他們了:)
不管怎麼樣,希望這些大部頭的下一版的作者中,能看到中國開發者的名字~~
❼ 學習linux底層驅動開發有什麼經典的參考書
結構、操作系統、體系結構、編譯原理、計算機網路你全修過
我想大概可以分為4個階段,水平從低到高
從安裝使用=>linux常用命令=>linux系統編程=>內核開發閱讀內核源碼
其中學習linux常用命令時就要學會自己編譯內核,優化系統,調整參數
安裝和常用命令書太多了,找本稍微詳細點的就ok,其間需要學會正則表達式
系統編程推薦《高級unix環境編程》,黑話叫APUE
還有《unix網路編程》
這時候大概還需要看資料理解elf文件格式,連接器和載入器,cmu的一本教材中文名為《深入理解計算機系統》比較好
內核開發閱讀內核源碼階段,從寫驅動入手逐漸深入linux內核開發
參考書如下《linux device drivers》,黑話叫ldd
《linux kernel development》,黑話叫lkd
《understading the linux kernel》,黑話叫utlk
《linux源碼情景分析》
這四本書為搞內核的必讀書籍
最後,第三階段和第四階段最重動手,空言無益,光看書也不罩,不動手那些東西理解不了
學習linux/unix編程方法的建議
建議學習路徑:
首先先學學編輯器,vim, emacs什麼的都行。
然後學make file文件,只要知道一點就行,這樣就可以准備編程序了。
然後看看《C程序設計語言》K&R,這樣呢,基本上就可以進行一般的編程了,順便找本數據結構的書來看。
如果想學習UNIX/LINUX的編程,《APUE》絕對經典的教材,加深一下功底,學習《UNP》的第二卷。這樣基本上系統方面的就可以掌握了。
然後再看Douglus E. Comer的《用TCP/IP進行網際互連》第一卷,學習一下網路的知識,再看《UNP》的第一卷,不僅學習網路編程,而且對系統編程的一些常用的技巧就很熟悉了,如果繼續網路編程,建議看《TCP/IP進行網際互連》的第三卷,裡面有很多關於應用協議telnet、ftp等協議的編程。
如果想寫設備驅動程序,首先您的系統編程的介面比如文件、IPC等必須要熟知了,再學習《LDD》2。
對於幾本經典教材的評價:
《The C Programing Language》K&R 經典的C語言程序設計教材,作者是C語言的發明者,教材內容深入淺出。雖然有點老,但是必備的一本手冊,現在有時候我還常翻翻。篇幅比較小,但是每看一遍,就有一遍的收獲。另外也可用譚浩強的《C語言程序設計》代替。
《Advanced Programing in Unix Envirement》 W.Richard Stevens:也是非常經典的書(廢話,Stevens的書哪有不經典的!),雖然初學者就可以看,但是事實上它是《Unix Network Programing》的一本輔助資料。國內的翻譯的《UNIX環境高級編程》的水平不怎麼樣,現在有影印版,直接讀英文比讀中文來得容易。
《Unix Network Programing》W.Richard Stevens:第一卷講BSD Socket網路編程介面和另外一種網路編程介面的,不過現在一般都用BSD Socket,所以這本書只要看大約一半多就可以了。第二卷沒有設計到網路的東西,主要講進程間通訊和Posix線程。所以看了《APUE》以後,就可以看它了,基本上系統的東西就由《APUE》和《UNP》vol2概括了。看過《UNP》以後,您就會知道系統編程的絕大部分編程技巧,即使卷一是講網路編程的。國內是清華翻譯得《Unix網路編程》,翻譯者得功底也比較高,翻譯地比較好。所以建議還是看中文版。
《TCP/IP祥解》一共三卷,卷一講協議,卷二講實現,卷三講編程應用。我沒有怎麼看過。,但是據說也很經典的,因為我沒有時間看卷二,所以不便評價。
《用TCP/IP進行網際互連》Douglus.E.Comer 一共三卷,卷一講原理,卷二講實現,卷三講高級協議。感覺上這一套要比Stevens的那一套要好,就連Stevens也不得不承認它的第一卷非常經典。事實上,第一卷即使你沒有一點網路的知識,看完以後也會對網路的來龍去脈了如指掌。第一卷中還有很多習題也設計得經典和實用,因為作者本身就是一位教師,並且卷一是國外研究生的教材。習題並沒有答案,留給讀者思考,因為問題得答案可以讓你成為一個中級的Hacker,這些問題的答案可以象Douglus索取,不過只有他只給教師卷二我沒有怎麼看,卷三可以作為參考手冊,其中地例子也很經典。如果您看過Qterm的源代碼,就會知道Qterm的telnet 實現部分大多數就是從這本書的源代碼過來的。對於網路原理的書,我推薦它,而不是Stevens的《TCP/IP祥解》。
《Operating System - Design and Implement》這個是講操作系統的書,用Minix做的例子。作者母語不是英文,所以英文看起來比較晦澀。國內翻譯的是《操作系統設計與實現》,我沒看過中文版,因為翻譯者是尤晉元,他翻譯的《APUE》已經讓我失望頭頂了。讀了這本書,對操作系統的底層怎麼工作的就會
有一個清晰的認識。
《Linux Device Driver》2e ,為數不多的關於Linux設備驅動程序的好書。不過內容有些雜亂,如果您沒有一些寫驅動的經驗,初次看會有些摸不著南北。國內翻譯的是《Linux設備驅動程序》第二版,第一版,第二版的譯者我都有很深的接觸,不過總體上來說,雖然第二版翻譯的有些不盡人意,但是相比第一版來說已經超出了一大截。要讀這一本書,至少應該先找一些《計算機原理》《計算機體系結構》的書來馬馬虎虎讀讀,至少應該對硬體和計算機的工作過程有一些了解。
❽ 如何將linux驅動程序添加到內核中 / 藍訊
1.進入你的內核源碼文檔,創建一個DoneLin_Driver文件夾來存放你的驅動,於是文件夾路徑:drivers/DoneLin_Driver/:
2.復制你的範例驅動到剛剛建立的DoneLin_Driver文件夾中,我的範例名字叫global_mem_two.c:
3.在DoneLin_Driver文件夾中建立兩個新文本文件:Kconfig 和 Makefile
4.修改DoneLin_Driver文件夾下的Kconfig文件,輸入以下內容:
menu "DoneLin-driver "
comment "global_mem_two-driver "
config GLOBAL_MEM_TWO tristate "global_mem_two DriTst" help this is global mem 2 test programming
endmenu
5.接著修改DoneLin_Driver的另一個文件Makefile,輸入以下內容:
obj-$(CONFIG_GLOBAL_MEM_TWO) += global_mem_two.o
6.修改上一層目錄(Driver目錄)中的Kconfig文件,聲明自己的源代碼:在"menu "Device drivers""下面加入如下內容:
source "drivers/DoneLin_Driver/Kconfig"##...add my tst driver mole
7.修改arch/arm/Kconfig
同樣,跟在driver/Kconfig一樣,在"menu device drivers"下面加入同樣的語句:
source "drivers/DoneLin_Driver/Kconfig"
就是說:在arch/arm/Kconfig menu "Device Drivers" endmenu之間添加source "drivers/DoneLin_Driver/Kconfig"
在drivers/Kconfig menu "Device Drivers" endmenu之間添加source "drivers/hello/Kconfig"(不知為什麼arch/arm/Kconfig中竟然含有Drivers里Kconfig內容的一個復本,實驗證明只對drivers/Kconfig中修改內容無效。)
8.修改Drivers目錄下的Makefile,在如圖位置,加入:
obj-$(CONFIG_GLOBAL_MEM_TWO) += DoneLin_Driver/#ADD FOR TEST add_for_test add for test測試的驅動
8.都修改好,保存好之後,回到linux內核根目錄,make menuconfig,奇跡出現了,我自己的linux驅動程序出現在內核的device drivers選項裡面了:
選擇global_mem_tow_DriTst為m,表示編譯成模塊,編譯成ko文件
然後,保存退出,make, make zImage, make moles即可生成新的內核和新的moles,
完成了,