導航:首頁 > 操作系統 > linux內核api參考手冊

linux內核api參考手冊

發布時間:2023-02-11 04:36:12

Ⅰ 如果想學linux,應該怎麼學

學嵌入式Linux要先學以下幾點:
1.C語言。要有C語言的基礎,當然越熟練越好,不熟也沒關系,具備基本技能就可以:比如寫一個數組排序、輸入數字求和什麼的。C語言的學習就是多些多練。
2.Linux基礎
Linux操作系統的概念、安裝方法,詳細了解Linux下的目錄結構、基本命令、編輯器VI ,編譯器GCC,調試器GDB和 Make 項目管理工具, Shell、 Makefile腳本編寫等知識,嵌入式開發環境的搭建。
3.Linux系統編程
重點學習標准I/O庫,Linux多任務編程中的多進程和多線程,以及進程間通信(pipe、FIFO、消息隊列、共享內存、signal、信號量等),同步與互斥對共享資源訪問控制等重要知識,主要提升對Linux應用開發的理解和代碼調試的能力。
4.Linux網路編程
計算機網路在嵌入式Linux系統應用開發過程中使用非常廣泛,通過Linux網路發展、TCP/IP協議、socket編程、TCP網路編程、UDP網路編程、Web編程開發等方面入手,全面了解Linux網路應用程序開發。重點學習網路編程相關API,熟練掌握TCP協議伺服器的編程方法和並發伺服器的實現,了解HTTP協議及其實現方法,熟悉UDP廣播、多播的原理及編程方法,掌握混合C/S架構網路通信系統的設計,熟悉HTML,Javascript等Web編程技術及實現方法。
5.數據結構與演算法
數據結構及演算法在嵌入式底層驅動、通信協議、及各種引擎開發中會得到大量應用,對其掌握的好壞直接影響程序的效率、簡潔及健壯性。此階段的學習要重點理解數據結構與演算法的基礎內容,包括順序表、鏈表、隊列、棧、樹、圖、哈希表、各種查找排序演算法等應用及其C語言實現過程。
6.Cortex A8 、Linux 平台開發
通過基於ARM Cortex-A8處理s5pv210了解晶元手冊的基本閱讀技巧,掌握s5pv210系統資源、時鍾控制器、電源管理、異常中斷控制器、nand flash控制器等模塊,為底層平台搭建做好准備。Linux平台包括內核裁減、內核移植、交叉編譯、GNU工具使用、內核調試、Bootloader介紹、製作與原理分析、根文件系統製作以及向內核中添加自己的模塊,並在s5pv210實驗平台上運行自己製作的Linux系統,集成部署Linux系統整個流程。同時了解Android操作系統開發流程。Android系統是基於Linux平台的開源操作系統,該平台由操作系統、中間件、用戶界面和應用軟體組成,是首個為移動終端打造的真正開放和完整的移動軟體,目前它的應用不再局限於移動終端,還包括數據電視、機頂盒、PDA等消費類電子產品。
7.驅動開發
驅動程序設計是嵌入式Linux開發工作中重要的一部分,也是比較困難的一部分。本階段的學習要熟悉Linux的內核機制、驅動程序與用戶級應用程序的介面,掌握系統對設備的並發操作。熟悉所開發硬體的工作原理,具備ARM硬體介面的基礎知識,熟悉ARM Cortex-A8處理器s5pv210各資源、掌握Linux設備驅動原理框架,熟悉工程中常見Linux高級字元設備、塊設備、網路設備、USB設備等驅動開發,在工作中能獨立勝任底層驅動開發。

Ⅱ 怎麼學編程啊

如何學習編程,主要有自學和報班兩種途徑,至於需不需要報班,可以結合自己的實際情況來進行判斷,這里簡單介紹下。

學編程的注意點:

1、要確定好自己一定能學下去,不能是三分鍾的熱度,只是學個熱鬧,這樣永遠沒有辦法學的會。

2、一定要打好基礎,剛開始學習編程的時候可能會很慢,感覺自己沒學會啥,這可能是因為正處於打基礎的階段,只有把基礎打好,未來才可以學得更好。

3、要注意實踐操作,理論知識學得再多,如果不能實際的運用,還是等於0的。

自學還是報班:

1、如果你可以規劃好自己的學習過程,堅持一步步向前走,那麼自學當然是很好的。

2、如果你沒人監督就學不進去,也沒有自己的學習規劃,那麼還是建議你報班,可以少走冤枉路。

不管是自學還是報班,學編程的要注意的點是相差不大的,希望我的回答對你有幫助!

