




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
操作系統(tǒng)課程設(shè)計(jì)第一章課程設(shè)計(jì)目的和要求1.1課程設(shè)計(jì)目的操作系統(tǒng)是計(jì)算機(jī)系統(tǒng)的核心和靈魂,是計(jì)算機(jī)系統(tǒng)必不可少的組成部分,也是計(jì)算機(jī)專業(yè)教學(xué)的重要內(nèi)容。該課程概念眾多、內(nèi)容抽象、靈活性與綜合性強(qiáng),不但需要理解操作系統(tǒng)的概念和原理,還需要加強(qiáng)操作系統(tǒng)實(shí)驗(yàn),上機(jī)進(jìn)行編程實(shí)踐,故進(jìn)行此次課程設(shè)計(jì),使我們更好地掌握操作系統(tǒng)的精髓,真正做到深刻理解和融會(huì)貫通。操作系統(tǒng)課程設(shè)計(jì)是本課程重要的實(shí)踐教學(xué)環(huán)節(jié)。課程設(shè)計(jì)的目的,一方面使學(xué)生更透徹地理解操作系統(tǒng)的基本概念和原理,使之由抽象到具體;另一方面,通過(guò)課程設(shè)計(jì)加強(qiáng)學(xué)生的實(shí)驗(yàn)手段與實(shí)踐技能,培養(yǎng)學(xué)生獨(dú)立分析問(wèn)題、解決問(wèn)題、應(yīng)用知識(shí)的能力和創(chuàng)新精神。此次課程設(shè)計(jì)給學(xué)生更多自行設(shè)計(jì)、自主實(shí)驗(yàn)的機(jī)會(huì),充分放手讓學(xué)生真正培養(yǎng)學(xué)生的實(shí)踐動(dòng)手能力,全面提高學(xué)生的綜合素質(zhì)。本次課程設(shè)計(jì)的題目為讀者寫者同步問(wèn)題的實(shí)現(xiàn),在熟練掌握進(jìn)程同步原理的基礎(chǔ)上,利用C程序設(shè)計(jì)語(yǔ)言在windows操作系統(tǒng)下模擬實(shí)現(xiàn)讀者寫者同步問(wèn)題的功能,一方面加深對(duì)原理的理解,另一方面提高根據(jù)已有原理通過(guò)編程解決實(shí)際問(wèn)題的能力,為進(jìn)行系統(tǒng)軟件開發(fā)和針對(duì)實(shí)際問(wèn)題提出高效的軟件解決方案打下基礎(chǔ)。1.2課程設(shè)計(jì)要求在深入理解操作系統(tǒng)基本原理的基礎(chǔ)上,對(duì)于選定的題目以小組為單位,先確定設(shè)計(jì)方案,設(shè)計(jì)系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)和程序結(jié)構(gòu),設(shè)計(jì)每個(gè)模塊的處理流程。要求設(shè)計(jì)合理,編程序?qū)崿F(xiàn)系統(tǒng),要求實(shí)現(xiàn)可視化的運(yùn)行界面,界面應(yīng)清楚地反映出系統(tǒng)的運(yùn)行結(jié)果,確定測(cè)試方案,對(duì)系統(tǒng)進(jìn)程測(cè)試,運(yùn)行系統(tǒng)并要通過(guò)驗(yàn)收,講解運(yùn)行結(jié)果,說(shuō)明系統(tǒng)的特色和創(chuàng)新之處,并提交課程設(shè)計(jì)報(bào)告。課程設(shè)計(jì)任務(wù)內(nèi)容2.1課程設(shè)計(jì)任務(wù)要求完成的主要任務(wù):(包括課程設(shè)計(jì)工作量及其技術(shù)要求,以及說(shuō)明書撰寫等具體要求)1.技術(shù)要求:1)為每個(gè)讀者/寫者產(chǎn)生一個(gè)線程,設(shè)計(jì)正確的同步算法;2)讀者應(yīng)有3個(gè)以上,寫者應(yīng)有有兩個(gè)以上;3)必須包含讀者優(yōu)先喚醒和寫者優(yōu)先喚醒兩種算法。2.設(shè)計(jì)說(shuō)明書內(nèi)容要求:1)設(shè)計(jì)題目與要求;2)總的設(shè)計(jì)思想及系統(tǒng)平臺(tái)、語(yǔ)言、工具等;3)數(shù)據(jù)結(jié)構(gòu)與模塊說(shuō)明(功能與流程圖);4)運(yùn)行結(jié)果與運(yùn)行情況。2.2課程設(shè)計(jì)內(nèi)容本次課程設(shè)計(jì)是實(shí)現(xiàn)讀者寫者的同步與互斥問(wèn)題,要求實(shí)現(xiàn)讀者與讀者可以共享資源,讀者與寫者互斥,寫者與寫者互斥,要求編寫出完整的代碼,并截取運(yùn)行結(jié)果截圖。詳細(xì)設(shè)計(jì)說(shuō)明3.1問(wèn)題描述所謂讀者寫著問(wèn)題,是指保證一個(gè)writer進(jìn)程必須與其他進(jìn)程互斥地訪問(wèn)共享對(duì)象的同步問(wèn)題。讀者寫者問(wèn)題可以這樣的描述,有一群寫者和一群讀者,寫者在寫同一本書,讀者也在讀這本書,多個(gè)讀者可以同時(shí)讀這本書,但是,只能有一個(gè)寫者在寫書。為實(shí)現(xiàn)讀寫同步,需要使用信號(hào)量機(jī)制。信號(hào)量機(jī)制是支持多道程序的并發(fā)操作系統(tǒng)設(shè)計(jì)中解決資源共享時(shí)進(jìn)程間的同步與互斥的重要機(jī)制,而讀者寫者則是這一機(jī)制的一個(gè)經(jīng)典范例。對(duì)利用信號(hào)量來(lái)解決讀者—寫者問(wèn)題的描述如下:1)寫-寫互斥,即不能有兩個(gè)寫者同時(shí)進(jìn)行寫操作;2)讀-寫互斥,即不能同時(shí)有一個(gè)讀者在讀,同時(shí)卻有一個(gè)寫者在寫;3)讀讀允許,即可以有2個(gè)以上的讀者同時(shí)讀。本次課程設(shè)計(jì)中,在處理讀者寫者等待隊(duì)列的請(qǐng)求時(shí),用到了兩種喚醒進(jìn)程算法:讀者優(yōu)先喚醒算法和寫者優(yōu)先喚醒算法。讀優(yōu)先:當(dāng)一個(gè)讀者與若干寫者同時(shí)處于等待隊(duì)列中時(shí),并且此時(shí)并無(wú)寫操作進(jìn)行時(shí),讀者優(yōu)先進(jìn)行讀。寫優(yōu)先:當(dāng)一個(gè)讀者與若干寫者同時(shí)處于等待隊(duì)列中時(shí),并且此時(shí)并無(wú)寫操作進(jìn)行時(shí),寫者優(yōu)先進(jìn)行寫。3.2模塊設(shè)計(jì)程序由三部分組成:主程序:顯示主菜單,調(diào)用各個(gè)子菜單;讀者優(yōu)先喚醒:寫者釋放資源時(shí),優(yōu)先喚醒等待隊(duì)列中的讀進(jìn)程;寫者優(yōu)先喚醒:寫者釋放資源時(shí),優(yōu)先喚醒等待隊(duì)列中的寫進(jìn)程。主程序主程序讀者優(yōu)先喚醒寫者優(yōu)先喚醒退出圖3-1模塊劃分圖3.3程序流程圖結(jié)結(jié)束讀者優(yōu)先喚醒開始顯示主菜單輸入choiceChoice=1?Choice=2?Choice=3?寫者優(yōu)先喚醒退出NNNYYY 圖3-2程序流程圖3.4算法與數(shù)據(jù)結(jié)構(gòu)3.4.1數(shù)據(jù)結(jié)構(gòu)定義一個(gè)結(jié)構(gòu)體,用來(lái)存放讀者等待隊(duì)列,其元素為用來(lái)存放讀進(jìn)程的數(shù)組reader[200],用來(lái)指示等待隊(duì)列中讀進(jìn)程個(gè)數(shù)的整型變量index:structrqueue{ intreaders[200]; intindex;}rq;定義另一個(gè)結(jié)構(gòu)體,用來(lái)存放寫者等待隊(duì)列,其元素為用來(lái)存放寫進(jìn)程的數(shù)組writers[200];用來(lái)指示等待隊(duì)列中寫進(jìn)程個(gè)數(shù)的整型變量index:structwqueue{ intwriters[200]; intindex;}wq;3.4.2算法描述定義一個(gè)數(shù)據(jù)緩存buffer及用于實(shí)現(xiàn)同步互斥的信號(hào)量w。定義一個(gè)讀者函數(shù):當(dāng)有寫者在占用buffer時(shí),讀者應(yīng)該等待,直到寫者不再使用該buffer;當(dāng)有其他讀者在占用buffer時(shí),讀者可對(duì)buffer進(jìn)行讀取操作;當(dāng)buffer中有數(shù)據(jù)時(shí),則從其中讀取一個(gè)數(shù)據(jù),并顯示然后退出;當(dāng)buffer中沒(méi)有數(shù)據(jù)時(shí),應(yīng)等待,直到buffer中有數(shù)據(jù)可讀,用變量sign指示,為1時(shí)才能讀;為0時(shí)需要等待寫者寫數(shù)據(jù)。定義一個(gè)寫者函數(shù):當(dāng)有讀者在占用buffer時(shí),寫者應(yīng)該等待,直到所有的讀者都退出為止;當(dāng)有其他寫者占用buffer時(shí),該寫者應(yīng)該等待,直到占用buffer的寫者退出為止;當(dāng)buffer有空閑時(shí),寫者應(yīng)該在buffer中寫入一個(gè)數(shù)據(jù)并退出。定義主函數(shù),在其中可以任意創(chuàng)建讀者與寫者。可根據(jù)用戶輸入創(chuàng)建讀者或?qū)懻哌M(jìn)程(線程)。3.4.3算法流程圖讀操作算法流程圖如圖3-3所示:YY開始Rcount=0?w=1?sign=1?W=0;rcount++;進(jìn)行讀等待寫者寫內(nèi)容;并加入到讀者喚醒隊(duì)列;Rq.index++;結(jié)束YYNNN圖3-3讀者算法流程圖注:Rcount表示正在進(jìn)行讀操作的數(shù)目;w表示一個(gè)信號(hào)量,為1時(shí)表示無(wú)進(jìn)程操作,緩沖區(qū)空閑,為0時(shí)表示有進(jìn)程占用;sign表示緩沖區(qū)是否有數(shù)寫入,只有緩沖區(qū)中有數(shù)才能進(jìn)行讀操作,為1表示有數(shù),為0表示沒(méi)有;Rq.index表示讀操作等待喚醒隊(duì)列進(jìn)程數(shù);寫操作算法流程圖如圖3-4所示:開始W=1?W--;進(jìn)行寫;加入寫喚醒隊(duì)列Wq.index++;結(jié)束NY圖3-4寫者算法流程圖注:w含義同上;Wq.index表示寫操作等待喚醒隊(duì)列進(jìn)程數(shù)。讀者優(yōu)先喚醒算法流程圖如圖3-5所示:讀者優(yōu)先喚醒是指當(dāng)寫者釋放其占有的資源時(shí),當(dāng)讀者和寫者同時(shí)有進(jìn)程等待,優(yōu)先處理讀進(jìn)程。圖3-5注:Rcount.w.Wq.index含義同上;reader_wait是布爾型變量,為真時(shí)表示有讀者等待,反之沒(méi)有讀者進(jìn)程等待。寫者優(yōu)先喚醒算法流程圖如圖3-6所示:寫者優(yōu)先喚醒是指當(dāng)寫進(jìn)程釋放其占有資源時(shí),當(dāng)讀者和寫者同時(shí)有進(jìn)程等待,優(yōu)先處理寫進(jìn)程。圖3-6注:Rcount,w,Wq.index含義同上;write_wait是一個(gè)布爾型變量,為真時(shí)表示有寫進(jìn)程等待,反之沒(méi)有。NNNYNNYYYYWq.index=0?處理隊(duì)列首部的寫進(jìn)程N(yùn)!reader_wait?開始Rcount=0?reader_wait=false;w=1;結(jié)束當(dāng)前寫進(jìn)程Rq.index=0?reader_wait=true;W=0;處理讀進(jìn)程Wq.index!=0?Rcount=0;W=1;處理寫進(jìn)程W=0;結(jié)束 圖3-5讀者優(yōu)先喚醒算法流程圖YYNNYYYNNY開始Rcount=0?write_wait=false;w=1;結(jié)束當(dāng)前寫進(jìn)程Wq.index=0?write_wait=true;W=0;依次處理寫進(jìn)程Wq.index!=0?Rcount=0;W=1;處理寫進(jìn)程W=0;!write_wait?Rq.index=0?處理讀進(jìn)程;w=0結(jié)束N 圖3-6寫者優(yōu)先喚醒算法流程圖第四章軟件使用說(shuō)明4.1系統(tǒng)開發(fā)與運(yùn)行環(huán)境代碼實(shí)現(xiàn):C語(yǔ)言程序開發(fā)工具:McrosoftVisualC++6.0運(yùn)行環(huán)境:windows74.2系統(tǒng)的運(yùn)行說(shuō)明對(duì)讀者寫者問(wèn)題系統(tǒng)的運(yùn)行說(shuō)明如下:按照顯示菜單說(shuō)明,輸入數(shù)字對(duì)菜單進(jìn)行選擇,一個(gè)菜單即是一個(gè)功能實(shí)現(xiàn),可以實(shí)現(xiàn)讀者寫者進(jìn)程同步與互斥問(wèn)題。4.3運(yùn)行結(jié)果系統(tǒng)主菜單及讀者優(yōu)先喚醒子菜單,按菜單提示選擇1是讀者優(yōu)先喚醒算法,運(yùn)行結(jié)果如圖4-1所示:圖4-1主菜單及子菜單在子菜單中選擇1創(chuàng)建讀進(jìn)程,由于此之前并無(wú)寫者向緩沖區(qū)中寫數(shù),所以緩沖區(qū)為空,此時(shí)不可讀,將讀者加入到等待喚醒隊(duì)列,讀者隊(duì)列數(shù)目加1,運(yùn)行結(jié)果如圖4-2所示:圖4-2創(chuàng)建讀進(jìn)程在子菜單中選擇2創(chuàng)建寫進(jìn)程1,由于并無(wú)進(jìn)程占用緩沖區(qū),所以寫者1不必等待可以直接寫數(shù),運(yùn)行結(jié)果如圖4-3所示:圖4-3創(chuàng)建寫進(jìn)程在子菜單中選擇1創(chuàng)建讀者進(jìn)程,由于已有寫進(jìn)程占用所以將讀者進(jìn)程加入到讀者等待喚醒隊(duì)列;選擇創(chuàng)建寫者進(jìn)程2,由于寫者與寫者互斥,將寫者2加入到寫者等待喚醒隊(duì)列,運(yùn)行結(jié)果如圖4--4所示:圖4-4創(chuàng)建讀進(jìn)程和寫進(jìn)程選擇3寫者1釋放資源,由于此為讀者優(yōu)先喚醒算法,所以優(yōu)先喚醒讀者,進(jìn)行讀進(jìn)程操作,運(yùn)行結(jié)果如圖4-5所示:圖4-5寫者釋放占有資源優(yōu)先喚醒讀者選擇1創(chuàng)建讀進(jìn)程,讀者與讀者之間不互斥,所以不必等待;選擇2創(chuàng)建寫進(jìn)程3,由于讀進(jìn)程占用資源,所以寫者必須等待,將寫者加入等待隊(duì)列,運(yùn)行結(jié)果如圖4-6所示:圖4-6創(chuàng)建讀進(jìn)程和寫進(jìn)程選擇3讀者釋放資源,寫者2被喚醒進(jìn)行寫操作,運(yùn)行結(jié)果如圖4-7所示:圖4-7讀者釋放占有資源返回到主菜單并選擇寫者優(yōu)先喚醒算法,運(yùn)行結(jié)果如圖4-8所示:圖4-8寫者優(yōu)先喚醒算法選擇3釋放當(dāng)前進(jìn)程,等待隊(duì)列中的寫者喚醒,運(yùn)行結(jié)果如圖4-9所示:圖4-9釋放寫者2,寫者3占有資源創(chuàng)建兩個(gè)讀進(jìn)程和一個(gè)寫者進(jìn)程,由于寫者3占有資源,所以它們都要加入各自等待喚醒隊(duì)列中,運(yùn)行結(jié)果如圖4-10所示:圖4-10創(chuàng)建讀進(jìn)程和寫進(jìn)程釋放當(dāng)前寫者占有資源,由于本算法使用的是寫者優(yōu)先喚醒算法,所以寫者4優(yōu)先被喚醒占用資源,進(jìn)行寫操作,讀者進(jìn)程依然等待,運(yùn)行結(jié)果如圖4-11所示:圖4-11寫者釋放資源優(yōu)先喚醒等待隊(duì)列中的寫者第五章課程設(shè)計(jì)心得體會(huì)三周的課程設(shè)計(jì)結(jié)束了,這次課程設(shè)計(jì)是操作系統(tǒng)中讀者與寫者問(wèn)題。通過(guò)課程設(shè)計(jì)我懂得了讀者與寫者的一些簡(jiǎn)單算法的實(shí)現(xiàn),掌握了用高級(jí)語(yǔ)言編寫和調(diào)試程序的方法,加深了對(duì)讀者寫者問(wèn)題概念及算法的理解,并且加深了對(duì)進(jìn)程同步算法的理解。同時(shí),在這次課程設(shè)計(jì)中,也暴露出一些問(wèn)題,比如動(dòng)手之前的構(gòu)思是非常的完美,本來(lái)以為會(huì)一氣呵成的順利完成任務(wù),可是正是需要?jiǎng)邮肿龅脮r(shí)候卻是那么困難,尤其是編寫代碼的時(shí)候,編完運(yùn)行老是出錯(cuò),然后改正,還是出錯(cuò),總是在那些細(xì)節(jié)上出錯(cuò),問(wèn)題雖然不大,但就是不能運(yùn)行。所以,平時(shí)還是要多動(dòng)手,注意要認(rèn)真細(xì)心。最后,感謝老師對(duì)我的學(xué)習(xí)的指導(dǎo)!附錄1:參考文獻(xiàn)[1]胡志剛,譚長(zhǎng)庚等,《計(jì)算機(jī)操作系統(tǒng)》,中南大學(xué)出版社2005年[2]羅宇,鄒鵬等,《操作系統(tǒng)》(第二版),電子工業(yè)出版社2007年4月[3]湯子瀛,哲風(fēng)屏,湯小冉等,《計(jì)算機(jī)操作系統(tǒng)》,西安電子科技大學(xué)出社,2001年8月[4]張堯?qū)W,史美林,《計(jì)算機(jī)操作系統(tǒng)課程》,清華大學(xué)出版社,2000年[5]龐麗萍,《操作系統(tǒng)原理》,華中理工大學(xué)出版社,2000年[6]馬季蘭等Linux操作系統(tǒng),電子工業(yè)出版社2002年[7]任愛華,李鵬,劉方毅,操作系統(tǒng)實(shí)驗(yàn)指導(dǎo),清華大學(xué)出版社,2004年[8]譚浩強(qiáng)著.C程序設(shè)計(jì),清華大學(xué)出版社,1999年12月第2版[9]譚浩強(qiáng)著.C++程序設(shè)計(jì)實(shí)踐指導(dǎo),清華大學(xué)出版社,2005年7月底1版[10]【美】D.C.Malik:C++編程——從問(wèn)題分析到程序設(shè)計(jì),電子工業(yè)出版社,2003年7月第一版附錄2:程序清單源代碼:#include<stdio.h>#include<stdlib.h>intrcount=0;//正在讀的讀者數(shù)量intwcount=0;//寫者隊(duì)列中等待寫操作的寫者數(shù)量intread_id=0;//讀進(jìn)程號(hào)intwrite_id=0;//寫進(jìn)程號(hào)intw=1;//讀寫互斥信號(hào)量;intchoice;//用戶選擇讀者優(yōu)先或者寫者優(yōu)先intsign=0;//標(biāo)識(shí)緩沖區(qū)是否為空,0表示空,1表示不為空voidWFwakeup();voidRFwakeup();structrqueue{//讀者等待隊(duì)列 intreaders[200]; intindex;}rq;structwqueue{//寫者等待隊(duì)列 intwriters[200]; intindex;}wq;/*voidfirst(){//初始化inti;rq.index=0;wq.index=0;for(i=0;i<20;i++){rq.readers[i]=0;wq.writers[i]=0;}}*///*******************************************讀進(jìn)程讀操作voidread(){ inti=0; read_id++; if(rcount==0){//當(dāng)前沒(méi)有讀進(jìn)程在讀:可能有寫進(jìn)程在寫,也可能CPU空閑 if(w==1) {//如果CPU空閑,讀者拿到獲得cpu w--;//相當(dāng)于一個(gè)P操作 rcount++; if(sign==0) { if(choice==1){ rq.readers[rq.index++]=read_id;//將讀者進(jìn)程加入等待隊(duì)列 RFwakeup(); return; } else{ rq.readers[rq.index++]=read_id;//將讀者進(jìn)程加入等待隊(duì)列 WFwakeup(); return; } }//if printf("讀者%d正在讀\n",read_id); }//if else{//寫者線程正在執(zhí)行 printf("!有寫者在寫不能讀!\n"); rq.readers[rq.index++]=read_id;//將讀者進(jìn)程加入等待隊(duì)列 }//else }//if else{//rcount!=1則知道當(dāng)前已經(jīng)有讀者在讀,讀讀不互斥,則這個(gè)讀者可以直接進(jìn)來(lái)了讀 printf("讀者%d正在讀\n",read_id); }//else }//***************************寫進(jìn)程寫操作voidwrite(){ write_id++; if(w==0){ if(rcount!=0){//有讀者進(jìn)程在執(zhí)行 printf("!有讀者在讀不能寫!\n"); wq.writers[wq.index++]=write_id;//將寫者進(jìn)程加入等待隊(duì)列 wcount++; return; } if(rcount==0){//rcount==0則當(dāng)前無(wú)讀者,但w=0,所以有寫者在寫 printf("!有寫者在寫不能寫!\n"); wq.writers[wq.index++]=write_id;//將寫者進(jìn)程加入等待隊(duì)列 wcount++; return; } } if(w==1){ w--; printf("寫者%d正在寫\n",write_id); sign=1; }//if}//************************讀者優(yōu)先時(shí)喚醒進(jìn)程voidRFwakeup(){ inti=0; intj=0; intm; m=rq.index; // n=wq.index; if(rcount==0){//當(dāng)前無(wú)讀進(jìn)程,是寫者在寫停止運(yùn)行寫進(jìn)程 boolreader_wait=false; w=1; printf("寫者已經(jīng)寫完\n"); sign=1;//緩沖區(qū)中已經(jīng)有內(nèi)容要置1 for(i=0;i<=m;i++){//index為當(dāng)前讀者隊(duì)列中的等待進(jìn)程數(shù) if(rq.readers[i]!=0){ reader_wait=true;//確實(shí)有讀者在等待 printf("等待的讀者%d正在讀\n",rq.readers[i]); w=0; rq.readers[i]=0; rcount++; rq.index--; }//if }//for if(!reader_wait){//沒(méi)有讀者等待,看是否有寫者等待 for(inti=0;i<=wq.index;i++){//檢查寫者等待隊(duì)列 if(wq.writers[i]!=0){ w=0; printf("等待的寫者%d正在寫\n",wq.writers[i]); wq.writers[i]=0; wcount--; break; }//if }//for }//if }//if else{//若rcount!=0則讀者正在讀,停止讀者進(jìn)程,此時(shí)若有等待必為寫者 rcount=0; w=1; if(sign==0){ printf("緩沖區(qū)空,等待寫者\(yùn)n"); return; } else{ printf("讀者已經(jīng)讀完\n"); for(inti=0;i<=wq.index;i++){// 檢查寫者等待隊(duì)列 if(wq.writers[i]!=0){ w=0; printf("等待的寫者%d正在寫\n",wq.writers[i]); wq.writers[i]=0; wcount--; break; }//if }//for }//else }//else }//******************************************寫者優(yōu)先喚醒voidWFwakeup(){ inti=0; intj=0; intm; m=rq.index; //n=wq.index; if(rcount==0){//當(dāng)前無(wú)讀進(jìn)程,是寫者在寫則停止運(yùn)行寫進(jìn)程 boolwriter_wait=false; w=1; printf("寫者已經(jīng)寫完\n"); sign=1;//緩沖區(qū)已經(jīng)有內(nèi)容sign要置1 for(i=0;i<=wq.index;i++){// index為當(dāng)前寫者隊(duì)列中的等待進(jìn)程數(shù) if(wq.writers[i]!=0){ writer_wait=true;//確實(shí)有寫者在等待 printf("等待的寫者%d正在寫\n",wq.writers[i]); w=0; wq.writers[i]=0; wcount--; break; } } if(!writer_wait){//沒(méi)有寫者等待,看是否有讀者等待 for(inti=0;i<=m;i++){//檢查讀者者等待隊(duì)列 if(rq.readers[i]!=0){ w=0; printf("等待的讀者%d正在讀\n",rq.readers[i]); rq.readers[i]=0; rcount++; }//if }//for }//if }//if else{//rcount!=0有讀者正在讀,則停止讀;此時(shí)若有等待必為寫者 rcount=0; w=1; printf("讀者已經(jīng)讀完\n"); for(inti=0;i<=wq.index;i++){//檢查寫者等待隊(duì)列 if(wq.writers[i]!=0){ w=0; printf("等待的寫者%d正在寫\n",wq.writers[i]); wq.writers[i]=0; wcount--; break; }//if }//for }}voidmenu1(){ voidmenu(); chari; printf("1-創(chuàng)建讀者進(jìn)程\n2-創(chuàng)建寫者進(jìn)程\n3-結(jié)束當(dāng)前執(zhí)行的進(jìn)程\n4-返回主菜單\n"); printf("*******************************************\n"); do{ printf("當(dāng)前隊(duì)列中有讀者:%d個(gè)寫者:%d個(gè)\n",rq.index,wcount); printf("*******************************************\n"); printf("請(qǐng)輸入你的選擇:"); scanf("%s",&i); switch(i){ case'1': read(); break; case'2': write(); break; case'3': RFwakeup(); break; case'4': menu(); default: printf("輸入錯(cuò)誤請(qǐng)重新輸入:"); } }while(true); }voidmenu2(){ voidmenu(); chari; printf("1-創(chuàng)建讀者進(jìn)程\n2-創(chuàng)建寫者進(jìn)程\n3-結(jié)束當(dāng)前執(zhí)行的進(jìn)程\n4-返回主菜單\n"); printf("*******************************************\n"); do{ printf("當(dāng)前隊(duì)列中有讀者:%d個(gè)寫者:%d個(gè)\n",rq.index,wcount); printf("*******************************************\n"); printf("請(qǐng)輸入你的選擇:"); scanf("%s",&i); switch(i){ case'1': read(); break; case'2': write(); break; case'3': WFwakeup(); break; case'4': menu(); default: printf("輸入錯(cuò)誤請(qǐng)重新輸入:"); } }while(true); }voidmain(){voidmenu();menu();}voidmenu(){ printf("讀者寫著問(wèn)題\n"); printf("**************************************************************************\n"); printf("1.讀者優(yōu)先喚醒\n2.寫者優(yōu)先喚醒\n3.退出.\n"); printf("請(qǐng)輸入你選擇的優(yōu)先喚醒算法:"); scanf("%d",&choice); while(1){ if(choice==1) menu1(); if(choice==2) menu2(); if(choice==3) exit(0); if(choice!=1&&choice!=2&&choice!=3){ printf("輸入錯(cuò)誤請(qǐng)重新輸入:"); scanf("%d",&choice); } }}附錄資料:不需要的可以自行刪除busybox詳解制作根文件系統(tǒng)詳解制作根文件系統(tǒng)一、FHS(FilesystemHierarchyStandard)標(biāo)準(zhǔn)介紹當(dāng)我們?cè)趌inux下輸入ls
/的時(shí)候,見到的目錄結(jié)構(gòu)以及這些目錄下的內(nèi)容都大同小異,這是因?yàn)樗械膌inux發(fā)行版在對(duì)根文件系統(tǒng)布局上都遵循FHS標(biāo)準(zhǔn)的建議規(guī)定。該標(biāo)準(zhǔn)規(guī)定了根目錄下各個(gè)子目錄的名稱及其存放的內(nèi)容:目錄名存放的內(nèi)容/bin必備的用戶命令,例如ls、cp等/sbin必備的系統(tǒng)管理員命令,例如ifconfig、reboot等/dev設(shè)備文件,例如mtdblock0、tty1等/etc系統(tǒng)配置文件,包括啟動(dòng)文件,例如inittab等/lib必要的鏈接庫(kù),例如C鏈接庫(kù)、內(nèi)核模塊/home普通用戶主目錄/rootroot用戶主目錄/usr/bin非必備的用戶程序,例如find、du等/usr/sbin非必備的管理員程序,例如chroot、inetd等/usr/lib庫(kù)文件/var守護(hù)程序和工具程序所存放的可變,例如日志文件/proc用來(lái)提供內(nèi)核與進(jìn)程信息的虛擬文件系統(tǒng),由內(nèi)核自動(dòng)生成目錄下的內(nèi)容/sys用來(lái)提供內(nèi)核與設(shè)備信息的虛擬文件系統(tǒng),由內(nèi)核自動(dòng)生成目錄下的內(nèi)容/mnt文件系統(tǒng)掛接點(diǎn),用于臨時(shí)安裝文件系統(tǒng)/tmp臨時(shí)性的文件,重啟后將自動(dòng)清除
制作根文件系統(tǒng)就是要建立以上的目錄,并在其中建立完整目錄內(nèi)容。其過(guò)程大體包括:編譯/安裝busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目錄利用交叉編譯工具鏈,構(gòu)建/lib目錄手工構(gòu)建/etc目錄手工構(gòu)建最簡(jiǎn)化的/dev目錄創(chuàng)建其它空目錄配置系統(tǒng)自動(dòng)生成/proc目錄利用udev構(gòu)建完整的/dev目錄制作根文件系統(tǒng)的jffs2映像文件下面就來(lái)詳細(xì)介紹這個(gè)過(guò)程。二、編譯/安裝busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目錄這些目錄下存儲(chǔ)的主要是常用命令的二進(jìn)制文件。如果要自己編寫這幾百個(gè)常用命令的源程序,mygod,這簡(jiǎn)直是一個(gè)噩夢(mèng)!好在我們有嵌入式Linux系統(tǒng)的瑞士軍刀——busybox,事情就簡(jiǎn)單很多。1、從/下載busybox-1.7.0.tar.bz22、tarxjvfbusybox-1.7.0.tar.bz2解包3、修改Makefile文件175ARCH
?=arm
176CROSS_COMPILE
?=arm-linux-4、makemenuconfig配置busyboxbusybox配置主要分兩部分。第一部分是BusyboxSettings,主要編譯和安裝busybox的一些選項(xiàng)。這里主要需要配置:1)、BuildOptions--BuildBusyBoxasastaticbinary(nosharedlibs),表示編譯busybox時(shí),是否靜態(tài)鏈接C庫(kù)。我們選擇動(dòng)態(tài)鏈接C庫(kù)。2)、InstallationOptions--Appletslinks(assoft-links)--(X)assoft-links,表示安裝busybox時(shí),將各個(gè)命令安裝為指向busybox的軟鏈接還是硬鏈接。我們選擇軟鏈接。3)、InstallationOptions--(/work/nfs_root/fs_mini3)BusyBoxinstallationprefix,表示busybox的安裝位置。我們選擇/work/nfs_root/fs_mini34)BusyboxLibraryTuning。保留Commandlineediting以支持命令行編輯;保留Historysize以支持記憶歷史命令;選中Tabcompletion和Usernamecompletion以支持命令自動(dòng)補(bǔ)全第二部分是Applets,他將busybox的支持的幾百個(gè)命令分門別類。我們只要在各個(gè)門類下選擇想要的命令即可。這里我們基本保持默認(rèn)設(shè)置。1)選中NetworkingUtilities--httpd下的Enable-u<user>option,以啟用http服務(wù)器的功能allowstheservertorunasaspecificuser5、編譯busyboxmake6、安裝busyboxmakeinstall安裝完成后,可以看到在/work/nfs_root/fs_mini3目錄下生成了binsbinusr/binusr/sbin目錄,其下包含了我們常用的命令,這些命令都是指向bin/busybox的軟鏈接,而busybox本身的大小不到800K:dennis@dennis-desktop:/work/nfs_root/fs_mini3$ls
bin
linuxrc
sbin
usr
dennis@dennis-desktop:/work/nfs_root/fs_mini3$
ls-lbin
total740
lrwxrwxrwx1dennisdennis
72010-04-0323:57addgroup->busybox
lrwxrwxrwx1dennisdennis
72010-04-0323:57adduser->busybox
lrwxrwxrwx1dennisdennis
72010-04-0323:57ash->busybox
-rwxr-xr-x1dennisdennis7496322010-04-0323:57busybox
lrwxrwxrwx1dennisdennis
72010-04-0323:57cat–>busybox而普通PC機(jī)上的ls命令就有差不多80K的大小:dennis@dennis-desktop:/work/nfs_root/fs_mini3$ls-l/bin/ls
-rwxr-xr-x1rootroot780042007-09-2920:51/bin/lsbusybox以它嬌小的身軀容納了數(shù)以百計(jì)的命令代碼,實(shí)在是讓人佩服不已,其不愧嵌入式系統(tǒng)瑞士軍刀之美譽(yù)。據(jù)說(shuō),busybox的作者身患絕癥,這更讓人欽佩GNU開源軟件的作者們。三、利用交叉編譯工具鏈,構(gòu)建/lib目錄光有應(yīng)用程序(命令)是不夠的,因?yàn)閼?yīng)用程序本身需要使用C庫(kù)的庫(kù)函數(shù),因此還必需制作forARM的C庫(kù),并將其放置于/lib目錄。mygod,要自己寫C庫(kù)的源代碼嗎?不用!還記得交叉編譯工具鏈的3個(gè)組成部分嗎?交叉編譯器、forARM的C庫(kù)和二進(jìn)制工具。哈哈,forARM的C庫(kù)是現(xiàn)成的,我們只需要拷貝過(guò)來(lái)就可以了。遺憾的是:整個(gè)C庫(kù)目錄下的文件總大小有26M。而我們根文件系統(tǒng)所在分區(qū)不過(guò)區(qū)區(qū)16M而已,根本放不下。怎么辦呢?dennis@dennis-desktop:/work/nfs_root/fs_mini3$du-s--si/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib
26M
/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib需要C庫(kù)目錄下所有的文件嗎?no,absolutelyno!讓我們來(lái)分析一下glibc庫(kù)目錄下內(nèi)容的組成。該目錄下的子目錄和文件共分8類:目標(biāo)文件,如crtn.o,用于gcc鏈接可執(zhí)行文件libtool庫(kù)文件(.la),在鏈接庫(kù)文件時(shí)這些文件會(huì)被用到,比如他們列出了當(dāng)前庫(kù)文件所依賴的其它庫(kù)文件,程序運(yùn)行時(shí)無(wú)需這些文件gconv目錄,里面是各種鏈接腳本,在編譯應(yīng)用程序時(shí),他們用于指定程序的運(yùn)行地址,各段的位置等靜態(tài)庫(kù)文件(.a),例如libm.a,libc.a動(dòng)態(tài)庫(kù)文件(.so、.so.[0-9]*)動(dòng)態(tài)鏈接庫(kù)加載器ld-2.3.6.so、ld-linux.so.2其它目錄及文件很顯然,第1、2、3、4、7類文件和目錄是不需要拷貝的。由于動(dòng)態(tài)鏈接的應(yīng)用程序本身并不含有它所調(diào)用的C庫(kù)函數(shù)的代碼,因此執(zhí)行時(shí)需要?jiǎng)討B(tài)鏈接庫(kù)加載器來(lái)為它加載相應(yīng)的C庫(kù)文件,所以第6類文件是需要拷貝的。除此之外,第5類文件當(dāng)然要拷貝。但第5類文件的大小也相當(dāng)大。dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$du-c--si*.so*7.2M
total需要全部拷貝嗎?非也,非也!其實(shí),需要哪些庫(kù)完全取決于要運(yùn)行的應(yīng)用程序使用了哪些庫(kù)函數(shù)。如果我們只制作最簡(jiǎn)單的系統(tǒng),那么我們只需要運(yùn)行busybox這一個(gè)應(yīng)用程序即可。通過(guò)執(zhí)行dennis@dennis-desktop:/work/nfs_root/fs_mini3$arm-linux-readelf-abin/busybox|grep'Shared'
0x00000001(NEEDED)
Sharedlibrary:[libcrypt.so.1]
0x00000001(NEEDED)
Sharedlibrary:[libm.so.6]
0x00000001(NEEDED)
Sharedlibrary:[libc.so.6]可知:busybox只用到了3個(gè)庫(kù):通用C庫(kù)(libc)、數(shù)學(xué)庫(kù)(libm)、加密庫(kù)(libcrypt),因此我們只需要拷貝這3個(gè)庫(kù)的庫(kù)文件即可。但是每個(gè)庫(kù)都有4個(gè)文件,4個(gè)文件都要拷貝嗎?當(dāng)然不是。dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ls-llibcrypt[.-]*
-rwxr-xr-x1dennisdennis307002008-01-2205:32libcrypt-2.3.6.so
-rw-r--r--1dennisdennis231182008-01-2205:32libcrypt.a
lrwxrwxrwx1dennisdennis
132008-12-2215:38libcrypt.so->libcrypt.so.1
lrwxrwxrwx1dennisdennis
172008-12-2215:38libcrypt.so.1->libcrypt-2.3.6.so
dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ls-llibm[.-]*
-rwxr-xr-x1dennisdennis
7790962008-01-2205:31libm-2.3.6.so
-rw-r--r--1dennisdennis11342822008-01-2205:32libm.a
lrwxrwxrwx1dennisdennis
92008-12-2215:38libm.so->libm.so.6
lrwxrwxrwx1dennisdennis
132008-12-2215:38libm.so.6->libm-2.3.6.so
dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ls-llibc[.-]*
-rwxr-xr-x1dennisdenni01-2205:48libc-2.3.6.so
-rw-r--r--1dennisdennis27682802008-01-2205:31libc.a
-rw-r--r--1dennisdennis
1952008-01-2205:34libc.so
lrwxrwxrwx1dennisdennis
132008-12-2215:38libc.so.6->libc-2.3.6.so4個(gè)文件中的.a文件是靜態(tài)庫(kù)文件,是不需要拷貝的。另外3個(gè)文件是:實(shí)際的共享鏈接庫(kù):libLIBRARY_NAME-GLIBC_VERSION.so。當(dāng)然需要拷貝。主修訂版本的符號(hào)鏈接,指向?qū)嶋H的共享鏈接庫(kù):libLIBRARY_NAME.so.MAJOR_REVISION_VERSION,程序一旦鏈接了特定的鏈接庫(kù),將會(huì)參用該符號(hào)鏈接。程序啟動(dòng)時(shí),加載器在加載程序前,會(huì)檢索該文件。所以需要拷貝。與版本無(wú)關(guān)的符號(hào)鏈接,指向主修訂版本的符號(hào)連接(libc.so是唯一的例外,他是一個(gè)鏈接命令行:libLIBRARY_NAME.so,是為編譯程序時(shí)提供一個(gè)通用條目)。這些文件在程序被編譯時(shí)會(huì)被用到,但在程序運(yùn)行時(shí)不會(huì)被用到,所以不必拷貝它。關(guān)于共享庫(kù)的2個(gè)符號(hào)鏈接的作用的特別說(shuō)明:當(dāng)我們使用gcc
hello.c
-o
hello
-lm編譯程序時(shí),gcc會(huì)根據(jù)-lm的指示,加頭(lib)添尾(.so)得到libm.so,從而沿著與版本無(wú)關(guān)的符號(hào)鏈接(libm.so->libm.so.6)找到libm.so.6并記錄在案(hello的ELF頭中),表示hello需要使用libm.so.6這個(gè)庫(kù)文件所代表的數(shù)學(xué)庫(kù)中的庫(kù)函數(shù)。而當(dāng)hello被執(zhí)行的時(shí)候,動(dòng)態(tài)鏈接庫(kù)加載器會(huì)從hello的ELF頭中找到libm.so.6這個(gè)記錄,然后沿著主修訂版本的符號(hào)鏈接(libm.so.6->libm-2.3.6.so)找到實(shí)際的共享鏈接庫(kù)libm-2.3.6.so,從而將其與hello作動(dòng)態(tài)鏈接。可見,與版本無(wú)關(guān)的符號(hào)鏈接是供編譯器使用的,主修訂版本的符號(hào)鏈接是供動(dòng)態(tài)鏈接庫(kù)加載器使用的,而實(shí)際的共享鏈接庫(kù)則是供應(yīng)用程序使用的。通過(guò)以上分析,我們只需要拷貝3個(gè)庫(kù)(每個(gè)庫(kù)各1個(gè)主修訂版本的符號(hào)鏈接和1個(gè)實(shí)際的共享鏈接庫(kù))以及動(dòng)態(tài)鏈接庫(kù)加載器(1個(gè)符號(hào)鏈接和1個(gè)實(shí)體文件)。步驟如下:dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$mkdir/work/nfs_root/fs_mini3/libdennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$cp
libcrypt-*/work/nfs_root/fs_mini3/lib
dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$cp-llibcrypt.so.*/work/nfs_root/fs_mini3/lib
dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$cp
libm-*/work/nfs_root/fs_mini3/lib
dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$cp-llibm.so.*/work/nfs_root/fs_mini3/lib
dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$cp
libc-*/work/nfs_root/fs_mini3/lib
dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$cp-llibc.so.*/work/nfs_root/fs_mini3/libdennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$cp-lld-*/work/nfs_root/fs_mini3/lib四、手工構(gòu)建/etc目錄/etc目錄存放的是系統(tǒng)程序的主配置文件,因此需要哪些配置文件取決于要運(yùn)行哪些系統(tǒng)程序。即使最小的系統(tǒng)也一定會(huì)運(yùn)行1號(hào)用戶進(jìn)程init,所以我們至少要手工編寫init的主配置文件inittab。busybox的inittab文件的語(yǔ)法、語(yǔ)義與傳統(tǒng)的SYSV的inittab有所不同。inittab文件中每個(gè)條目用來(lái)定義一個(gè)需要init啟動(dòng)的子進(jìn)程,并確定它的啟動(dòng)方式,格式為<id>:<runlevel>:<action>:<process>。例如:ttySAC0::askfirst:-/bin/sh<id>表示子進(jìn)程要使用的控制臺(tái),若省略則使用與init進(jìn)程一樣的控制臺(tái)<runlevel>表示運(yùn)行級(jí)別,busyboxinit程序這個(gè)字段沒(méi)有意義<action>表示init進(jìn)程如何控制這個(gè)子進(jìn)程sysinit:系統(tǒng)啟動(dòng)后最先執(zhí)行,只執(zhí)行一次,init進(jìn)程等待它結(jié)束后才繼續(xù)執(zhí)行其它動(dòng)作wait:系統(tǒng)執(zhí)行完sysinit條目后執(zhí)行,只執(zhí)行一次,init進(jìn)程等待它結(jié)束后才繼續(xù)執(zhí)行其它動(dòng)作once:系統(tǒng)執(zhí)行完wait條目后執(zhí)行,只執(zhí)行一次,init進(jìn)程不等待它結(jié)束respawn:?jiǎn)?dòng)完once進(jìn)程后,init進(jìn)程監(jiān)測(cè)發(fā)現(xiàn)子進(jìn)程退出時(shí),重新啟動(dòng)它askfirst:?jiǎn)?dòng)完respawn進(jìn)程后,與respawn類似,不過(guò)init進(jìn)程先輸出”PleasepressEntertoactivatethisconsole“,等用戶輸入回車后才啟動(dòng)子進(jìn)程shutdown:當(dāng)系統(tǒng)關(guān)機(jī)時(shí)restart:Busybox中配置了CONFIG_FEATURE_USE_INITAB,并且init進(jìn)程接收到SIGUP信號(hào)時(shí)執(zhí)行,先重新讀取、解析/etc/inittab文件,再執(zhí)行restart程序ctrlaltdel:按下ctrl+alt+del鍵時(shí)執(zhí)行,不過(guò)在串口控制臺(tái)中無(wú)法輸入它<process>表示進(jìn)程對(duì)應(yīng)的二進(jìn)制文件。如果前面有-號(hào),表示該程序是“可以與用戶進(jìn)行交互的”我們制作最簡(jiǎn)單的/etc/inittab文件,其內(nèi)容如下:::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount-a–r制作最簡(jiǎn)單的腳本程序文件/etc/init.d/rcS,其內(nèi)容如下:#!/bin/sh
ifconfigeth07修改shell腳本文件/etc/init.d/rcS的權(quán)限,以使其可被執(zhí)行:#chmoda+x/etc/init.d/rcS五、手工構(gòu)建最簡(jiǎn)化的/dev目錄在linux機(jī)器上,執(zhí)行l(wèi)s
/dev可看到幾百個(gè)設(shè)備文件,我需要手工創(chuàng)建它們嗎?maybe,我只需要手工創(chuàng)建幾個(gè)設(shè)備文件!我怎么知道我應(yīng)該創(chuàng)建哪幾個(gè)設(shè)備文件呢?管它呢,先看看開發(fā)板上可愛的linux的反應(yīng)再說(shuō)。啟動(dòng)Linux操作系統(tǒng),顯示:VFS:Mountedroot(nfsfilesystem).
Freeinginitmemory:112K
Warning:unabletoopenaninitialconsole.這說(shuō)明,內(nèi)核已經(jīng)成功掛載根文件系統(tǒng),但卻未能成功啟動(dòng)第1個(gè)用戶進(jìn)程init。通過(guò)錯(cuò)誤消息“unabletoopenaninitialconsole”搜索內(nèi)核源代碼,找到init/main.c文件。748staticintnoinlineinit_post(void)
749{
750
free_initmem();
751
unlock_kernel();
752
mark_rodata_ro();
753
system_state=SYSTEM_RUNNING;
754
numa_default_policy();
755
756
if(sys_open((constchar__user*)"/dev/console",O_RDWR,0)<0)
757
printk(KERN_WARNING"Warning:unabletoopenaninitialconsole.\n");
758
759
(void)sys_dup(0);
760
(void)sys_dup(0);
761
762
if(ramdisk_execute_command){
763
run_init_process(ramdisk_execute_command);
764
printk(KERN_WARNING"Failedtoexecute%s\n",
765
ramdisk_execute_command);
766
}
767
768
/*
769
*Wetryeachoftheseuntilonesucceeds.
770
*
771
*TheBourneshellcanbeusedinsteadofinitifweare
772
*tryingtorecoverareallybrokenmachine.
773
*/
774
if(execute_command){
775
run_init_process(execute_command);
776
printk(KERN_WARNING"Failedtoexecute%s.
Attempting"
777
"defaults...\n",execute_command);
778
}
779
run_init_process("/sbin/init");
780
run_init_process("/etc/init");
781
run_init_process("/bin/init");
782
run_init_process("/bin/sh");
783
784
panic("Noinitfound.
Trypassinginit=optiontokernel.");
785}顯然,內(nèi)核錯(cuò)誤是由175行不能打開/dev/console所致。通過(guò)查看已經(jīng)安裝好的linux機(jī)器的/dev/console設(shè)備文件,可知其是字符設(shè)備文件,主設(shè)備號(hào)為5,次設(shè)備號(hào)為1:dennis@dennis-desktop:/work/nfs_root/fs_mini3/etc$ls-l/dev/console
crw1rootroot5,12010-04-0808:40/dev/console因此,我們使用下面的命令創(chuàng)建它:dennis@dennis-desktop:/work/nfs_root/fs_mini3/dev$sudomknodconsolec51還需要?jiǎng)?chuàng)建其它設(shè)備文件嗎?只有天知道!再看看linux的反應(yīng)。VFS:Mountedroot(nfsfilesystem).
Freeinginitmemory:112K
init:can'topen'/dev/null':Nosuchfileordirectory這次我們有經(jīng)驗(yàn)了,如法炮制,創(chuàng)建/dev/null設(shè)備文件:dennis@dennis-desktop:/work/nfs_root/fs_mini3/dev$sudomknodnullc13再次重啟開發(fā)板上的linux,顯示VFS:Mountedroot(nfsfilesystem).
Freeinginitmemory:112K
initstarted:BusyBoxv1.7.0(2010-04-0323:53:55CST)
startingpid229,tty'':'/etc/init.d/rcS'PleasepressEntertoactivatethisconsole.
startingpid231,tty'':'/bin/sh'
#哈哈,我們成功了,終于可以K歌去了。六、創(chuàng)建其它空目錄K完歌回來(lái),繼續(xù)戰(zhàn)斗。dennis@dennis-desktop:/work/nfs_root/fs_mini3$mkdirhomerootprocsystmpmntvar再次重啟動(dòng)開發(fā)板上的linux。咦,似乎有些問(wèn)題。VFS:Mountedroot(nfsfilesystem).
Freeinginitmemory:112K
initstarted:BusyBoxv1.7.0(2010-04-0323:53:55CST)
startingpid229,tty'':'/etc/init.d/rcS'PleasepressEntertoactivatethisconsole.
startingpid231,tty'':'/bin/sh'
#ps
PID
Uid
VSZStatCommand
#ps竟然看不到任何進(jìn)程的存在!讓我想想。對(duì)了,ps的機(jī)制是通過(guò)查看/proc中的內(nèi)容來(lái)獲得進(jìn)程信息的。那么,目前/proc里有哪些內(nèi)容呢?#ls/proc
#竟然空空如野!這可如何是好?七、配置系統(tǒng)自動(dòng)生成/proc目錄其實(shí)/proc是用來(lái)提供內(nèi)核與進(jìn)程信息的虛擬文件系統(tǒng),由內(nèi)核自動(dòng)生成目錄下的內(nèi)容。不過(guò)需要我們?cè)O(shè)置一下,將/etc/init.d/rcS修改為:#!/bin/sh
ifconfigeth07
mount-tprocnone/proc對(duì)于mount-tprocnone/proc的解釋:通常情況下mount命令應(yīng)該寫為mount–text2/dev/hdb1/proc。但由于現(xiàn)在掛載的/proc是虛擬文件系統(tǒng),它不與任何物理硬盤分區(qū)相對(duì)應(yīng),因此在表示物理硬盤分區(qū)的位置用占位符none來(lái)表示。重啟開發(fā)板上的linux,顯示成功了:PleasepressEntertoactivatethisconsole.
startingpid232,tty'':'/bin/sh'
#ps
PID
Uid
VSZStatCommand
10
3088S
init
20
SW<[kthreadd]
30
SWN[ksoftirqd/0]
40
SW<[events/0]
50
SW<[khelper]
410
SW<[kblockd/0]
420
SW<[ksuspend_usbd]
450
SW<[khubd]
470
SW<[kseriod]
590
SW
[pdflush]
600
SW
[pdflush]
610
SW<[kswapd0]
620
SW<[aio/0]
1770
SW<[mtdblockd]
2260
SW<[rpciod/0]
2320
3092S
-sh
2330
3092R
ps
#八、利用udev構(gòu)建完整的/dev目錄高興地插入U(xiǎn)盤,內(nèi)核顯示識(shí)別到了U盤:#usb1-1:newfullspe
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年注冊(cè)安全工程師綜合復(fù)習(xí)試題
- 2025年配送司機(jī)安全協(xié)議
- 二零二五年度旅游服務(wù)業(yè)工傷保險(xiǎn)及勞動(dòng)合同執(zhí)行標(biāo)準(zhǔn)
- 二零二五年度交通事故車輛修復(fù)自行協(xié)商協(xié)議書
- 2025年度美容院與時(shí)尚雜志合作廣告推廣協(xié)議
- 2025年度高端服飾品牌客戶引薦提成合同
- 二零二五年度無(wú)子女財(cái)產(chǎn)分割與離婚協(xié)議書編制指南
- 2025年環(huán)保節(jié)能型冷卻塔合作協(xié)議書
- 上虞區(qū)水務(wù)集團(tuán)2025年度合同工工資待遇與工作保障合同
- 二零二五年度企業(yè)員工入職與員工培訓(xùn)與晉升合同
- 水產(chǎn)動(dòng)物育種學(xué)智慧樹知到期末考試答案章節(jié)答案2024年上海海洋大學(xué)
- 2024年全國(guó)中學(xué)生學(xué)聯(lián)賽廣西預(yù)選賽生物試卷(解析版)
- 部編版七年級(jí)道德與法治上冊(cè) 第一單元復(fù)習(xí)課件
- 試樁錨樁法檢測(cè)專項(xiàng)方案
- 簡(jiǎn)易疲乏量表中文版(BFI-C)
- ICU中心供氧故障應(yīng)急
- GB/T 29319-2024光伏發(fā)電系統(tǒng)接入配電網(wǎng)技術(shù)規(guī)定
- 中醫(yī)五臟心完整版本
- 《中國(guó)成人暴發(fā)性心肌炎診斷和治療指南2024》解讀
- JBT 14191-2023 管道帶壓開孔機(jī) (正式版)
- 采購(gòu)管理中的原材料采購(gòu)風(fēng)險(xiǎn)評(píng)估
評(píng)論
0/150
提交評(píng)論