Linux操作系統(tǒng)與應(yīng)用 第一章_第1頁(yè)
Linux操作系統(tǒng)與應(yīng)用 第一章_第2頁(yè)
Linux操作系統(tǒng)與應(yīng)用 第一章_第3頁(yè)
Linux操作系統(tǒng)與應(yīng)用 第一章_第4頁(yè)
Linux操作系統(tǒng)與應(yīng)用 第一章_第5頁(yè)
已閱讀5頁(yè),還剩49頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第一章操作系統(tǒng)概述認(rèn)識(shí)操作系統(tǒng)操作系統(tǒng)的發(fā)展開(kāi)放源代碼的Unix/Linux操作系統(tǒng)Linux內(nèi)核Linux內(nèi)核源代碼

Linux

內(nèi)核模塊編程入門(mén)Linux

內(nèi)核中鏈表的實(shí)現(xiàn)及應(yīng)用不同角度看到的操作系統(tǒng)操作系統(tǒng)整體看操作系統(tǒng)設(shè)計(jì)者使用者普通開(kāi)發(fā)者認(rèn)識(shí)操作系統(tǒng)打開(kāi)計(jì)算機(jī),首先跳入眼簾的是什么?要拷貝一個(gè)文件,具體的拷貝操作是誰(shuí)完成的?你需要知道文件存放在何處嗎?柱面、磁道、扇區(qū)描述什么?數(shù)據(jù)的搬動(dòng)過(guò)程怎樣進(jìn)行繁瑣留給自己,簡(jiǎn)單留給用戶(hù)

操作系統(tǒng)穿上華麗的外衣-圖形界面操作系統(tǒng)穿上樸素的外衣-字符界面<>認(rèn)識(shí)操作系統(tǒng)-從使用者的角度看拷貝命令的C語(yǔ)言實(shí)現(xiàn)片斷<>inf=open(“/floppy/TEST”,O_RDONLY,0);out=open(“/mydir/test”,O_WRONLY,0600);do{l=read(inf,buf,4096);write(outf,buf,l);}while(l);close(outf);close(inf);認(rèn)識(shí)操作系統(tǒng)-從程序開(kāi)發(fā)者的角度看

<>瀏覽器信息管理文件管理系統(tǒng)游戲

編譯程序編輯程序命令解釋程序

操作系統(tǒng)

CPU、內(nèi)存、I/O接口硬件內(nèi)核認(rèn)識(shí)操作系統(tǒng)-從所處位置看操作系統(tǒng)是其它所有用戶(hù)程序運(yùn)行的基礎(chǔ)。

<>#include<stdio.h>main(){printf(“Helloworld\n”)}用戶(hù)告訴操作系統(tǒng)執(zhí)行test程序操作系統(tǒng)通過(guò)文件名找到該程序檢查其類(lèi)型,檢查程序首部,找出代碼和數(shù)據(jù)存放的地址文件系統(tǒng)找到第一個(gè)磁盤(pán)塊操作系統(tǒng)建立程序的執(zhí)行環(huán)境操作系統(tǒng)把程序從磁盤(pán)裝入內(nèi)存,并跳到程序開(kāi)始處執(zhí)行該程序的執(zhí)行過(guò)程簡(jiǎn)述如下:操作系統(tǒng)檢查字符串的位置是否正確操作系統(tǒng)找到字符串被送往的設(shè)備操作系統(tǒng)將字符串送往輸出設(shè)備窗口系統(tǒng)確定這是一個(gè)合法的操作,然后將字符串轉(zhuǎn)換成像素窗口系統(tǒng)將像素寫(xiě)入存儲(chǔ)映像區(qū)視頻硬件將像素表示轉(zhuǎn)換成一組模擬信號(hào)控制顯示器(重畫(huà)屏幕)顯示器發(fā)射電子束。你在屏幕上看到Helloworld。從中看到什么認(rèn)識(shí)操作系統(tǒng)-從程序執(zhí)行看從操作系統(tǒng)設(shè)計(jì)者的角度看操作系統(tǒng)的設(shè)計(jì)目標(biāo)是什么?盡可能地方便用戶(hù)使用計(jì)算機(jī)讓各種軟件資源和硬件資源高效而協(xié)調(diào)地運(yùn)轉(zhuǎn)起來(lái)。計(jì)算機(jī)的硬件資源和軟件資源各指什么?假設(shè)在一臺(tái)計(jì)算機(jī)上有三道程序同時(shí)運(yùn)行,并試圖在一臺(tái)打印機(jī)上輸出運(yùn)算結(jié)果,必須考慮哪些問(wèn)題?從操作系統(tǒng)設(shè)計(jì)者的角度考慮,一個(gè)操作系統(tǒng)必須包含以下幾部分操作系統(tǒng)接口CPU管理內(nèi)存管理設(shè)備管理文件管理<>認(rèn)識(shí)操作系統(tǒng)-從設(shè)計(jì)者角度看操作系統(tǒng)是計(jì)算機(jī)系統(tǒng)中的一個(gè)系統(tǒng)軟件,是一些程序模塊的集合——它們能以盡量有效、合理的方式組織和管理計(jì)算機(jī)的軟硬件資源,合理的組織計(jì)算機(jī)的工作流程,控制程序的執(zhí)行并向用戶(hù)提供各種服務(wù)功能,使得用戶(hù)能夠靈活、方便、有效的使用計(jì)算機(jī),使整個(gè)計(jì)算機(jī)系統(tǒng)能高效、順暢地運(yùn)行。<>認(rèn)識(shí)操作系統(tǒng)-定義<>操作系統(tǒng)的組成(1)