Ⅲ c語言的主要功能是保數據嗎

其實,主要功能是效率和語法 。。。。。。。。。。

Ⅳ 麻煩給完整編程

print('\n'.join(input('請輸入多種水果名稱:').strip().split()))

Ⅳ 如何將linux下的程序,移植到freertos中

方法/步驟

Ⅵ LINUX 和 WINDOWS 內核的區別

二者最大的區別在於WINDOWS是個商業軟體,而LINUX是開源軟體。商業軟體的好處是可以集中一大批人力物力做一件事情。容易統一,兼容(因為客戶需求)。而開源的好處在於靈活,開放。

在下面的比較中,我一般先介紹下WINDOWS的,然後再介紹LINUX的。

1、觀念:商業 VS 開源

WINDOWS是個商業軟體,它的源碼是保密的. 當然,其他非MS的人也還是有機會看到源碼的. 如果你和MS 簽訂一個NDA(NON DISCLOSURE AGREEMENT),那麼你也有可能拿到WINDOWS代碼.

不過對於廣大窮學生,以及連VISUAL STUDIO都在用盜版的摳門公司來說,和MS簽個NDA幾乎是不可想像的. 所以在WINDOWS世界,想了解WINDOW 內核的具體信息變得很難. 只能靠DDK(DRIVER DEVELOPMENT KIT) 和WINDBG(內核調試工具)泄漏出來的一些. 然後就是REVERSE ENGINEERING (逆向工程,可以簡單的理解為反匯編,實際上更復雜一些).

這也造成了 <WINDOWS INTERNALS> 一書超級火爆的原因. 因為它是微軟授權的,而且公布了很多內部細節. 另外一本講內核的書是<UNDOCUMENTED WINDOWS 2K SECRETS>,雖然老了點,但是很多內幕。關於WINDOWS, undocumented 和secrets 這2個字絕對是可以類比「超級美女」的字眼。因為這些東西平時是看不到的.

與此對應,在LINUX世界,常見的一個詞是RTFS。也就是READ THE FXXXXXX SOURCE CODE (這句話據說最早出於linus torvalds, 也就是LINUX之父)。意思也就是說「去讀該死的代碼」。言外之意,我把代碼都給你你了,你還想要啥啊?這就好像一個男人對他GF / LP / LD說,我把全部的銀行帳戶密碼都給你了,你還想要啥啊?

其實他不知道(或者認識不到)女人還需要你的時間,精力來陪她。就好像LINUX 程序員意識不到文檔也是很重要的。當然,LINUX程序員應該也是知道文檔的重要的,不過一個是維護成本太高,另外是LINUX 內核變化太快。所以LINUX 的文檔總感覺比MSDN要差點。

話說當年WIN 2K的源碼泄漏出來了一些,我也迫不及待的下載了一份.雖然至今也沒看過,但是拿到WINDOWS 源碼的感覺,絕對不比娶了一個絕世美女差. (當然,真要娶老婆還是看內在).

相比之下, LINUX 是開源的,代碼隨時可見. 這對剛從WINDOWS世界轉過來的我是十分震撼的. 雖然我一直都知道這個事實, 但是當你發現了以前需要用盡各種方法,採用各種手段才可以得到只言片語的信息現在完全呈獻在你面前的時候,你才能真正體會開源確實是一件偉大的工程.

看了LINUX源碼之後,我終於發現,原來內核里大部分也是C語言(而不是以前想像的匯編). 同時內核似乎也就那樣,不像之前想像的那麼神秘. 原來編譯內核也就是比編譯個普通程序稍微麻煩點,用的時間長點. 原來編譯內核用普通的C編譯器就可以. 原來內核也是一個普通的可執行文件.(PS: 我懷疑MS也是用VS來編譯WINDOWS的. 同時我也知道WINDOWS內核也是一個可執行文件.) 原來更換內核是如此的簡單.

終於,內核可以被我隨便改了. 哇哈哈哈!

言規正傳,我覺得商業也還是有好處的。比如兼容性好,我以前用WDM寫一個驅動,最多改下編譯選項就可以在WIN 98, WIN 2K, WIN XP下運行。十分方便。而如果換成LINUX,那麼你只好祈禱不同的內核版本之間沒改那些你用到的頭文件,函數介面。否則就要改代碼了。

