![Linux操作系統(tǒng)與應(yīng)用 第一章_第1頁](http://file4.renrendoc.com/view/10b760da5be38856472748262a0c80ab/10b760da5be38856472748262a0c80ab1.gif)
![Linux操作系統(tǒng)與應(yīng)用 第一章_第2頁](http://file4.renrendoc.com/view/10b760da5be38856472748262a0c80ab/10b760da5be38856472748262a0c80ab2.gif)
![Linux操作系統(tǒng)與應(yīng)用 第一章_第3頁](http://file4.renrendoc.com/view/10b760da5be38856472748262a0c80ab/10b760da5be38856472748262a0c80ab3.gif)
![Linux操作系統(tǒng)與應(yīng)用 第一章_第4頁](http://file4.renrendoc.com/view/10b760da5be38856472748262a0c80ab/10b760da5be38856472748262a0c80ab4.gif)
![Linux操作系統(tǒng)與應(yīng)用 第一章_第5頁](http://file4.renrendoc.com/view/10b760da5be38856472748262a0c80ab/10b760da5be38856472748262a0c80ab5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第一章操作系統(tǒng)概述認(rèn)識操作系統(tǒng)操作系統(tǒng)的發(fā)展開放源代碼的Unix/Linux操作系統(tǒng)Linux內(nèi)核Linux內(nèi)核源代碼
Linux
內(nèi)核模塊編程入門Linux
內(nèi)核中鏈表的實(shí)現(xiàn)及應(yīng)用不同角度看到的操作系統(tǒng)操作系統(tǒng)整體看操作系統(tǒng)設(shè)計(jì)者使用者普通開發(fā)者認(rèn)識操作系統(tǒng)打開計(jì)算機(jī),首先跳入眼簾的是什么?要拷貝一個(gè)文件,具體的拷貝操作是誰完成的?你需要知道文件存放在何處嗎?柱面、磁道、扇區(qū)描述什么?數(shù)據(jù)的搬動(dòng)過程怎樣進(jìn)行繁瑣留給自己,簡單留給用戶
操作系統(tǒng)穿上華麗的外衣-圖形界面操作系統(tǒng)穿上樸素的外衣-字符界面<>認(rèn)識操作系統(tǒng)-從使用者的角度看拷貝命令的C語言實(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)識操作系統(tǒng)-從程序開發(fā)者的角度看
<>瀏覽器信息管理文件管理系統(tǒng)游戲
編譯程序編輯程序命令解釋程序
操作系統(tǒng)
CPU、內(nèi)存、I/O接口硬件內(nèi)核認(rèn)識操作系統(tǒng)-從所處位置看操作系統(tǒng)是其它所有用戶程序運(yùn)行的基礎(chǔ)。
<>#include<stdio.h>main(){printf(“Helloworld\n”)}用戶告訴操作系統(tǒng)執(zhí)行test程序操作系統(tǒng)通過文件名找到該程序檢查其類型,檢查程序首部,找出代碼和數(shù)據(jù)存放的地址文件系統(tǒng)找到第一個(gè)磁盤塊操作系統(tǒng)建立程序的執(zhí)行環(huán)境操作系統(tǒng)把程序從磁盤裝入內(nèi)存,并跳到程序開始處執(zhí)行該程序的執(zhí)行過程簡述如下:操作系統(tǒng)檢查字符串的位置是否正確操作系統(tǒng)找到字符串被送往的設(shè)備操作系統(tǒng)將字符串送往輸出設(shè)備窗口系統(tǒng)確定這是一個(gè)合法的操作,然后將字符串轉(zhuǎn)換成像素窗口系統(tǒng)將像素寫入存儲(chǔ)映像區(qū)視頻硬件將像素表示轉(zhuǎn)換成一組模擬信號控制顯示器(重畫屏幕)顯示器發(fā)射電子束。你在屏幕上看到Helloworld。從中看到什么認(rèn)識操作系統(tǒng)-從程序執(zhí)行看從操作系統(tǒng)設(shè)計(jì)者的角度看操作系統(tǒng)的設(shè)計(jì)目標(biāo)是什么?盡可能地方便用戶使用計(jì)算機(jī)讓各種軟件資源和硬件資源高效而協(xié)調(diào)地運(yùn)轉(zhuǎn)起來。計(jì)算機(jī)的硬件資源和軟件資源各指什么?假設(shè)在一臺(tái)計(jì)算機(jī)上有三道程序同時(shí)運(yùn)行,并試圖在一臺(tái)打印機(jī)上輸出運(yùn)算結(jié)果,必須考慮哪些問題?從操作系統(tǒng)設(shè)計(jì)者的角度考慮,一個(gè)操作系統(tǒng)必須包含以下幾部分操作系統(tǒng)接口CPU管理內(nèi)存管理設(shè)備管理文件管理<>認(rèn)識操作系統(tǒng)-從設(shè)計(jì)者角度看操作系統(tǒng)是計(jì)算機(jī)系統(tǒng)中的一個(gè)系統(tǒng)軟件,是一些程序模塊的集合——它們能以盡量有效、合理的方式組織和管理計(jì)算機(jī)的軟硬件資源,合理的組織計(jì)算機(jī)的工作流程,控制程序的執(zhí)行并向用戶提供各種服務(wù)功能,使得用戶能夠靈活、方便、有效的使用計(jì)算機(jī),使整個(gè)計(jì)算機(jī)系統(tǒng)能高效、順暢地運(yùn)行。<>認(rèn)識操作系統(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或者其他種類的用戶界面、基本的文件管理工具和系統(tǒng)工具等。實(shí)際上,人們在得到操作系統(tǒng)的同時(shí),更需要的是構(gòu)架于其上的應(yīng)用軟件,從而完成所需的實(shí)際功能。為此,操作系統(tǒng)一般要和應(yīng)用軟件綁定發(fā)行和出售。這樣的軟件包在linux領(lǐng)域被稱作發(fā)布版。
<>操作系統(tǒng)的組成(2)
從開發(fā)者的角度看,操作系統(tǒng)本質(zhì)上是大型軟件包,因此結(jié)構(gòu)組織不會(huì)與其它大型軟件迥異:操作系統(tǒng)的設(shè)計(jì)采用分層結(jié)構(gòu),越向上層抽象程度越高,越接近用戶;越向下層,越靠近硬件,抽象也越接近硬件。上層軟件依靠下層軟件提供的服務(wù),而且上層軟件自身還提供附加服務(wù)。因此,操作系統(tǒng)的結(jié)構(gòu)整體總體呈現(xiàn)倒金字塔形。用一組簡單的公式描述操作系統(tǒng)的組成要素:操作系統(tǒng)=內(nèi)核+系統(tǒng)程序系統(tǒng)程序=編譯環(huán)境+API(應(yīng)用程序接口)+AUI(用戶接口)編譯環(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)中的用戶使用
快速響應(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)行簡單的數(shù)學(xué)運(yùn)算
純手工操作
從計(jì)算尺至差分機(jī)到分析機(jī)發(fā)展了數(shù)百年第一代計(jì)算機(jī)
1946年~50年代末電子管計(jì)算機(jī)
1)體積大、能耗高、故障多、價(jià)格貴
2)難以普及應(yīng)用
無操作系統(tǒng)
(程序按機(jī)器碼編寫,載體從插件板到卡片與紙帶)
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)體積減小,性價(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ā)展軌跡分析在硬件的性價(jià)比較低的時(shí)候,操作系統(tǒng)設(shè)計(jì)追求什么?
在硬件性價(jià)比越來越高后,操作系統(tǒng)的設(shè)計(jì)開始追求的目標(biāo)是什么?計(jì)算機(jī)開始普及后,操作系統(tǒng)的設(shè)計(jì)開始追求?從第三代到第四代計(jì)算機(jī),操作系統(tǒng)的發(fā)展逐漸擺脫追隨硬件發(fā)展的狀況,形成自己的理論體系進(jìn)入第四代系統(tǒng)后,分布式系統(tǒng)和多處理器系統(tǒng)雖然極大的擴(kuò)充了操作系統(tǒng)理論,但系統(tǒng)結(jié)構(gòu)并沒有變化,只是各功能模塊得以進(jìn)一步完善。<>操作系統(tǒng)的發(fā)展硬件角度下操作系統(tǒng)發(fā)展的分析<>主流操作系統(tǒng)
系統(tǒng)特點(diǎn)
計(jì)算機(jī)語言背
景
無
手工操作
無編程語言直接使用機(jī)器代碼
1936年圖靈提出圖靈機(jī)
單道批處理系統(tǒng)
作業(yè)運(yùn)行的監(jiān)督程序
編程語言雛形期
1957年FORTRAN語言開發(fā)成功多道批處理
分時(shí)系統(tǒng)
實(shí)時(shí)系統(tǒng)
多處理系統(tǒng)
操作系統(tǒng)結(jié)構(gòu)確立,分為處理機(jī)管理、內(nèi)存管理、設(shè)備管理、文件管理等模塊
1)編程語言大量涌現(xiàn)
2)結(jié)構(gòu)化程序設(shè)計(jì)
3)C語言逐漸
60年代的軟件危機(jī)導(dǎo)致軟件工程的發(fā)展
1969年Unix誕生
1972年C語言推出
主流操作系統(tǒng)
系統(tǒng)特點(diǎn)
計(jì)算機(jī)語言背
景
類Unix系列
WINDOWS系列
人機(jī)交互成為主題
1)可視化界面
2)多媒體技
面向?qū)ο笳Z言成為主流
80年代中期開始面向?qū)ο蠹夹g(shù)逐步發(fā)展網(wǎng)絡(luò)操作系統(tǒng)
分布式操作系統(tǒng)微內(nèi)核技術(shù)興起
1)JAVA語言
2)腳本語言興起1995年JAVA推出
嵌入式系統(tǒng)
單內(nèi)核與微內(nèi)核競爭激烈編程工具向跨平臺(tái)方向發(fā)
1991年免費(fèi)的操作系統(tǒng)Linux發(fā)布
軟件角度下的操作系統(tǒng)發(fā)展軌跡
分析程序設(shè)計(jì)理論約束著操作系統(tǒng)設(shè)計(jì)。操作系統(tǒng)的發(fā)展滯后于計(jì)算機(jī)語言的發(fā)展,從結(jié)構(gòu)化設(shè)計(jì)到對象化設(shè)計(jì),操作系統(tǒng)總是最后應(yīng)用新編程理論的軟件之一。至今操作系統(tǒng)對于是否需要徹底對象化(即微內(nèi)核化),還處于徘徊時(shí)期,仍在探索單內(nèi)核與微內(nèi)核的最佳結(jié)合方式。人機(jī)交互技術(shù)主要是為用戶考慮,這是對操作系統(tǒng)設(shè)計(jì)進(jìn)行的變革。以Linux為代表的開源軟件的出現(xiàn),打破了帶有神秘色彩的傳統(tǒng)的封閉式開發(fā)模式。<>軟件角度下的操作系統(tǒng)發(fā)展軌跡分析
<>講究效率的單模塊操作系統(tǒng)進(jìn)程管理內(nèi)存管理設(shè)備管理文件管理模塊之間可以互相調(diào)用的單模塊結(jié)構(gòu)<>講究效率的單模塊操作系統(tǒng)模塊之間直接調(diào)用函數(shù),除了函數(shù)調(diào)用的開銷外,沒有額外開銷。龐大的操作系統(tǒng)有數(shù)以千計(jì)的函數(shù)復(fù)雜的調(diào)用關(guān)系勢必導(dǎo)致操作系統(tǒng)維護(hù)的困難<>追求簡潔的微內(nèi)核操作系統(tǒng)客戶進(jìn)程進(jìn)程服務(wù)器內(nèi)存服務(wù)器文件服務(wù)器…微內(nèi)核<>追求簡潔的微內(nèi)核操作系統(tǒng)內(nèi)核與各個(gè)服務(wù)器之間通過通信機(jī)制進(jìn)行交互,這使得微內(nèi)核結(jié)構(gòu)的效率大大折扣。內(nèi)核發(fā)出請求,服務(wù)器做出應(yīng)答為各個(gè)服務(wù)器模塊的相對獨(dú)立性,使得其維護(hù)相對容易<>歷史悠久的Unix在MULTICS(1969)的肩上制研制者KenThompson和DennisM.Ritchie
Unix的誕生還伴有C語言呱呱落地Unix是現(xiàn)代操作系統(tǒng)的代表:安全、可靠、強(qiáng)大的計(jì)算能力Unix的商業(yè)化是一把雙刃劍
<>自由而奔放的黑馬-Linux誕生于學(xué)生之手成長于Internet壯大于自由而開放的文化<>Linux之父-LinusTorvalds芬蘭、赫爾辛基大學(xué)、1990起始于寫兩個(gè)進(jìn)程然后寫驅(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)化過程中出現(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的遞歸縮寫,是自由軟件基金會(huì)的一個(gè)項(xiàng)目
。
GNU項(xiàng)目產(chǎn)品包括emacs編輯器、著名的GNUC和Gcc編譯器等,這些軟件叫做GNU軟件。GNU軟件和派生工作均適用GNU通用公共許可證,即GPL(GeneralPublicLicense
)Linux的開發(fā)使用了眾多的GUN工具<>GPL-開源軟件的法律GPL允許軟件作者擁有軟件版權(quán)但GPL規(guī)定授予其他任何人以合法復(fù)制、發(fā)行和修改軟件的權(quán)利。<>Linux系統(tǒng)或發(fā)布版
符合POSIX標(biāo)準(zhǔn)的操作系統(tǒng)內(nèi)核、Shell和外圍工具。C語言編譯器和其他開發(fā)工具及函數(shù)庫XWindow窗口系統(tǒng)各種應(yīng)用軟件,包括字處理軟件、圖象處理軟件等。<>開放與協(xié)作的開發(fā)模式
世界各地軟件愛好者集體智慧的結(jié)晶提供源代碼,遵守GPL。經(jīng)歷了各種各樣的測試與考驗(yàn),軟件的穩(wěn)定性好。開發(fā)人員憑興趣去開發(fā),熱情高,具有創(chuàng)造性。<>Linux內(nèi)核
Linus領(lǐng)導(dǎo)下的開發(fā)小組開發(fā)出的系統(tǒng)內(nèi)核
是所有Linux發(fā)布版本的核心
內(nèi)核開發(fā)人員一般在百人以上,任何自由程序員都可以提交自己的修改工作。
采用郵件列表來進(jìn)行項(xiàng)目管理、交流、錯(cuò)誤報(bào)告有大量的用戶進(jìn)行測試,正式發(fā)布的代碼質(zhì)量高
<>Linux內(nèi)核的技術(shù)特點(diǎn)
linux內(nèi)核被設(shè)計(jì)成單內(nèi)核結(jié)構(gòu),這是相對微內(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)核用戶進(jìn)程
內(nèi)核子系統(tǒng)系統(tǒng)調(diào)用<>整個(gè)系統(tǒng)的核心-內(nèi)核
用戶進(jìn)程—運(yùn)行在Linux內(nèi)核之上的一個(gè)龐大軟件集合。系統(tǒng)調(diào)用—內(nèi)核的出口,用戶程序通過它使用內(nèi)核提供的功能。
Linux內(nèi)核—操作系統(tǒng)的靈魂,負(fù)責(zé)管理磁盤上的文件、內(nèi)存,負(fù)責(zé)啟動(dòng)并運(yùn)行程序,負(fù)責(zé)從網(wǎng)絡(luò)上接收和發(fā)送數(shù)據(jù)包等等。硬件—包括了Linux安裝時(shí)需要的所有可能的物理設(shè)備。例如,CPU、內(nèi)存、硬盤、網(wǎng)絡(luò)硬件等等。<>內(nèi)核子系統(tǒng)<>內(nèi)核子系統(tǒng)進(jìn)程調(diào)度-控制著進(jìn)程對CPU的訪問。內(nèi)存管理-允許多個(gè)進(jìn)程安全地共享主內(nèi)存區(qū)域虛擬文件系統(tǒng)-隱藏各種不同硬件的具體細(xì)節(jié),為所有設(shè)備提供統(tǒng)一的接口。網(wǎng)絡(luò)-提供了對各種網(wǎng)絡(luò)標(biāo)準(zhǔn)協(xié)議的存取和各種網(wǎng)絡(luò)硬件的支持。進(jìn)程間通信(IPC)-支持進(jìn)程間各種通信機(jī)制,包括共享內(nèi)存、消息隊(duì)列及管道等。Linux內(nèi)核版本樹
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)行測試)
…
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)核模塊編程入門
認(rèn)識內(nèi)核模塊
內(nèi)核模塊是linux內(nèi)核向外部提供的一個(gè)插口,是內(nèi)核的一部分,但是并沒有被編譯到內(nèi)核里面去,其全稱為動(dòng)態(tài)可加載內(nèi)核模塊(LoadableKernelModule,LKM),簡稱模塊。為什么要使用模塊?
linux內(nèi)核之所以提供模塊機(jī)制,是因?yàn)樗旧硎且粋€(gè)單內(nèi)核。而單內(nèi)核的最大優(yōu)點(diǎn)就是效率高,因?yàn)樗械膬?nèi)容都集成在一起,但其缺點(diǎn)是可擴(kuò)展性和可維護(hù)性相對較差,模塊機(jī)制就是為了彌補(bǔ)這一缺陷。Linux內(nèi)核模塊編程入門
模塊的定義
模塊是具有獨(dú)立功能的程序,它可以被單獨(dú)編譯,但不能獨(dú)立運(yùn)行。它在運(yùn)行時(shí)被鏈接到內(nèi)核作為內(nèi)核的一部分在內(nèi)核空間運(yùn)行,這與運(yùn)行在用戶空間的進(jìn)程是不同的。模塊通常由一組函數(shù)和數(shù)據(jù)結(jié)構(gòu)組成,用來實(shí)現(xiàn)一種文件系統(tǒng)、一個(gè)驅(qū)動(dòng)程序或者其他內(nèi)核上層的功能。編寫簡單的內(nèi)核模塊
模塊和內(nèi)核都在內(nèi)核空間運(yùn)行,模塊編程在一定意義上說就是內(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)核模塊編程入門
簡單的內(nèi)核模塊實(shí)例:
任何模塊都要包含的三個(gè)頭文件:#include<linux/module.h>#include<linux/kernel.h>#incldue<linux/init.h>說明:module.h頭文件包含了對模塊的版本控制;kernel.h包含了常用的內(nèi)核函數(shù);init.h包含了宏__init和__exit,宏__init告訴編譯程序相關(guān)的函數(shù)和變量僅用于初始化,編譯程序?qū)?biāo)有__init的所有代碼存儲(chǔ)到特殊的內(nèi)存段中,初始化結(jié)束就釋放這段內(nèi)存。在此使用了printk()函數(shù),該函數(shù)是由內(nèi)核定義的,功能和C庫中的printf()類似,它把要打印的日志輸出到終端或系統(tǒng)日志。字符串中的<1>是輸出的級別,表示立即在終端輸出。Linux內(nèi)核模塊編程入門
內(nèi)核模塊的Makefile文件
內(nèi)核模塊不是獨(dú)立的可執(zhí)行文件,但在運(yùn)行時(shí)其目標(biāo)文件被鏈接到內(nèi)核中。只有超級用戶才能加載和卸載模塊。給前面的程序起名叫module_example.c,那么其對應(yīng)的Makefile文件的基本內(nèi)容如下:obj-m:=這個(gè)賦值語句的含義是說明要使用目標(biāo)文件module_example.o建立一個(gè)模塊,最后生成的模塊名為module_example.ko。.o文件是經(jīng)過編譯和匯編,而沒有經(jīng)過鏈接的中間文件。注:makefile文件中,若某一行是命令,則它必須以一個(gè)Tab鍵開頭。Linux內(nèi)核模塊編程入門
運(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)核模塊編程入門
應(yīng)用程序與內(nèi)核模塊的比較
C語言應(yīng)用程序內(nèi)核模塊程序使用函數(shù)Libc庫內(nèi)核函數(shù)運(yùn)行空間用戶空間內(nèi)核空間運(yùn)行權(quán)限普通用戶超級用戶入口函數(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)存無需占用連續(xù)的內(nèi)存單元。③每個(gè)元素都包含一個(gè)指向下一個(gè)元素的指針,當(dāng)有元素加入鏈表或者從鏈表中刪除元素時(shí),只需要調(diào)整下一個(gè)節(jié)點(diǎn)的指針就可以了。Linux內(nèi)核中鏈表的實(shí)現(xiàn)及應(yīng)用通過前趨(prev)和后繼(next)兩個(gè)指針域,就可以從兩個(gè)方向遍歷雙鏈表,這使得遍歷鏈表的代價(jià)減少。鏈表的演化
在C語言中,一個(gè)基本的雙向鏈表定義如下:structmy_list{ void*mydata; structmy_list*next; structmy_list*prev; };Linux內(nèi)核中鏈表的實(shí)現(xiàn)及應(yīng)用鏈表的定義linux內(nèi)核對鏈表的實(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)中。說明:1.list域隱藏了鏈表的指針特性2.structlist_head可以位于結(jié)構(gòu)的任何位置,可以給其起任何名字3.在一個(gè)結(jié)構(gòu)中可以有多個(gè)list域
以structlist_head為基本對象,可以對鏈表進(jìn)行插入、刪除、合并以及遍歷等各種操作。
Linux內(nèi)核中鏈表的實(shí)現(xiàn)及應(yīng)用鏈表的聲明和初始化structlist_head只定義了鏈表節(jié)點(diǎn),并沒有專門定義鏈表頭,那么一個(gè)鏈表結(jié)構(gòu)是如何建立起來的?內(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是否指向自己來判斷鏈表是否為空: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)鏈表,而且通常沒有首尾結(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)。說明:關(guān)于staticinline關(guān)鍵字。
“static”加在函數(shù)前,表示這個(gè)函數(shù)是靜態(tài)函數(shù),所謂靜態(tài)函數(shù),實(shí)際上是對函數(shù)作用域的限制,指該函數(shù)的作用域僅局限于本文件。所以說,static具有信息隱藏的作用。而關(guān)鍵字"inline“加在函數(shù)前,說明這個(gè)函數(shù)對編譯程序是可見的,也就是說編譯程序在調(diào)用這個(gè)函數(shù)時(shí)就立即展開該函數(shù)。Linux內(nèi)核中鏈表的實(shí)現(xiàn)及應(yīng)用
鏈表的遍歷
這種鏈表只是找到了一個(gè)個(gè)結(jié)點(diǎn)在鏈表中的偏移位置pos,如下圖(a)。那么如何通過pos獲得結(jié)點(diǎn)的起始地址,從而可以引用結(jié)點(diǎn)中的域呢?(a)(b)list.h中定義了晦澀難懂的list_entry()宏:#definelist_entry(ptr,type,member)\
((type*)(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 環(huán)保理念在兒童房翻新中的體現(xiàn)與影響
- 園林休閑設(shè)備出租考核試卷
- 電子商務(wù)平臺(tái)的智能物流與供應(yīng)鏈管理
- 2025-2030年反射隔熱涂料與保溫系統(tǒng)結(jié)合行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報(bào)告
- 2025-2030年史前動(dòng)物塑膠考古套裝行業(yè)跨境出海戰(zhàn)略研究報(bào)告
- 2025-2030年即食章魚足罐頭企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報(bào)告
- 2025-2030年商業(yè)店鋪照明布局行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報(bào)告
- 2025-2030年可穿戴人工肝臟排毒輔助行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報(bào)告
- 2025-2030年即食營養(yǎng)早餐包行業(yè)跨境出海戰(zhàn)略研究報(bào)告
- 2024年12月2025年中國天主教愛國會(huì)公開招聘(2人)筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 醫(yī)學(xué)生理學(xué)智慧樹知到答案2024年德州學(xué)院
- GB/T 44412-2024船舶與海上技術(shù)液化天然氣燃料船舶加注規(guī)范
- 小學(xué)三年級數(shù)學(xué)上冊口算題卡(加換算)
- 機(jī)械制造HSE協(xié)議書
- 2024-2030年中國靜脈血栓栓塞癥(VTE)防治行業(yè)市場全景監(jiān)測及投資策略研究報(bào)告
- 2024年國家保密法知識競賽經(jīng)典題庫及完整答案【必刷】
- 抑郁癥病例分享
- 《子路、曾皙、冉有、公西華侍坐》課件()
- 青島版(五四制)四年級數(shù)學(xué)下冊全冊課件
- 人教鄂教版小學(xué)科學(xué)三年級下冊全冊教案教學(xué)設(shè)計(jì)
- 云計(jì)算安全部門KPI設(shè)計(jì)
評論
0/150
提交評論