通常意義上的操作系統(tǒng)被認(rèn)為是整個(gè)系統(tǒng)中負(fù)責(zé)完成最基本的功能和系統(tǒng)管理的部分。除了內(nèi)核,這些部分還應(yīng)該包括啟動(dòng)引導(dǎo)程序、命令行shell或者其他種類(lèi)的用戶(hù)界面、基本的文件管理工具和系統(tǒng)工具等。實(shí)際上,人們?cè)诘玫讲僮飨到y(tǒng)的同時(shí),更需要的是構(gòu)架于其上的應(yīng)用軟件,從而完成所需的實(shí)際功能。為此,操作系統(tǒng)一般要和應(yīng)用軟件綁定發(fā)行和出售。這樣的軟件包在linux領(lǐng)域被稱(chēng)作發(fā)布版。

<>操作系統(tǒng)的組成(2)

從開(kāi)發(fā)者的角度看,操作系統(tǒng)本質(zhì)上是大型軟件包,因此結(jié)構(gòu)組織不會(huì)與其它大型軟件迥異:操作系統(tǒng)的設(shè)計(jì)采用分層結(jié)構(gòu),越向上層抽象程度越高,越接近用戶(hù);越向下層,越靠近硬件,抽象也越接近硬件。上層軟件依靠下層軟件提供的服務(wù),而且上層軟件自身還提供附加服務(wù)。因此,操作系統(tǒng)的結(jié)構(gòu)整體總體呈現(xiàn)倒金字塔形。用一組簡(jiǎn)單的公式描述操作系統(tǒng)的組成要素:操作系統(tǒng)=內(nèi)核+系統(tǒng)程序系統(tǒng)程序=編譯環(huán)境+API(應(yīng)用程序接口)+AUI(用戶(hù)接口)編譯環(huán)境=編譯程序+鏈接程序+裝載程序API=shell+系統(tǒng)服務(wù)例程+應(yīng)用程序?qū)τ谡麄€(gè)軟件系統(tǒng):軟件系統(tǒng)=操作系統(tǒng)+AUI操作系統(tǒng)的演變單道批處理系統(tǒng)

串行執(zhí)行預(yù)先組織好的一組任務(wù)

提高了系統(tǒng)效率。多道批處理系統(tǒng)可以交錯(cuò)運(yùn)行多個(gè)程序再次提高系統(tǒng)效率。分時(shí)系統(tǒng)將處理器的運(yùn)行時(shí)間分成數(shù)片,均分或依照一定權(quán)重派發(fā)給系統(tǒng)中的用戶(hù)使用

快速響應(yīng)

<>操作系統(tǒng)的發(fā)展硬件角度下的操作系發(fā)展軌跡年

特點(diǎn)

操作系統(tǒng)特點(diǎn)

機(jī)械計(jì)算機(jī)時(shí)代17世紀(jì)~20世紀(jì)初

1)純機(jī)械結(jié)構(gòu),低速

2)只能進(jìn)行簡(jiǎn)單的數(shù)學(xué)運(yùn)算

純手工操作