同時,開源的好處是適合學習,十分靈活。我覺得LINUX十分適合學校,學生。因為開源,當你發現不明白的地方的時候,可以直接去看源碼(還記得RTFS? )。看不懂還可以到論壇上問。而對於WINDOWS,你想了解它的內部機制就只好GOOGLE,然後祈禱了。比較好的一個資源是MSDN下面的一個雜志,其中有一個主題叫UNDER THE HOOD, 或者搜搜 BUGSLAYER 也可以。這2個專題的作者Matt Pietrek和John Robbins都是大牛級的人物。

順便說下UNDER THE HOOD 這個名字本身。以前一直不太理解,因為查字典的話,HOOD 的意思也就是個蓋子。那麼蓋子下面有啥呢?為啥要看蓋子下面呢?

來到美國之後,我漸漸明白了。HOOD 在這里應該理解為汽車的引擎蓋。在美國,汽車是很普遍的。如果你開車,但是從來沒打開過引擎蓋,那麼說明你只會用,而不了解汽車內部。那麼如果你打開蓋子看看呢?就可以看到很多內部細節,比如發動機啥的了。

在美國這個汽車王國,很多軟體術語和汽車有關,因為人們日常生活中對汽車也很了解。比如「引擎」這個詞,以前玩3D游戲的時候,常會看到介紹說,本游戲採用了最新的3D引擎。啥意思呢?就是游戲最核心的部分(汽車引擎)已經升級了。不是只把外面的人物形象改了下而已。

另外,開源軟體也經常用汽車來類比。開源意外著你買了車(軟體)後,可以隨便拿到一個修理廠去修。也就是什麼人都可以改,只要他懂。而COPY RIGHT 軟體呢,就是你買了車,但是引擎蓋子是鎖著的,壞了只能去生產廠家修,其他人修不了。如果萬一生產廠家不想修或者不會修呢?那你就只能認命了。

扯得有點遠了,打住。

1.1、發布:2進制 VS 源碼

這里主要討論下WINDOWS和LINUX在發布程序採用的不同的形式和觀念,這些和前面的商業還是開源的基本觀念是聯系在一起的。

在WINDOWS 世界,安裝程序幾乎全部都是以二進制形式發布的。也就是說,用戶下載了一個程序,然後雙擊,一路NEXT,NEXT,NEXT就可以了。這個方法很適合初學者。在LINUX世界也有類似的機制,比如YUM, APT-GET 等。不過YUM和APT-GET都是比較晚才出現的,在那之前,在LINUX世界安裝程序要更麻煩些。

有的時候,LINUX的YUM, APT-GET還不夠用。比如有的人寫的一個小軟體,沒有放到這些大的公共的庫裡面。這時,你就會發現他們一般提供一個或者一堆源文件,然後需要使用者自己下載,「編譯」,安裝。這也就是LINUX世界常見的源代碼發布的形式。

一開始的時候,十分不習慣LINUX的這種發布形式。用慣了WINDOWS的雙擊安裝,總覺得LINUX的安裝很麻煩,又要自己./CONFIGURE, MAKE, MAKE INSTALL. 萬一這個軟體又依賴於其他的庫,那麼又要自己去找那些庫,萬一那些庫又依賴其他的庫...... 另外,各種庫的版本也是一個問題,萬一不兼容,那麼又要找一個兼容的。

為什麼LINUX世界這么多源代碼發布呢?為什麼WINDOWS世界流行2進制文件發布,而不是源代碼呢?關於後者,很好解釋,因為WINDOWS那邊很多源代碼都是商業秘密,是不公開的。同時,WINDOWS的程序用到的那些庫在一般的系統里都裝好了。所以2進制發布可行,也十分方便。

關於前一個問題,我覺得源代碼發布的一個好處是可以在編譯的時候進行一些優化和設置。比如同樣的代碼,在32或64位平台下編譯的時候可以進行適當的優化。另外,用戶也可以在編譯的時候設置一些開關,這樣在編譯期間的優化一般要好於運行時間的優化。

不過源代碼發布的一個壞處就是對使用者要求較高。如果運行configue,make命令順利的話還好。如果萬一不順利,要自己改下頭文件啥的,無疑是一般的使用者無法做到的。另外庫之間的依賴關系如果是人手工處理的話也十分麻煩。好在LINUX世界後來有了YUM APT-GET之類的包管理系統。大多數軟體都可以很方便的安裝了。

2、進程及其創建 CreateProcess VS fork+execv

在WINDOWS世界,創建進程最常用的WIN 32 API 是 CreateProcess以及相關函數。這個函數需要一堆參數(WINDOWS API 的特點),不過很多參數可以簡單的用NULL, TRUE OR FALSE來表示。另外,你直接告訴它要執行的是哪個文件。