從計(jì)算尺至差分機(jī)到分析機(jī)發(fā)展了數(shù)百年第一代計(jì)算機(jī)

1946年~50年代末電子管計(jì)算機(jī)

1)體積大、能耗高、故障多、價(jià)格貴

2)難以普及應(yīng)用

無(wú)操作系統(tǒng)

(程序按機(jī)器碼編寫(xiě),載體從插件板到卡片與紙帶)

1906年發(fā)明電子管

1946ENIAC研制成功

(第一臺(tái)電子管計(jì)算機(jī))年

特點(diǎn)

操作系統(tǒng)特點(diǎn)

第二代計(jì)算機(jī)

50年代末~60年代中期

晶體管計(jì)算機(jī)

1)采用印刷電路

2)穩(wěn)定性與可靠性大大提高

3)批量生產(chǎn)成為可能

4)進(jìn)入實(shí)際應(yīng)用領(lǐng)域但數(shù)量有限1)單道批處理系統(tǒng)

2)操作系統(tǒng)以監(jiān)督軟件形式出現(xiàn)

3)任務(wù)按順序方式處理

1947年發(fā)明晶體管

第三代計(jì)算機(jī)

60年代中期~70年代初

集成電路計(jì)算機(jī)

1)體積減小,性?xún)r(jià)比迅速提高

2)小型計(jì)算機(jī)發(fā)展迅速

3)進(jìn)入商業(yè)應(yīng)用

4)尚不適合家庭應(yīng)用的需求1)涌現(xiàn)大批操作系統(tǒng)

多道批處理系統(tǒng)、分時(shí)系統(tǒng)和實(shí)時(shí)系統(tǒng)

2)奠定了現(xiàn)代操作系統(tǒng)的基本框架

1958年發(fā)明集成電路

1971年INTEL發(fā)明微處理器

硬件角度下的操作系統(tǒng)發(fā)展軌跡分析在硬件的性?xún)r(jià)比較低的時(shí)候,操作系統(tǒng)設(shè)計(jì)追求什么?

在硬件性?xún)r(jià)比越來(lái)越高后,操作系統(tǒng)的設(shè)計(jì)開(kāi)始追求的目標(biāo)是什么?計(jì)算機(jī)開(kāi)始普及后,操作系統(tǒng)的設(shè)計(jì)開(kāi)始追求?從第三代到第四代計(jì)算機(jī),操作系統(tǒng)的發(fā)展逐漸擺脫追隨硬件發(fā)展的狀況,形成自己的理論體系進(jìn)入第四代系統(tǒng)后,分布式系統(tǒng)和多處理器系統(tǒng)雖然極大的擴(kuò)充了操作系統(tǒng)理論,但系統(tǒng)結(jié)構(gòu)并沒(méi)有變化,只是各功能模塊得以進(jìn)一步完善。<>操作系統(tǒng)的發(fā)展硬件角度下操作系統(tǒng)發(fā)展的分析<>主流操作系統(tǒng)

系統(tǒng)特點(diǎn)

計(jì)算機(jī)語(yǔ)言背

無(wú)

手工操作

無(wú)編程語(yǔ)言直接使用機(jī)器代碼

1936年圖靈提出圖靈機(jī)

單道批處理系統(tǒng)

作業(yè)運(yùn)行的監(jiān)督程序

編程語(yǔ)言雛形期

1957年FORTRAN語(yǔ)言開(kāi)發(fā)成功多道批處理

分時(shí)系統(tǒng)

實(shí)時(shí)系統(tǒng)

多處理系統(tǒng)

操作系統(tǒng)結(jié)構(gòu)確立,分為處理機(jī)管理、內(nèi)存管理、設(shè)備管理、文件管理等模塊

1)編程語(yǔ)言大量涌現(xiàn)

2)結(jié)構(gòu)化程序設(shè)計(jì)

3)C語(yǔ)言逐漸

60年代的軟件危機(jī)導(dǎo)致軟件工程的發(fā)展

1969年Unix誕生

1972年C語(yǔ)言推出

主流操作系統(tǒng)

系統(tǒng)特點(diǎn)

計(jì)算機(jī)語(yǔ)言背

類(lèi)Unix系列

WINDOWS系列

人機(jī)交互成為主題

1)可視化界面

2)多媒體技

面向?qū)ο笳Z(yǔ)言成為主流

80年代中期開(kāi)始面向?qū)ο蠹夹g(shù)逐步發(fā)展網(wǎng)絡(luò)操作系統(tǒng)

分布式操作系統(tǒng)微內(nèi)核技術(shù)興起

1)JAVA語(yǔ)言

2)腳本語(yǔ)言興起1995年JAVA推出

嵌入式系統(tǒng)

單內(nèi)核與微內(nèi)核競(jìng)爭(zhēng)激烈編程工具向跨平臺(tái)方向發(fā)

1991年免費(fèi)的操作系統(tǒng)Linux發(fā)布

軟件角度下的操作系統(tǒng)發(fā)展軌跡

分析程序設(shè)計(jì)理論約束著操作系統(tǒng)設(shè)計(jì)。操作系統(tǒng)的發(fā)展滯后于計(jì)算機(jī)語(yǔ)言的發(fā)展,從結(jié)構(gòu)化設(shè)計(jì)到對(duì)象化設(shè)計(jì),操作系統(tǒng)總是最后應(yīng)用新編程理論的軟件之一。至今操作系統(tǒng)對(duì)于是否需要徹底對(duì)象化(即微內(nèi)核化),還處于徘徊時(shí)期,仍在探索單內(nèi)核與微內(nèi)核的最佳結(jié)合方式。人機(jī)交互技術(shù)主要是為用戶(hù)考慮,這是對(duì)操作系統(tǒng)設(shè)計(jì)進(jìn)行的變革。以Linux為代表的開(kāi)源軟件的出現(xiàn),打破了帶有神秘色彩的傳統(tǒng)的封閉式開(kāi)發(fā)模式。<>軟件角度下的操作系統(tǒng)發(fā)展軌跡分析

<>講究效率的單模塊操作系統(tǒng)進(jìn)程管理內(nèi)存管理設(shè)備管理文件管理模塊之間可以互相調(diào)用的單模塊結(jié)構(gòu)<>講究效率的單模塊操作系統(tǒng)模塊之間直接調(diào)用函數(shù),除了函數(shù)調(diào)用的開(kāi)銷(xiāo)外,沒(méi)有額外開(kāi)銷(xiāo)。龐大的操作系統(tǒng)有數(shù)以千計(jì)的函數(shù)復(fù)雜的調(diào)用關(guān)系勢(shì)必導(dǎo)致操作系統(tǒng)維護(hù)的困難<>追求簡(jiǎn)潔的微內(nèi)核操作系統(tǒng)客戶(hù)進(jìn)程進(jìn)程服務(wù)器內(nèi)存服務(wù)器文件服務(wù)器…微內(nèi)核<>追求簡(jiǎn)潔的微內(nèi)核操作系統(tǒng)內(nèi)核與各個(gè)服務(wù)器之間通過(guò)通信機(jī)制進(jìn)行交互,這使得微內(nèi)核結(jié)構(gòu)的效率大大折扣。內(nèi)核發(fā)出請(qǐng)求,服務(wù)器做出應(yīng)答為各個(gè)服務(wù)器模塊的相對(duì)獨(dú)立性,使得其維護(hù)相對(duì)容易<>歷史悠久的Unix在MULTICS(1969)的肩上制研制者KenThompson和DennisM.Ritchie

Unix的誕生還伴有C語(yǔ)言呱呱落地Unix是現(xiàn)代操作系統(tǒng)的代表:安全、可靠、強(qiáng)大的計(jì)算能力Unix的商業(yè)化是一把雙刃劍

<>自由而奔放的黑馬-Linux誕生于學(xué)生之手成長(zhǎng)于Internet壯大于自由而開(kāi)放的文化<>Linux之父-LinusTorvalds芬蘭、赫爾辛基大學(xué)、1990起始于寫(xiě)兩個(gè)進(jìn)程然后寫(xiě)驅(qū)動(dòng)程序、文件系統(tǒng)、任務(wù)切換程序,從而形成一個(gè)操作系統(tǒng)鄒形<>Linux得以流行的原因之一

-遵循POSIX標(biāo)準(zhǔn)POSIX表示可移植操作系統(tǒng)接口(PortableOperatingSystemInterface)

POSIX是在Unix標(biāo)準(zhǔn)化過(guò)程中出現(xiàn)的產(chǎn)物。

POSIX1003.1標(biāo)準(zhǔn)定義了一個(gè)最小的Unix操作系統(tǒng)接口