到了LINUX世界,我模糊的知道fork是用來創建一個新進程的。但是當我看fork的函數說明的時候,呆住了。因為fork不需要任何參數。習慣了 CreateProcess 的10來個參數,突然換成一個不要任何參數的函數,感覺很奇妙。一方面覺得似乎事情簡單了很多,不用去把10來個參數的每個意思都搞明白。另外一方面又很疑惑,我怎麼告訴它我要執行某個文件呢?

後來才知道,LINUX中的進程的含義和WINDOWS中是不一樣的。LINUX中的進程本身是可以執行的。而WINDOWS中,進程只是表示一個資源的擁有體,是不能執行的。要執行的話,一定需要一個線程。這也部分解釋了為什麼CreateProcess中為啥一定要傳入要執行的文件的名字。

而fork的含義是把進程本身CLONE一個新的出來。也就是說,FORK之後,父進程和子進程都執行同樣的一段代碼。如果想區分的話,可以根據FORK的返回值來區分。引用一段fork的說明:

On success, the PID of the child process is returned in the parent's thread of execution, and a 0 is returned in the child's thread of execution.

同時在LINUX程序中,常見的寫法如下:

int pid;
pid = fork();
switch (pid)
{
case 0: //I am the child

;
case -1: //failed.

;
default: //I am the parent

}

為什麼要這樣設計呢?因為LINUX的設計目標之一就是應用於伺服器。這種情況下,一個SERVICE可能會啟動很多進程(線程)來服務不同的CLIENT. 所以FORK設計成快速復制父進程。子進程直接使用父親的地址空間,只有子進程載入一個新的可執行文件的時候才創建自己的地址空間。

這樣節省了創建地址空間這個龐大的開銷,使得LINUX的進程創建十分快。不過實際上,這里的進程相對於WINDOWS中的線程,所以同WINDOWS中的線程創建相比,二者的開銷應該差不多。

那麼如何才能讓新的進程載入一個可執行文件呢,這時就要用execv以及相關函數了。所以LINUX中,代替CreateProcess()的函數是fork+execv

3、文件格式 PE VS ELF

WINDOWS中的可執行文件格式是PE。到了LINUX就變成了ELF。2者有相似的地方,比如都分成幾個SECTION,包含代碼段,數據段等。但是2個又不一樣。使得從一個轉到另外一個的人不得不重新學習下。有點象在國內開慣了車的人,到了香港或者英國開車,雖然也是4個輪子一個方向盤,但是一個靠左行駛,一個靠右。總是需要些時間來習慣。

那麼為啥LINUX不能和WINDOWS用同樣的文件格式呢?我覺得可能的原因有幾個。首先可能是2個差不多同時在設計的,彼此不知道對方的存在。所以也沒法一方壓倒一方。另外一個可能的原因是PE格式最開始還是保密的(後來MS公開了PE的SPEC),所以即使LINUX想直接用PE都不行。

順便說下,MS OFFICE 的文檔格式以前也是保密的,直到最近(好像是2008年)才公開。希望這可以使得OPEN OFFICE的開發順利很多。

4、內核API:固定 VS 非固定

WINDOWS內核有一套固定的API,而且向後兼容。這使得WINDOWS 驅動的開發人員在不同版本之間移植時變得很容易。比如我用WDM (WINDOWS DEVICE MODEL) 開發一個驅動,最多改下編譯選項就可以在WIN 98, 2K, XP, 2003 下使用。VISTA 我覺得也許都可以。

而LINUX沒有固定的內核API。2.4版本的內核模塊在2.6幾乎很大可能是不能兼容的。要移植的話,不只是改個編譯選項,而是要改一堆的頭文件和實現文件等。而麻煩的是,即使都是2.6內核,不同的小版本之間也有些不同。如果你的內核模塊剛好用到了變化的部分,那麼也只好重新學習,然後改自己的頭文件或者實現文件了。

固定內核API的好處是兼容性好,壞處是包袱比較大,不得不隨時支持老的,也許是過時的介面。比如WINDOWS內核里有WDM 一套API, 但是又有網卡專用的 NDIS 一套API. 實際上2套API的很多設計目標是重合的。那麼為什麼有2個呢?因為NDIS是先出來的,為了兼容性,一定要支持。而NDIS又只針對網卡,所以又出來了WDM。

不固定API的壞處是升級很麻煩,外圍的內核模塊維護者很辛苦。好處是可以隨時採用更新的設計。