任何操作系統(tǒng)只有符合這一標(biāo)準(zhǔn),才有可能運(yùn)行Unix程序

<>Linux的肥沃土壤-GNUGNU是GNUIsNotUnix的遞歸縮寫(xiě),是自由軟件基金會(huì)的一個(gè)項(xiàng)目

。

GNU項(xiàng)目產(chǎn)品包括emacs編輯器、著名的GNUC和Gcc編譯器等,這些軟件叫做GNU軟件。GNU軟件和派生工作均適用GNU通用公共許可證,即GPL(GeneralPublicLicense

)Linux的開(kāi)發(fā)使用了眾多的GUN工具<>GPL-開(kāi)源軟件的法律GPL允許軟件作者擁有軟件版權(quán)但GPL規(guī)定授予其他任何人以合法復(fù)制、發(fā)行和修改軟件的權(quán)利。<>Linux系統(tǒng)或發(fā)布版

符合POSIX標(biāo)準(zhǔn)的操作系統(tǒng)內(nèi)核、Shell和外圍工具。C語(yǔ)言編譯器和其他開(kāi)發(fā)工具及函數(shù)庫(kù)XWindow窗口系統(tǒng)各種應(yīng)用軟件,包括字處理軟件、圖象處理軟件等。<>開(kāi)放與協(xié)作的開(kāi)發(fā)模式

世界各地軟件愛(ài)好者集體智慧的結(jié)晶提供源代碼,遵守GPL。經(jīng)歷了各種各樣的測(cè)試與考驗(yàn),軟件的穩(wěn)定性好。開(kāi)發(fā)人員憑興趣去開(kāi)發(fā),熱情高,具有創(chuàng)造性。<>Linux內(nèi)核

Linus領(lǐng)導(dǎo)下的開(kāi)發(fā)小組開(kāi)發(fā)出的系統(tǒng)內(nèi)核

是所有Linux發(fā)布版本的核心

內(nèi)核開(kāi)發(fā)人員一般在百人以上,任何自由程序員都可以提交自己的修改工作。

采用郵件列表來(lái)進(jìn)行項(xiàng)目管理、交流、錯(cuò)誤報(bào)告有大量的用戶(hù)進(jìn)行測(cè)試,正式發(fā)布的代碼質(zhì)量高

<>Linux內(nèi)核的技術(shù)特點(diǎn)

linux內(nèi)核被設(shè)計(jì)成單內(nèi)核結(jié)構(gòu),這是相對(duì)微內(nèi)核而言的

2.6版本以前的linux內(nèi)核是單線程結(jié)構(gòu),是非搶占式的內(nèi)核結(jié)構(gòu)linux內(nèi)核支持動(dòng)態(tài)加載內(nèi)核模塊

Linux內(nèi)核被動(dòng)地提供服務(wù)linux內(nèi)核采用了虛擬內(nèi)存技術(shù),使得內(nèi)存空間達(dá)到4GBlinux文件系統(tǒng)實(shí)現(xiàn)了一種UNIX風(fēng)格的抽象文件模型——虛擬文件系統(tǒng)(VirtualFilesystermSwitch,VFS)linux提供了一套很有效的延遲機(jī)制——下半部分、軟中斷tasklet和2.6版本新引進(jìn)的工作隊(duì)列等。<>整個(gè)系統(tǒng)的核心-內(nèi)核

硬件系統(tǒng)調(diào)用接口應(yīng)用程序進(jìn)程1應(yīng)用程序進(jìn)程2應(yīng)用程序進(jìn)程3Linux內(nèi)核用戶(hù)進(jìn)程

內(nèi)核子系統(tǒng)系統(tǒng)調(diào)用<>整個(gè)系統(tǒng)的核心-內(nèi)核

用戶(hù)進(jìn)程—運(yùn)行在Linux內(nèi)核之上的一個(gè)龐大軟件集合。系統(tǒng)調(diào)用—內(nèi)核的出口,用戶(hù)程序通過(guò)它使用內(nèi)核提供的功能。

Linux內(nèi)核—操作系統(tǒng)的靈魂,負(fù)責(zé)管理磁盤(pán)上的文件、內(nèi)存,負(fù)責(zé)啟動(dòng)并運(yùn)行程序,負(fù)責(zé)從網(wǎng)絡(luò)上接收和發(fā)送數(shù)據(jù)包等等。硬件—包括了Linux安裝時(shí)需要的所有可能的物理設(shè)備。例如,CPU、內(nèi)存、硬盤(pán)、網(wǎng)絡(luò)硬件等等。<>內(nèi)核子系統(tǒng)<>內(nèi)核子系統(tǒng)進(jìn)程調(diào)度-控制著進(jìn)程對(duì)CPU的訪問(wèn)。內(nèi)存管理-允許多個(gè)進(jìn)程安全地共享主內(nèi)存區(qū)域虛擬文件系統(tǒng)-隱藏各種不同硬件的具體細(xì)節(jié),為所有設(shè)備提供統(tǒng)一的接口。網(wǎng)絡(luò)-提供了對(duì)各種網(wǎng)絡(luò)標(biāo)準(zhǔn)協(xié)議的存取和各種網(wǎng)絡(luò)硬件的支持。進(jìn)程間通信(IPC)-支持進(jìn)程間各種通信機(jī)制,包括共享內(nèi)存、消息隊(duì)列及管道等。Linux內(nèi)核版本樹(shù)

0.01

Linux(第一版)

0.13版

|

產(chǎn)品化版本

實(shí)驗(yàn)版本

1.0.0

1.1.0(1.0.0的拷貝)

1.0.X(修改)

1.1.X(增加新功能,進(jìn)行測(cè)試)

1.1.95(成為1.2.0)內(nèi)核源代碼結(jié)構(gòu)Linux內(nèi)核源代碼分析工具

Linux超文本交叉代碼檢索工具

http://lxr.linux.no/

Windows平臺(tái)下的源代碼閱讀工具SourceInsightLinux內(nèi)核模塊編程入門(mén)

認(rèn)識(shí)內(nèi)核模塊

內(nèi)核模塊是linux內(nèi)核向外部提供的一個(gè)插口,是內(nèi)核的一部分,但是并沒(méi)有被編譯到內(nèi)核里面去,其全稱(chēng)為動(dòng)態(tài)可加載內(nèi)核模塊(LoadableKernelModule,LKM),簡(jiǎn)稱(chēng)模塊。為什么要使用模塊?

linux內(nèi)核之所以提供模塊機(jī)制,是因?yàn)樗旧硎且粋€(gè)單內(nèi)核。而單內(nèi)核的最大優(yōu)點(diǎn)就是效率高,因?yàn)樗械膬?nèi)容都集成在一起,但其缺點(diǎn)是可擴(kuò)展性和可維護(hù)性相對(duì)較差,模塊機(jī)制就是為了彌補(bǔ)這一缺陷。Linux內(nèi)核模塊編程入門(mén)

模塊的定義

模塊是具有獨(dú)立功能的程序,它可以被單獨(dú)編譯,但不能獨(dú)立運(yùn)行。它在運(yùn)行時(shí)被鏈接到內(nèi)核作為內(nèi)核的一部分在內(nèi)核空間運(yùn)行,這與運(yùn)行在用戶(hù)空間的進(jìn)程是不同的。模塊通常由一組函數(shù)和數(shù)據(jù)結(jié)構(gòu)組成,用來(lái)實(shí)現(xiàn)一種文件系統(tǒng)、一個(gè)驅(qū)動(dòng)程序或者其他內(nèi)核上層的功能。編寫(xiě)簡(jiǎn)單的內(nèi)核模塊

模塊和內(nèi)核都在內(nèi)核空間運(yùn)行,模塊編程在一定意義上說(shuō)就是內(nèi)核編程。一個(gè)內(nèi)核模塊應(yīng)該至少有兩個(gè)函數(shù),第一個(gè)為module_init(),是模塊加載函數(shù),當(dāng)模塊被插入到內(nèi)核時(shí)調(diào)用它;第二個(gè)為module_exit(),是模塊卸載函數(shù),當(dāng)模塊從內(nèi)核移走時(shí)調(diào)用它。Linux內(nèi)核模塊編程入門(mén)

簡(jiǎn)單的內(nèi)核模塊實(shí)例:

任何模塊都要包含的三個(gè)頭文件:#include<linux/module.h>#include<linux/kernel.h>#incldue<linux/init.h>說(shuō)明:module.h頭文件包含了對(duì)模塊的版本控制;kernel.h包含了常用的內(nèi)核函數(shù);init.h包含了宏__init和__exit,宏__init告訴編譯程序相關(guān)的函數(shù)和變量?jī)H用于初始化,編譯程序?qū)?biāo)有__init的所有代碼存儲(chǔ)到特殊的內(nèi)存段中,初始化結(jié)束就釋放這段內(nèi)存。在此使用了printk()函數(shù),該函數(shù)是由內(nèi)核定義的,功能和C庫(kù)中的printf()類(lèi)似,它把要打印的日志輸出到終端或系統(tǒng)日志。字符串中的<1>是輸出的級(jí)別,表示立即在終端輸出。Linux內(nèi)核模塊編程入門(mén)

內(nèi)核模塊的Makefile文件

內(nèi)核模塊不是獨(dú)立的可執(zhí)行文件,但在運(yùn)行時(shí)其目標(biāo)文件被鏈接到內(nèi)核中。只有超級(jí)用戶(hù)才能加載和卸載模塊。給前面的程序起名叫module_example.c,那么其對(duì)應(yīng)的Makefile文件的基本內(nèi)容如下:obj-m:=這個(gè)賦值語(yǔ)句的含義是說(shuō)明要使用目標(biāo)文件module_example.o建立一個(gè)模塊,最后生成的模塊名為module_example.ko。.o文件是經(jīng)過(guò)編譯和匯編,而沒(méi)有經(jīng)過(guò)鏈接的中間文件。注:makefile文件中,若某一行是命令,則它必須以一個(gè)Tab鍵開(kāi)頭。Linux內(nèi)核模塊編程入門(mén)

運(yùn)行代碼當(dāng)編譯好模塊,就可以用insmod命令將新的模塊插入到內(nèi)核中,如:

insmodmodule_example.ko然后,可以用lsmod命令查看模塊是否正確地插入到了內(nèi)核中。模塊的輸出由printk()產(chǎn)生。該函數(shù)默認(rèn)打印系統(tǒng)文件/var/log/messages的內(nèi)容。卸載模塊時(shí),使用rmmod命令加上在insmod中看到的模塊名,就可以從內(nèi)核中移除該模塊:

rmmodmodule_exampleLinux內(nèi)核模塊編程入門(mén)

應(yīng)用程序與內(nèi)核模塊的比較

C語(yǔ)言應(yīng)用程序內(nèi)核模塊程序使用函數(shù)Libc庫(kù)內(nèi)核函數(shù)運(yùn)行空間用戶(hù)空間內(nèi)核空間運(yùn)行權(quán)限普通用戶(hù)超級(jí)用戶(hù)入口函數(shù)main()module_init()出口函數(shù)exit()module_cleanup()編譯gcc–cmake連接gccinsmod運(yùn)行直接運(yùn)行insmod調(diào)試gdbkdbug,kdb,kgdb等Linux內(nèi)核中鏈表的實(shí)現(xiàn)及應(yīng)用為什么要用鏈表?①與數(shù)組相比,鏈表中可以動(dòng)態(tài)插入或刪除元素,在編譯時(shí)不必知道要?jiǎng)?chuàng)建的元素個(gè)數(shù)。②在內(nèi)存無(wú)需占用連續(xù)的內(nèi)存單元。③每個(gè)元素都包含一個(gè)指向下一個(gè)元素的指針,當(dāng)有元素加入鏈表或者從鏈表中刪除元素時(shí),只需要調(diào)整下一個(gè)節(jié)點(diǎn)的指針就可以了。Linux內(nèi)核中鏈表的實(shí)現(xiàn)及應(yīng)用通過(guò)前趨(prev)和后繼(next)兩個(gè)指針域,就可以從兩個(gè)方向遍歷雙鏈表,這使得遍歷鏈表的代價(jià)減少。鏈表的演化

在C語(yǔ)言中,一個(gè)基本的雙向鏈表定義如下:structmy_list{ void*mydata; structmy_list*next; structmy_list*prev; };Linux內(nèi)核中鏈表的實(shí)現(xiàn)及應(yīng)用鏈表的定義linux內(nèi)核對(duì)鏈表的實(shí)現(xiàn)方式與眾不同,不是在鏈表中包含數(shù)據(jù),而是在數(shù)據(jù)結(jié)構(gòu)中包含鏈表。其具體的定義如下:

structlist_head{

structlist_head*next,*prev;

};這個(gè)不含數(shù)據(jù)結(jié)構(gòu)的通用雙向鏈表可以嵌入到任何結(jié)構(gòu)中。說(shuō)明:1.list域隱藏了鏈表的指針特性2.structlist_head可以位于結(jié)構(gòu)的任何位置,可以給其起任何名字3.在一個(gè)結(jié)構(gòu)中可以有多個(gè)list域

以structlist_head為基本對(duì)象,可以對(duì)鏈表進(jìn)行插入、刪除、合并以及遍歷等各種操作。

Linux內(nèi)核中鏈表的實(shí)現(xiàn)及應(yīng)用鏈表的聲明和初始化structlist_head只定義了鏈表節(jié)點(diǎn),并沒(méi)有專(zhuān)門(mén)定義鏈表頭,那么一個(gè)鏈表結(jié)構(gòu)是如何建立起來(lái)的??jī)?nèi)核代碼list.h中定義了兩個(gè)宏:#defineLIST_HEAD_INIT(name){&(name),&(name)}/*僅初始化*/#defineLIST_HEAD(name)structlist_headname= LIST_HEAD_INIT(name)

/*聲明并初始化*/

當(dāng)我們調(diào)用LIST_HEAD(name)聲明一個(gè)名為name的鏈表頭時(shí),它的next和prev指針都初始化指向自己。這樣,我們就有了一個(gè)空鏈表,因?yàn)閘inux用頭指針的next是否指向自己來(lái)判斷鏈表是否為空:staticinlineintlist_empty(conststructlist_head*head){

returnhead->next==head;}Linux內(nèi)核中鏈表的實(shí)現(xiàn)及應(yīng)用在鏈表中增加一個(gè)節(jié)點(diǎn)在include/linux/list.h中增加結(jié)點(diǎn)的函數(shù)為:

staticinlinevoidlist_add();staticinlinevoidlist_add_tail();

在內(nèi)核代碼中,函數(shù)名前加兩個(gè)下劃線表示內(nèi)部函數(shù)。list_add()和list_add_tail()均調(diào)用__list_add()真正實(shí)現(xiàn)頭插和尾插。staticinlinevoid__list_add(structlist_head*new,structlist_head*prev,structlist_head*next){next->prev=new;new->next=next;new->prev=prev;prev->next=new;}staticinlinevoidlist_add(structlist_head*new,

structlist_head*head){__list_add(new,head,head->next);}該函數(shù)向指定鏈表的head結(jié)點(diǎn)后插入new結(jié)點(diǎn)。因?yàn)槭茄h(huán)鏈表,而且通常沒(méi)有首尾結(jié)點(diǎn)的概念,所以可以將任何結(jié)點(diǎn)傳給head。若傳最后一個(gè)元素給head,該函數(shù)就可以實(shí)現(xiàn)一個(gè)棧。Linux內(nèi)核中鏈表的實(shí)現(xiàn)及應(yīng)用

list_add_tail()的內(nèi)核實(shí)現(xiàn):

staticinlinevoidlist_add_tail(structlist_head*new,structlist_head*head){__list_add(new,head->prev,head);}

list_add_tail()函數(shù)向指定鏈表的head結(jié)點(diǎn)前插入new結(jié)點(diǎn)。說(shuō)明:關(guān)于staticinline關(guān)鍵字。

“static”加在函數(shù)前,表示這個(gè)函數(shù)是靜態(tài)函數(shù),所謂靜態(tài)函數(shù),實(shí)際上是對(duì)函數(shù)作用域的限制,指該函數(shù)的作用域僅局限于本文件。所以說(shuō),static具有信息隱藏的作用。而關(guān)鍵字"inline“加在函數(shù)前,說(shuō)明這個(gè)函數(shù)對(duì)編譯程序是可見(jiàn)的,也就是說(shuō)編譯程序在調(diào)用這個(gè)函數(shù)時(shí)就立即展開(kāi)該函數(shù)。Linux內(nèi)核中鏈表的實(shí)現(xiàn)及應(yīng)用

鏈表的遍歷

這種鏈表只是找到了一個(gè)個(gè)結(jié)點(diǎn)在鏈表中的偏移位置pos,如下圖(a)。那么如何通過(guò)pos獲得結(jié)點(diǎn)的起始地址,從而可以引用結(jié)點(diǎn)中的域呢?(a)(b)list.h中定義了晦澀難懂的list_entry()宏:#definelist_entry(ptr,type,member)\

((type*)(

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論