5. WINDOWS與LINUX中的中斷處理比較

5.1不同之處:

在WINDOWS中,有一個IRQL (注意不是IRQ)的概念。最早的時候,我以為是CPU設計里就包括了這個東東。後來看INTEL CPU手冊,發現似乎沒有。最近又看了一遍WINDOWS INTERALS 4TH。感覺這個東西應該是包括在PIC OR APIC裡面的(關於APIC,可以看我以前的帖子)。對於X86-32,硬體設備的IRQ於IRQL之間的關系是:IRQL= 27-IRQ。引入IRQL的動機似乎是這樣的:當CPU運行在低IRQL時,如果來了一個高IRQL對應的中斷,那麼低的中斷的ISR是會被高的ISR搶過去的。就是說低的ISR又被一個更高級的ISR中斷了。這樣的好處是優先順序高的ISR可以更快的得到響應。

另外,在具體實現中,由於操作PIC OR APCI改IRQL是比較費時的,所以WINDOWS是盡量不去直接操作硬體,而是等到萬不得已的時候才改。

在LINUX中,似乎沒有類似IRQL這樣的觀念。就我目前看過的書和代碼來看,LINUX中的ISR或者是KERNLE最多是操作下CPU上的中斷標志位(IF)來開啟或者關閉中斷。也就是說,要麼中斷全開,要麼全關。

從這一點來看,LINUX在這部分的設計上比WINDOWS簡單。

5.2 相似之處:

WINDOWS和LINUX似乎都把中斷分成了2部分。在LINUX中叫ISR(還是其他?)和BOTTOM HALF。而WINODWS中,DPC(Deferred Procere Calls)和APC(Asynchronous Procere Calls)就非常類似BOTTOM HALF。二者把中斷分成兩部分的動機是差不多的。都是為了把ISR搞得越快越好。LINUX中,在ISR里一般關中斷,所以時間太長的話,其他中斷就得不到響應。WINDOWS中,ISR跑在一個很高的IRQL裡面,同樣會阻塞其他IRQL比較低的任務。

LINUX中的BOTTOM HALF 又可以分為TASKLET 和SOFIRQ。二者的主要區別是復雜度和並發性(CONCURRENCY)。下面COPY自<UNDERSTANDING LINUX NETWORK INTERNALS>一書。
Tasklet: Only one instance of each tasklet can run at any time. Different tasklets can run concurrently on different CPUs.
Softirq: Only one instance of each softirq can run at the same time on a CPU. However, the same softirq can run on different CPUs concurrentlyOnly one instance of each softirq can run at the same time on a CPU. However, the same softirq can run on different CPUs concurrently.

WINDOWS中的DPC有點類似TASKLET和SOFTIRQ。 DPC是系統范圍內的,並且運行在DPC IRQL。是一個類似中斷上下文的環境(INTERRUPT CONTEXT)。APC和DPC的區別是運行在更低級別的APC IRQL。另外,APC是針對每一個線程的。執行在某個線程環境中。主要目的也是把一部分事情放到以後去執行。APC又分為KERNEL APC 和USER APC。APC這個觀念在LINUX中似乎沒有類似的?至少我還沒想到。

5.3 參考文獻:
1. WINDOWS INTERALS 4TH
2. UNDERSTANDING LINUX NETWORK INTERNALS, 2005

UNICODE VS ASCII
KERNEL 4M/4K MIXED PAGE VS 4K PAGE
FS SEGMENT VS NO FS
GDI VS XWINDOWS
IRP VS FUNCTION POINTER
注冊表 VS 普通文件

Ⅶ Linux內核API完全參考手冊的目錄

前言 本書使用方法第1章 Linux內核API分析必備知識 1Linux內核編程注意事項 1本書中模塊編譯Makefile模板 1內核調試函數printk 2內核編譯與定製 4溫馨提示 10參考文獻 11第2章 Linux內核模塊機制API 12函數:__mole_address ( ) 12函數:__mole_ref_addr ( ) 14函數:__mole_text_address ( ) 16函數:__print_symbol ( ) 18函數:__symbol_get ( ) 20函數:__symbol_put ( ) 22函數:find_mole ( ) 24函數:find_symbol ( ) 27函數:mole_is_live ( ) 30函數:mole_put ( ) 32函數:mole_refcount ( ) 34函數:sprint_symbol ( ) 36函數:symbol_put_addr ( ) 38函數:try_mole_get ( ) 40函數:use_mole ( ) 42參考文獻 44第3章 Linux進程管理內核API 45函數:__task_pid_nr_ns( ) 45函數:find_get_pid( ) 47函數:find_pid _ns( ) 49函數:find_task_by_pid_ns( ) 51函數:find_task_by_pid_type _ns( ) 53函數:find_task_by_vpid( ) 55函數:find_vpid( ) 57函數:get_pid( ) 59函數:get_task_mm( ) 60函數:is_container_init( ) 63函數:kernel_thread( ) 65函數:mmput( ) 67函數:ns_of_pid( ) 69函數:pid_nr( ) 71函數:pid_task( ) 73函數:pid_vnr( ) 75函數:put_pid( ) 77函數:task_active_pid_ns( ) 79函數:task_tgid_nr_ns( ) 81參考文獻 83第4章 Linux進程調度內核API 84函數:__wake_up( ) 84函數:__wake_up_sync( ) 87函數:__wake_up_sync_key( ) 89函數:abort_exclusive_wait( ) 91函數:add_preempt_count( ) 95函數:add_wait_queue( ) 97函數:add_wait_queue_exclusive( ) 100函數:autoremove_wake_function( ) 102函數:complete( ) 106函數:complete_all( ) 108函數:complete_done( ) 111函數:current_thread_info( ) 113函數:default_wake_function( ) 115函數:do_exit( ) 118函數:finish_wait( ) 120函數:init_waitqueue_entry( ) 123函數:init_waitqueue_head( ) 125函數:interruptible_sleep_on( ) 127函數:interruptible_sleep_on_timeout( ) 130函數:preempt_notifier_register ( ) 133函數:preempt_notifier_unregister ( ) 136函數:prepare_to_wait( ) 139函數:prepare_to_wait_exclusive( ) 142函數:remove_wait_queue( ) 146函數:sched_setscheler( ) 149函數:set_cpus_allowed_ptr( ) 152函數:set_user_nice( ) 155函數:sleep_on( ) 158函數:sleep_on_timeout( ) 160函數:sub_preempt_count( ) 162函數:task_nice( ) 164函數:try_wait_for_completion( ) 166函數:wait_for_completion( ) 169函數:wait_for_completion_interruptible( ) 172函數:wait_for_completion_interruptible_ timeout( ) 175函數:wait_for_completion_killable( ) 179函數:wait_for_completion_timeout( ) 182函數:wake_up_process( ) 184函數:yield( ) 187參考文獻 188第5章 Linux中斷機制內核API 189函數:__set_irq_handler( ) 189函數:__tasklet_hi_schele( ) 191函數:__tasklet_schele( ) 194函數:disable_irq( ) 196函數:disable_irq_nosync( ) 196函數:disable_irq_wake( ) 198函數:enable_irq( ) 201函數:enable_irq_wake( ) 203函數:free_irq( ) 205函數:kstat_irqs_cpu( ) 207函數:remove_irq( ) 209函數:request_irq( ) 213函數:request_threaded_irq( ) 216函數:set_irq_chained_handler( ) 219函數:set_irq_chip( ) 221函數:set_irq_chip_data( ) 225函數:set_irq_data( ) 227函數:set_irq_handler( ) 229函數:set_irq_type( ) 232函數:set_irq_wake( ) 234函數:setup_irq( ) 237函數:tasklet_disable( ) 239函數:tasklet_disable_nosync( ) 241函數:tasklet_enable( ) 243函數:tasklet_hi_enable( ) 244函數:tasklet_hi_schele( ) 246函數:tasklet_init( ) 248函數:tasklet_kill( ) 250函數:tasklet_shele( ) 252函數:tasklet_trylock( ) 254函數:tasklet_unlock( ) 255參考文獻 257第6章 Linux內存管理內核API 258函數:__free_pages( ) 258函數:__get_free_pages( ) 258函數:__get_vm_area( ) 260函數:__krealloc( ) 262函數:alloc_pages( ) 265函數:alloc_pages_exact( ) 268函數:alloc_vm_area( ) 270函數:do_brk( ) 272函數:do_mmap( ) 273函數:do_mmap_pgoff( ) 276函數:do_munmap( ) 279函數:find_vma( ) 281函數:find_vma_intersection( ) 284函數:free_pages( ) 286函數:free_pages_exact( ) 287函數:free_vm_area( ) 288函數:get_unmapped_area( ) 288函數:get_user_pages( ) 290函數:get_user_pages_fast( ) 292函數:get_vm_area_size( ) 294函數:get_zeroed_page( ) 295函數:kcalloc( ) 297函數:kfree( ) 299函數:kmalloc( ) 299函數:kmap_high( ) 301函數:kmem_cache_alloc( ) 303函數:kmem_cache_create( ) 305函數:kmem_cache_destroy( ) 308函數:kmem_cache_free( ) 308函數:kmem_cache_zalloc( ) 309函數:kmemp( ) 311函數:krealloc( ) 313函數:ksize( ) 315函數:kstrp( ) 318函數:kstrnp( ) 319函數:kunmap_high( ) 321函數:kzalloc( ) 321函數:memp_user( ) 323函數:mempool_alloc( ) 325函數:mempool_alloc_pages( ) 327函數:mempool_alloc_slab( ) 329函數:mempool_create( ) 331函數:mempool_create_kzalloc_pool ( ) 333函數:mempool_destroy( ) 334函數:mempool_free( ) 335函數:mempool_free_pages( ) 335函數:mempool_free_slab( ) 336函數:mempool_kfree( ) 336函數:mempool_kmalloc( ) 337函數:mempool_kzalloc( ) 339函數:mempool_resize( ) 341函數:nr_free_buffer_pages( ) 343宏:page_address( ) 345宏:page_cache_get( ) 346宏:page_cache_release( ) 348函數:page_zone( ) 349宏:probe_kernel_address( ) 352函數:probe_kernel_read( ) 354函數:probe_kernel_write( ) 355函數:vfree( ) 357函數:vma_pages( ) 358函數:vmalloc( ) 359函數:vmalloc_to_page( ) 361函數:vmalloc_to_pfn( ) 363函數:vmalloc_user( ) 365參考文獻 366第7章 Linux內核定時機制API 368函數:__round_jiffies( ) 368函數:__round_jiffies_relative( ) 369函數:__round_jiffies_up( ) 371函數:__round_jiffies_up_relative( ) 373函數:__timecompare_update( ) 375函數:add_timer( ) 377函數:current_kernel_time( ) 378函數:del_timer( ) 380函數:del_timer_sync( ) 382函數:do_gettimeofday( ) 384函數:do_settimeofday( ) 386函數:get_seconds( ) 388函數:getnstimeofday( ) 390函數:init_timer( ) 391函數:init_timer_deferrable( ) 393函數:init_timer_deferrable_key( ) 395函數:init_timer_key( ) 398函數:init_timer_on_stack( ) 400函數:init_timer_on_stack_key( ) 402函數:mktime( ) 404函數:mod_timer( ) 406函數:mod_timer_pending( ) 408函數:ns_to_timespec( ) 410函數:ns_to_timeval( ) 412函數:round_jiffies( ) 414函數:round_jiffies_relative( ) 416函數:round_jiffies_up( ) 418函數:round_jiffies_up_relative( ) 420函數:set_normalized_timespec( ) 422函數:setup_timer( ) 424函數:setup_timer_key( ) 426函數:setup_timer_on_stack( ) 428函數:setup_timer_on_stack_key( ) 430函數:timecompare_offset( ) 432函數:timecompare_transform( ) 435函數:timecompare_update( ) 436函數:timer_pending( ) 439函數:timespec_add_ns( ) 441函數:timespec_compare( ) 442函數:timespec_equal( ) 444函數:timespec_sub( ) 446函數:timespec_to_ns( ) 448函數:timeval_compare( ) 450函數:timeval_to_ns( ) 452函數:try_to_del_timer_sync( ) 453參考文獻 456第8章 Linux內核同步機制API 457函數:atomic_add( ) 457函數:atomic_add_negative( ) 458函數:atomic_add_return( ) 460函數:atomic_add_unless( ) 461宏:atomic_cmpxchg( ) 463函數:atomic_dec( ) 464函數:atomic_dec_and_test( ) 466函數:atomic_inc( ) 467函數:atomic_inc_and_test( ) 469宏:atomic_read( ) 470宏:atomic_set( ) 471函數:atomic_sub( ) 472函數:atomic_sub_and_test( ) 474函數:atomic_sub_return( ) 475函數:down( ) 477函數:down_interruptible( ) 479函數:down_killable( ) 481函數:down_read( ) 483函數:down_read_trylock( ) 485函數:down_timeout( ) 487函數:down_trylock( ) 489函數:down_write( ) 491函數:down_write_trylock( ) 492函數:downgrade_write( ) 494宏:init_rwsem( ) 496宏:read_lock( ) 498函數:read_seqbegin( ) 499函數:read_seqretry( ) 500宏:read_trylock( ) 503宏:read_unlock( ) 504宏:rwlock_init( ) 505函數:sema_init( ) 508宏:seqlock_init( ) 509宏:spin_can_lock( ) 511宏:spin_lock( ) 513宏:spin_lock_bh( ) 514宏:spin_lock_init ( ) 516宏:spin_lock_irq( ) 518宏:spin_lock_irqsave( ) 520宏:spin_trylock( ) 522宏:spin_unlock( ) 525宏:spin_unlock_bh( ) 526宏:spin_unlock_irq( ) 526宏:spin_unlock_irqrestore( ) 527宏:spin_unlock_wait( ) 527函數:up( ) 529函數:up_read( ) 531函數:up_write( ) 532宏:write_lock( ) 532函數:write_seqlock( ) 534函數:write_sequnlock( ) 534宏:write_trylock( ) 535宏:write_unlock( ) 537參考文獻 537第9章 Linux文件系統內核API 539函數:__mnt_is_readonly( ) 539函數:current_umask( ) 541函數:d_alloc( ) 542函數:d_alloc_root( ) 544函數:d_delete( ) 547函數:d_find_alias( ) 547函數:d_invalidate( ) 549函數:d_move( ) 550函數:d_validate( ) 551函數:dput( ) 553函數:fget( ) 554函數:find_inode_number( ) 557函數:generic_fillattr( ) 559函數:get_empty_filp( ) 561函數:get_fs_type( ) 563函數:get_max_files( ) 565函數:get_super( ) 566函數:get_unused_fd( ) 569函數:have_submounts( ) 570函數:I_BDEV( ) 572函數:iget_locked( ) 573函數:inode_add_bytes( ) 575函數:inode_get_bytes( ) 576函數:inode_needs_sync( ) 578函數:inode_set_bytes( ) 580函數:inode_setattr( ) 581函數:inode_sub_bytes( ) 584函數:invalidate_inodes( ) 586函數:is_bad_inode( ) 587函數:make_bad_inode( ) 588函數:may_umount( ) 590函數:may_umount_tree( ) 591函數:mnt_pin( ) 593函數:mnt_unpin( ) 594函數:mnt_want_write( ) 596函數:new_inode( ) 596函數:notify_change( ) 598函數:put_unused_fd( ) 600函數:register_filesystem( ) 602函數:unregister_filesystem( ) 604函數:unshare_fs_struct( ) 604函數:vfs_fstat( ) 606函數:vfs_getattr( ) 608函數:vfs_statfs( ) 610參考文獻 613第10章 Linux設備驅動及設備管理API 614函數:__class_create( ) 614函數:__class_register( ) 615函數:cdev_add( ) 616函數:cdev_alloc( ) 617函數:cdev_del( ) 619函數:cdev_init( ) 624宏:class_create( ) 628函數:class_destroy( ) 629宏:class_register( ) 631函數:class_unregister( ) 632函數:device_add( ) 637函數:device_create( ) 638函數: device_del( ) 640函數:device_destroy( ) 640函數:device_initialize( ) 646函數:device_register( ) 652函數:device_rename( ) 652函數:device_unregister( ) 657函數:get_device( ) 663函數:put_device( ) 663函數:register_chrdev( ) 667函數:register_keyboard_notifier( ) 668函數:unregister_chrdev( ) 669函數:unregister_keyboard_notifier( ) 675部分相關函數說明 679參考文獻 679附錄 Linux內核API快速檢索表 680

閱讀全文

與linux內核api參考手冊相關的資料

熱點內容
電氣控制與可編程式控制制器pdf 瀏覽:83
cad圖紙不能跨文件夾粘貼 瀏覽:252
學生雲伺服器主機 瀏覽:883
單片機狀態周期 瀏覽:620
lua中的android 瀏覽:441
加密貴還是植發貴 瀏覽:662
陽光壓縮機繼電器 瀏覽:969
修改阿里雲伺服器密碼 瀏覽:815
lk4102加密晶元 瀏覽:588
怎麼更改app店面 瀏覽:489
設備部門如何做好伺服器 瀏覽:849
androido下載 瀏覽:478
神奇高量戰法副圖源碼 瀏覽:830
匯編語言設計凱撒密碼加密器 瀏覽:392
主次梁加密是加在哪裡 瀏覽:664
模板匹配演算法matlab 瀏覽:825
外地程序員去北京 瀏覽:24
安卓機換蘋果12如何轉移數據 瀏覽:420
互聯網ntp伺服器地址及埠 瀏覽:613
pdf到word轉換器 瀏覽:269