操作系統(tǒng)課程設(shè)計_第1頁
操作系統(tǒng)課程設(shè)計_第2頁
操作系統(tǒng)課程設(shè)計_第3頁
操作系統(tǒng)課程設(shè)計_第4頁
操作系統(tǒng)課程設(shè)計_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、中南大學操作系統(tǒng)課程設(shè)計實驗報告題 目:多用戶多任務(wù)的類操作系統(tǒng)學 院:信息科學與工程學院姓 名:班 級:日 期:2014/07目錄概述 課程設(shè)計要求 設(shè)計的基本原理和概念總體設(shè)計:實現(xiàn)的方法和主要技術(shù)路線 1總體功能模塊圖 2總體功能流圖詳細設(shè)計:模塊內(nèi)部的流程實現(xiàn)算法運行結(jié)果完成的情況使用說明 實驗總結(jié) 參考文獻 附件:源程序代碼概述操作系統(tǒng)課程主要講述的內(nèi)容是多道操作系統(tǒng)的原理與技術(shù),與其它計算機原理、編譯原理、匯編語言、計算機網(wǎng)絡(luò)、程序設(shè)計等專業(yè)課程關(guān)系十分密切。本課程設(shè)計的目的綜合應(yīng)用學生所學知識,建立系統(tǒng)和完整的計算機系統(tǒng)概念,理解和鞏固操作系統(tǒng)基本理論、原理和方法,掌握操作系統(tǒng)開

2、發(fā)的基本技能。課程設(shè)計要求采用VC、VB、java或C等編程語言,模擬開發(fā)一個多用戶多任務(wù)的類操作系統(tǒng)軟件。要求如下:模擬進程調(diào)度算法,模擬各種進程調(diào)度算法,并能管理各種進程調(diào)度算法的演示過程。模擬各種內(nèi)存分配算法及回收過程,并能動態(tài)演示。結(jié)合進程調(diào)度算法,能為進程模擬分配內(nèi)存,并設(shè)計一個跟蹤該內(nèi)存模擬分配的進程或線程,記錄內(nèi)存分配的結(jié)果;模擬多用戶登錄管理過程,能允許多個用戶登錄,為每個用戶建立進程或線程,并進行進程管理;能模擬文件系統(tǒng)管理,進程可以對文件系統(tǒng)(包括文件和目錄)進行讀、寫、創(chuàng)建、刪除、打開、關(guān)閉等操作;模擬磁盤管理過程,結(jié)合文件系統(tǒng)管理,顯示磁盤管理的結(jié)構(gòu)和文件在磁盤上的分布

3、情況。能模擬進程通信管理,用戶之間可以相互通信交流;最好能采用類似于Windows的窗口界面。設(shè)計的基本原理和概念本系統(tǒng)軟件是模擬操作系統(tǒng)的整個工作過程,主要功能包括多用戶登錄管理,文件與用戶管理,進程與存儲管理,以及系統(tǒng)進程管理。多用戶操作系統(tǒng)允許多個不同用戶同時使用計算機的資源。操作系統(tǒng)必須確保均衡地滿足各個用戶的要求,他們使用的各個程序都具有足夠且獨立的資源,從而使一個用戶的問題不會影響到整個用戶群。在本系統(tǒng)中,將用戶分為管理員用戶和普通用戶。登陸時可選擇,若選擇管理員用戶登陸,則對各用戶有管理權(quán)限(添加或刪除),對文件系統(tǒng)不僅有讀寫權(quán)限,還能新建、刪除、修改文件或目錄等;若選擇普通用戶

4、登陸,則只能查看用戶,且只能讀文件。多用戶多級目錄的文件系統(tǒng):通過具體的文件存儲空間的管理、文件的物理結(jié)構(gòu)、目錄結(jié)構(gòu)和文件操作的實現(xiàn),加深對文件系統(tǒng)內(nèi)部功能和實現(xiàn)過程的理解。 在本系統(tǒng)中,文件與用戶管理相結(jié)合,實現(xiàn)了以下幾項功能:查看文件目錄結(jié)構(gòu)、文件屬性、磁盤屬性、磁盤塊分配位示圖、索引節(jié)點分配位示圖、用戶管理(管理員有該權(quán)限),查看用戶、新建文件/目錄(管理員權(quán)限)、刪除文件/目錄(管理員權(quán)限),讀寫文件(普通用戶只讀)。進程與存儲管理系統(tǒng):即模擬cpu調(diào)度和內(nèi)存分配。作業(yè)進入內(nèi)存中,由CPU分配產(chǎn)生PCB屬性,并通過PCB記錄進程狀態(tài),實驗即以PCB代表進程模擬調(diào)度過程;在多道系統(tǒng)中,多

5、道系統(tǒng)中,當就緒進程數(shù)大于處理機數(shù)時,須按照某種策略決定哪些進程優(yōu)先占用處理機,本實驗采用優(yōu)先級;進程調(diào)度時,規(guī)定若就緒隊列進程數(shù)少于6個,則自動從后備隊列調(diào)入一個作業(yè);系統(tǒng)會將占有較多資源、預(yù)期結(jié)果不符合要求的進程自動掛起,并回收所占資源,而本實驗設(shè)置為手動掛起;在適宜條件下,系統(tǒng)會將掛起的進程自動解掛,而且只解掛到就緒隊列;本實驗為簡化操作,設(shè)置為手動解掛,若解掛條件合適(即CPU各種資源可用),則解掛到就緒隊列,并分配內(nèi)存;若解掛條件不適宜,則解掛至后備隊列,但不分配內(nèi)存。系統(tǒng)進程管理器:即任務(wù)管理器。操作系統(tǒng)是一個介于軟件和硬件之間的特殊硬件,一方面分配硬件資源另一方面支持軟件在它上面

6、的實現(xiàn),如何實時地監(jiān)控和掌握系統(tǒng)軟硬件工作的狀態(tài)、資源分配和使用的情況,對計算機用戶而言十分重要,于是就有了任務(wù)管理器這樣的實時監(jiān)控窗口。通過這個窗口我們可以了解到電腦所有進程運行狀況,并對運行的進程加于管理和控制,正如在本系統(tǒng)中,啟動進程管理器后,可以通過”獲取進程”功能來獲得本計算機啟動的進程,以及與該進程相關(guān)的信息,其中包括的信息有:進程映像名稱,進程的PID、會話名稱、會話次數(shù)以及內(nèi)存使用,我們可以通過這些信息來了解計算機中每個進程的使用狀況。同時我們可以在進程管理器上選中一個要終止的的進程,右擊選擇關(guān)閉方式,如“根據(jù)名稱關(guān)閉進程”或“根據(jù)PID關(guān)閉進程”功能按鈕,該進程被終止執(zhí)行并退

7、出進程列表,此按鈕實現(xiàn)的功能正如我們電腦任務(wù)管理器的“進程”功能,當電腦執(zhí)行程序不能通過關(guān)閉窗口進行正常的關(guān)閉時,可以借助此辦法來關(guān)閉進程。其中還包括了關(guān)閉進程樹和刷新進程列表的功能。磁盤管理:磁盤格式化時,系統(tǒng)把磁盤存儲空間分成許多磁道。每個磁道又分成若干個扇區(qū)(又叫做磁盤塊)。之后用fdisk命令對硬盤進行分區(qū),即使只有一個分區(qū),也必須用fdisk命令進行分區(qū)。分區(qū)的目的,就是制作文件卷,形成文件系統(tǒng)。一個文件卷一般都被劃分成引導扇區(qū)、文件系統(tǒng)管理區(qū)和文件數(shù)據(jù)區(qū)。其中,文件數(shù)據(jù)區(qū)用來存放系統(tǒng)文件和用戶文件。用戶可以通過文件系統(tǒng)提供的API,創(chuàng)建、打開、關(guān)閉和對文件進行讀寫。當用戶的文件不再

8、需要時,就應(yīng)該刪除。把一個文件放到磁盤上時,可以組織成連續(xù)文件、鏈接文件或索引文件等。因此,磁盤空間的分配方法也有兩種,一種是連續(xù)空間的分配,一種是不連續(xù)空間的分配(又叫動態(tài)分配)。四、總體設(shè)計 1總體功能模塊及關(guān)系圖系統(tǒng)進程管理文件與用戶管理多用戶多任務(wù)類操作系統(tǒng)系統(tǒng)進程管理文件與用戶管理多用戶多任務(wù)類操作系統(tǒng)多用戶登陸界面磁盤管理磁盤管理進程與存儲管理進程與存儲管理 2總體功能流圖開始開始初始化登陸界面初始化登陸界面管理員用戶登陸?管理員用戶登陸?文件與用戶管理系統(tǒng)進程管理進程與存儲管理文件與用戶管理系統(tǒng)進程管理進程與存儲管理內(nèi)存分配算法進程控制進程調(diào)度算法任務(wù)管理器磁盤屬性及分配查看及管

9、理用戶文件及目錄管理內(nèi)存分配算法進程控制進程調(diào)度算法任務(wù)管理器磁盤屬性及分配查看及管理用戶文件及目錄管理五、詳細設(shè)計(一)多用戶操作系統(tǒng)(1)數(shù)據(jù)結(jié)構(gòu)及主要函數(shù)public class LoginView extends JFrameJFrame jframe = new JFrame(歡迎登陸系統(tǒng));private FilesysServer fss1= null;int sw=(int) Toolkit.getDefaultToolkit().getScreenSize().getWidth(); int sh=(int)Toolkit.getDefaultToolkit().getScr

10、eenSize().getHeight();public LoginView(FilesysServer fss)this.fss1 = fss;/初始化面板 JPanel loginPanel = new JPanel(); JLabel titleJLable = new JLabel(); titleJLable.setText(歡迎登陸系統(tǒng)); titleJLable.setSize(500,200); /用戶面板 JPanel userPanel = new JPanel(); userPanel.setLayout(null); JButton adminButton = new

11、JButton(); adminButton.setText(管理員用戶登陸); JButton userButton = new JButton(); userButton.setText(普通用戶登陸); 。(二)文件與用戶管理本系統(tǒng)分兩種用戶:管理員用戶和普通用戶,實現(xiàn)文件系統(tǒng)的模擬管理與查看過程。管理員用戶對文件系統(tǒng)可以進行創(chuàng)建用戶、刪除用戶、創(chuàng)建文件、刪除文件、創(chuàng)建目錄、刪除目錄、讀文件、寫文件、打開文件、關(guān)閉文件、顯示目錄等操作;普通用戶只能讀文件和查看用戶。并且加入磁盤管理功能,在查看/創(chuàng)建/刪除文件等操作時時,顯示文件屬性、磁盤屬性、磁盤分配情況。索引節(jié)點分配情況,動態(tài)實時的掌

12、握內(nèi)存分配。(1)數(shù)據(jù)結(jié)構(gòu)及主要函數(shù)public class MyFile public int fsize;public String fname;public String ftime;public String fcont;public int fownid;public int fgrpid;public int fmode;public class Dir /文件名36B/TOTAL36Bpublic String fname;/文件名15Bpublic int findex;/INODE號3Bpublic String pname;/父文件名15Bpublic int pindex

13、;/父INODE號3Bpublic class Disk public final static int DISKSIZE=100*512;/磁盤大小public final static int INUM=80;/inode數(shù)量 public final static int BNUM=100;/塊數(shù)量512B*100 = 51200Bpublic final static int BSIZE=512;/塊大小public final static int ISIZE=64;/inode大小64B * 80 = 5120Bpublic final static int DSIZE=36;/d

14、ir大小36B * 14 512Bpublic final static int BASEB=11;/不能使用的塊public class Inode /索引節(jié)點信息64B/TOTAL NOW59Bpublic int fsize;/文件大小 6Bpublic int fblock;/文件塊數(shù) 6Bpublic int faddr;/直接塊號 4*3Bpublic int fadd1;/一級塊號 3Bpublic int fownid;/所有者ID6Bpublic int fgrpid;/所在組ID6Bpublic int fmode;/文件類型權(quán)限6B (d/- + 二進制)public S

15、tring ftime;/最近修改時間14B (20XXXXXXXXXX)public Inode()faddr=new int4;public class SuperBlock public int bitindex;/空余塊位示圖100Bpublic int bitblock;/空余節(jié)點位示圖120Bpublic int freindex;/剩余的節(jié)點5Bpublic int freblock;/剩余的塊5B(2)流程圖文件瀏覽器文件瀏覽器管理員用戶?管理員用戶? NY磁盤管理查看文件及目錄查看與管理用戶磁盤管理查看文件及目錄查看與管理用戶索引節(jié)點分配磁盤塊分配磁盤屬性刪除用戶添加用戶查看

16、用戶文件屬性讀/寫文件刪除目錄新建目錄刪除文件新建文件索引節(jié)點分配磁盤塊分配磁盤屬性刪除用戶添加用戶查看用戶文件屬性讀/寫文件刪除目錄新建目錄刪除文件新建文件查看文件及目錄查看與管理用戶磁盤管理查看文件及目錄查看與管理用戶磁盤管理索引節(jié)點使用情況磁盤塊使用情況磁盤屬性查看用戶讀文件文件屬性索引節(jié)點使用情況磁盤塊使用情況磁盤屬性查看用戶讀文件文件屬性(三)進程與存儲管理3.1進程控制:利用簡單的結(jié)構(gòu)和控制方法模擬進程結(jié)構(gòu)、進程狀態(tài)和進程控制。用PCB表示整個進程實體,利用隨機數(shù)方法或鍵盤控制方法模擬進程執(zhí)行中產(chǎn)生的事件?;蛘呃檬髽嘶蛘哝I盤中斷的基于圖形接口方式的進程控制管理。數(shù)據(jù)結(jié)構(gòu):publ

17、ic class PCB private int PID;/進程idprivate int timeNeed;/運行所需的時間private int priority;/進程的優(yōu)先級private int state;/所處于的狀態(tài) 5個private int memoryNeed;/所需內(nèi)存private int startLocation;/開始的位置private PCB next;/下一個進程控制塊的句柄private Color color;/顏色private int pecent;/執(zhí)行的百分比public final static int state_running = 0;/

18、狀態(tài)標志位 0表示運行 1表示就緒 2表示掛起 3表示后備 4表示解掛public final static int state_ready = 1;/就緒public final static int state_hang = 2;/掛起public final static int state_reserve = 3;/后備public final static int state_resume = 3;/解掛public final static int state_block = 4;/阻塞public final static int state_dead = 5;/死亡/默認構(gòu)造p

19、ublic PCB()(2)主要函數(shù):public class Schedulingpublic boolean executeProcess()queue.sortQueue1();/對就緒隊列按優(yōu)先級排序public void schedulingProcess()/*調(diào)度進程進入ReadyQueue*/public boolean schedulingFromResume()/*從解掛隊列調(diào)度進程進入就緒隊列*/public boolean schedulingFromReserve()/*從后備隊列調(diào)度進程進入就緒隊列*/public void resumeProcess(PCB pc

20、b) /*結(jié)束一條進程*/public void addProcess(int timeNeed,int priority,int memoryNeed) /添加進程public boolean blockProcess()/*阻塞進程*/class resumeBlock extends Thread/*解除阻塞*/public boolean hangProcess()/*掛起進程*/class resumeHang extends ThreadPCB pcb;int time;public resumeHang(PCB pcb,int time)this.pcb = pcb;this.t

21、ime = time;/*解掛*/public int producePID()/隨機產(chǎn)生PID(3)算法設(shè)計創(chuàng)建進程:輸入進程的名稱,先判斷進程名是否已存在,若已存在,則創(chuàng)建進程失敗,需重新操作,創(chuàng)建進程成功后,新進程進入就緒隊列。若執(zhí)行態(tài)為空,將進程插入執(zhí)行態(tài)。阻塞進程:若當前有執(zhí)行進程,則將其阻塞,并將進程加入阻塞態(tài),若就緒隊列不為空,則就緒隊列第一個進程插入執(zhí)行態(tài);若當前無執(zhí)行進程 ,則阻塞失敗。喚醒進程:若當前阻塞態(tài)不為空,則將阻塞隊列第一個進程插入就緒態(tài);若當前阻塞態(tài)為空,則喚醒失敗。時間片到:若當前有執(zhí)行態(tài)進程,則插入就緒隊態(tài),并將就緒態(tài)第一個進程進入執(zhí)行態(tài);若當前無執(zhí)行進程,則

22、無執(zhí)行進程。結(jié)束進程:若當前有執(zhí)行進程,則結(jié)束進程,若當前就緒態(tài)不為空,則就緒態(tài)第一個進程進入執(zhí)行態(tài);若當前無執(zhí)行進程 ,則結(jié)束進程失敗。(4)流程圖: 開始開始輸入執(zhí)行命令輸入執(zhí)行命令輸入t輸入C輸入b輸入t輸入C輸入b N N N輸入進程名執(zhí)行態(tài)插入就緒態(tài)執(zhí)行態(tài)轉(zhuǎn)為阻塞態(tài) Y Y Y輸入進程名執(zhí)行態(tài)插入就緒態(tài)執(zhí)行態(tài)轉(zhuǎn)為阻塞態(tài)將進程插入就緒態(tài)將進程插入就緒態(tài)就緒態(tài)第一個結(jié)點插入執(zhí)行態(tài)就緒態(tài)第一個結(jié)點插入執(zhí)行態(tài)就緒態(tài)第一個結(jié)點插入執(zhí)行態(tài)就緒態(tài)第一個結(jié)點插入執(zhí)行態(tài)執(zhí)行態(tài)為空執(zhí)行態(tài)為空 N顯示進程信息顯示進程信息將進程插入執(zhí)行態(tài)顯示進程信息Y將進程插入執(zhí)行態(tài)顯示進程信息顯示進程信息顯示進程信息輸入

23、w輸入w執(zhí)行態(tài)為空 Y N執(zhí)行態(tài)為空阻塞態(tài)為空阻塞態(tài)為空 N N結(jié)束進程阻塞態(tài)插入就緒態(tài) Y Y結(jié)束進程阻塞態(tài)插入就緒態(tài)就緒態(tài)第一個結(jié)點插入執(zhí)行態(tài)就緒態(tài)第一個結(jié)點插入執(zhí)行態(tài)顯示進程信息顯示進程信息結(jié)束顯示進程信息結(jié)束顯示進程信息3.2進程調(diào)度:實現(xiàn)先來先服務(wù)FCFS、短作業(yè)優(yōu)先以及動態(tài)優(yōu)先級調(diào)度算法。我們可以根據(jù)創(chuàng)建進程的系統(tǒng)時鐘,取相對時鐘作為進程的到達時間,利用隨機數(shù)產(chǎn)生每個進程的估計運行時間。利用模擬系統(tǒng)中提供的算法分別計算其相應(yīng)的周轉(zhuǎn)時間和帶權(quán)周轉(zhuǎn)時間。(1)數(shù)據(jù)結(jié)構(gòu)及主要函數(shù)public class NewPCBDialog extends JDialog implements Ac

24、tionListenerprivate JLabel tips_priority;private JLabel tips_timeNeed;private JLabel tips_memoryNeed;private JTextField text_priority;private JTextField text_timeNeed;private JTextField text_memoryNeed;private JButton create;private MainFrame parentFrame;public NewPCBDialog(MainFrame frame)public vo

25、id init()public void actionPerformed(ActionEvent e) (2)算法設(shè)計:1、利用絕對時間和相對時鐘產(chǎn)生一組進程的到達時刻和運行時間。2、實現(xiàn)FCFS算法:根據(jù)進程的到達時間的先后次序來完成對若干進程的調(diào)度。3、實現(xiàn)算法:根據(jù)當前時間已經(jīng)到達進程的需要運行時間選取其中時間最小的進程最先運行。4、實現(xiàn)DPS算法:各進程的優(yōu)先權(quán)隨運行時間而改變,進程在就緒隊列中等待一個時間片,優(yōu)先權(quán)值加1;進程每運行一個時間片,優(yōu)先權(quán)值減3。然后調(diào)用 priority()函數(shù) 按照個進程的優(yōu)先級別的高低來決定進程在每個時間片的狀態(tài),并通過輸出函數(shù)顯示。5、計算每種算法

26、調(diào)度后,系統(tǒng)的平均周轉(zhuǎn)時間和平均帶權(quán)周轉(zhuǎn)時間。 (3)流程圖: 進程調(diào)度過程FCFS 算法 開 始FCFS 算法開 始創(chuàng)建數(shù)組,并初始化將數(shù)組中的進程按到達時間的順序排序獲取某進程執(zhí)行過程中到達的所有進程對獲取的所有進程按照短作業(yè)優(yōu)先進行排序得到進程的執(zhí)行序列依次執(zhí)行各個進程所有進程執(zhí)行完成結(jié) 束SJF算法SJF算法DPS算法(四)系統(tǒng)進程管理:任務(wù)管理器(1)數(shù)據(jù)結(jié)構(gòu)及主要函數(shù)public TaskList() super(任務(wù)管理器);this.addItem();this.pack();this.setVisible(true);this.setLocation(150, 100);(2

27、)任務(wù)管理器功能模塊六、完成的情況在課設(shè)期間,采用java編程語言,模擬開發(fā)一個多用戶多任務(wù)的類操作系統(tǒng)軟件,所實現(xiàn)的功能有:(1)模擬進程調(diào)度算法,模擬各種進程調(diào)度算法,并能管理各種進程調(diào)度算法的演示過程。(2)模擬各種內(nèi)存分配算法及回收過程,并能動態(tài)演示。結(jié)合進程調(diào)度算法,能為進程模擬分配內(nèi)存,并設(shè)計一個跟蹤該內(nèi)存模擬分配的進程或線程,記錄內(nèi)存分配的結(jié)果;(3)模擬多用戶登錄管理過程,能允許多個用戶登錄,為每個用戶建立進程或線程,并進行進程管理;(4)能模擬文件系統(tǒng)管理,進程可以對文件系統(tǒng)(包括文件和目錄)進行讀、寫、創(chuàng)建、刪除、打開、關(guān)閉等操作;(5)模擬磁盤管理過程,結(jié)合文件系統(tǒng)管理,

28、顯示磁盤管理的結(jié)構(gòu)和文件在磁盤上的分布情況。(6)采用類似于Windows的窗口界面。未實現(xiàn)模擬進程通信管理功能。運行及使用說明 進入系統(tǒng)后用戶可以選擇管理員用戶或者普通用戶登陸系統(tǒng),普通用戶擁有一般的操作權(quán)限,管理員用戶擁有一般操作權(quán)限和對用戶進行管理的權(quán)限。系統(tǒng)已設(shè)定的用戶名和密碼如下:管理員用戶:userId:1 用戶名:admin 密碼:admin 普通用戶:userId:2 用戶名:swm 密碼:swm 要增加或刪除用戶可登陸管理員用戶,在用戶管理進行操作 2、登陸以后用戶可進行如下操作:文件與用戶管理:* 用戶管理為管理員用戶權(quán)限,用戶可以在用戶文件夾中進行創(chuàng)建,刪除,插入等操作進

29、程與存儲管理:操作界面如下:用戶可在此創(chuàng)建新進程、或?qū)澾M程進行各種狀態(tài)轉(zhuǎn)換操作系統(tǒng)進程管理器:用戶可以查看當前系統(tǒng)進程的運行情況,并可結(jié)束某一進程實驗總結(jié) 本次課程設(shè)計,首先對操作系統(tǒng)的基礎(chǔ)知識和java編程所用的API進行了學習、鞏固和提高。程序采用的是java語言編程, 設(shè)計的功能包括多用戶登錄管理,文件與用戶管理,進程與存儲管理,以及系統(tǒng)進程管理。學習操作系統(tǒng)原理的時候,對很多原理性的知識并不能很好的理解消化,過后很快就忘記了。通過這次課程設(shè)計,我們更加深入的理解了操作系統(tǒng)的基本原理,特別是對各種進程調(diào)度算法有了更好的把握;對磁盤文件管理等操作系統(tǒng)原理性的知識也在實際操作過程中得到了增長

30、。在整個過程中,也遇到了各種各樣的問題,但經(jīng)過努力,問題大都得到了解決。經(jīng)過這次課程設(shè)計,我感覺到,對于一個大學生而言,我們不僅僅要學會理論知識是遠遠無法在以后的社會中立足的,我們要更加重視動手能力。對于很多問題,我們不僅要學會理論知識,更重要的是要在實際過程中不斷更新和改進自己的思維。很多問題需要通過實際操作,一點一點的解決問題來加深對知識和對問題本身的理解。也就是在這個過程中,我們發(fā)現(xiàn)問題和解決問題的能力也會有很大的提高。 參考文獻(1)胡志剛等. 計算機操作系統(tǒng). 中南大學出版社,2005(2)陳向群等. Windows內(nèi)核實驗教程. 機械工業(yè)出版社,2004(3)羅宇等. 操作系統(tǒng)課程

31、設(shè)計. 機械工業(yè)出版社,2005附:源程序代碼附錄資料:不需要的可以自行刪除 busybox詳解制作根文件系統(tǒng)詳解制作根文件系統(tǒng) 一、FHS(Filesystem Hierarchy Standard)標準介紹當我們在linux下輸入ls / 的時候,見到的目錄結(jié)構(gòu)以及這些目錄下的內(nèi)容都大同小異,這是因為所有的linux發(fā)行版在對根文件系統(tǒng)布局上都遵循FHS標準的建議規(guī)定。該標準規(guī)定了根目錄下各個子目錄的名稱及其存放的內(nèi)容:目錄名存放的內(nèi)容/bin必備的用戶命令,例如ls、cp等/sbin必備的系統(tǒng)管理員命令,例如ifconfig、reboot等/dev設(shè)備文件,例如mtdblock0、tty

32、1等/etc系統(tǒng)配置文件,包括啟動文件,例如inittab等/lib必要的鏈接庫,例如C鏈接庫、內(nèi)核模塊/home普通用戶主目錄/rootroot用戶主目錄/usr/bin非必備的用戶程序,例如find、du等/usr/sbin非必備的管理員程序,例如chroot、inetd等/usr/lib庫文件/var守護程序和工具程序所存放的可變,例如日志文件/proc用來提供內(nèi)核與進程信息的虛擬文件系統(tǒng),由內(nèi)核自動生成目錄下的內(nèi)容/sys用來提供內(nèi)核與設(shè)備信息的虛擬文件系統(tǒng),由內(nèi)核自動生成目錄下的內(nèi)容/mnt文件系統(tǒng)掛接點,用于臨時安裝文件系統(tǒng)/tmp臨時性的文件,重啟后將自動清除制作根文件系統(tǒng)就是要

33、建立以上的目錄,并在其中建立完整目錄內(nèi)容。其過程大體包括:編譯安裝busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目錄 利用交叉編譯工具鏈,構(gòu)建/lib目錄 手工構(gòu)建/etc目錄 手工構(gòu)建最簡化的/dev目錄 創(chuàng)建其它空目錄 配置系統(tǒng)自動生成/proc目錄 利用udev構(gòu)建完整的/dev目錄 制作根文件系統(tǒng)的jffs2映像文件 下面就來詳細介紹這個過程。二、編譯安裝busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目錄這些目錄下存儲的主要是常用命令的二進制文件。如果要自己編寫這幾百個常用命令的源程序,my god, 這簡直是一個噩夢!好

34、在我們有嵌入式Linux系統(tǒng)的瑞士軍刀busybox,事情就簡單很多。1、從 HYPERLINK / / 下載busybox-1.7.0.tar.bz22、tar xjvf busybox-1.7.0.tar.bz2解包3、修改Makefile文件175 ARCH ?= arm176 CROSS_COMPILE ?= arm-linux- 4、make menuconfig配置busyboxbusybox配置主要分兩部分。第一部分是Busybox Settings,主要編譯和安裝busybox的一些選項。這里主要需要配置:1)、Build Options - Build BusyBox as

35、a static binary (no shared libs),表示編譯busybox時,是否靜態(tài)鏈接C庫。我們選擇動態(tài)鏈接C庫。2)、Installation Options - Applets links (as soft-links) - (X) as soft-links,表示安裝busybox時,將各個命令安裝為指向busybox的軟鏈接還是硬鏈接。我們選擇軟鏈接。3)、Installation Options - (/work/nfs_root/fs_mini3) BusyBox installation prefix,表示busybox的安裝位置。我們選擇/work/nfs_r

36、oot/fs_mini34)Busybox Library Tuning。保留Command line editing以支持命令行編輯;保留History size以支持記憶歷史命令;選中Tab completion和Username completion以支持命令自動補全 第二部分是Applets,他將busybox的支持的幾百個命令分門別類。我們只要在各個門類下選擇想要的命令即可。這里我們基本保持默認設(shè)置。1)選中Networking Utilities - httpd下的Enable -u option,以啟用http服務(wù)器的功能allows the server to run as a

37、 specific user5、編譯busyboxmake6、安裝busyboxmake install安裝完成后,可以看到在/work/nfs_root/fs_mini3目錄下生成了binsbinusr/binusr/sbin目錄,其下包含了我們常用的命令,這些命令都是指向bin/busybox的軟鏈接,而busybox本身的大小不到800K:dennisdennis-desktop:/work/nfs_root/fs_mini3$ lsbin linuxrc sbin usrdennisdennis-desktop:/work/nfs_root/fs_mini3$ ls -l bintot

38、al 740lrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 addgroup - busyboxlrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 adduser - busyboxlrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 ash - busybox-rwxr-xr-x 1 dennis dennis 749632 2010-04-03 23:57 busyboxlrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 cat

39、busybox 而普通PC機上的ls命令就有差不多80K的大?。?dennisdennis-desktop:/work/nfs_root/fs_mini3$ ls -l /bin/ls-rwxr-xr-x 1 root root 78004 2007-09-29 20:51 /bin/ls busybox以它嬌小的身軀容納了數(shù)以百計的命令代碼,實在是讓人佩服不已,其不愧嵌入式系統(tǒng)瑞士軍刀之美譽。據(jù)說,busybox的作者身患絕癥,這更讓人欽佩GNU開源軟件的作者們。 三、利用交叉編譯工具鏈,構(gòu)建/lib目錄 光有應(yīng)用程序(命令)是不夠的,因為應(yīng)用程序本身需要使用C庫的庫函數(shù),因此還必需制作fo

40、r ARM的C庫,并將其放置于/lib目錄。my god,要自己寫C庫的源代碼嗎?不用!還記得交叉編譯工具鏈的3個組成部分嗎?交叉編譯器、for ARM的C庫和二進制工具。哈哈,for ARM的C庫是現(xiàn)成的,我們只需要拷貝過來就可以了。遺憾的是:整個C庫目錄下的文件總大小有26M。而我們根文件系統(tǒng)所在分區(qū)不過區(qū)區(qū)16M而已,根本放不下。怎么辦呢? dennisdennis-desktop:/work/nfs_root/fs_mini3$ du -s -si /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib26M /work/tools/gcc-3.

41、4.5-glibc-2.3.6/arm-linux/lib 需要C庫目錄下所有的文件嗎?no,absolutely no! 讓我們來分析一下glibc庫目錄下內(nèi)容的組成。該目錄下的子目錄和文件共分8類: 目標文件,如crtn.o,用于gcc鏈接可執(zhí)行文件 libtool庫文件(.la),在鏈接庫文件時這些文件會被用到,比如他們列出了當前庫文件所依賴的其它庫文件,程序運行時無需這些文件 gconv目錄,里面是各種鏈接腳本,在編譯應(yīng)用程序時,他們用于指定程序的運行地址,各段的位置等 靜態(tài)庫文件(.a),例如libm.a,libc.a 動態(tài)庫文件 (.so、.so.0-9*) 動態(tài)鏈接庫加載器ld-

42、2.3.6.so、ld-linux.so.2 其它目錄及文件很顯然,第1、2、3、4、7類文件和目錄是不需要拷貝的。由于動態(tài)鏈接的應(yīng)用程序本身并不含有它所調(diào)用的C庫函數(shù)的代碼,因此執(zhí)行時需要動態(tài)鏈接庫加載器來為它加載相應(yīng)的C庫文件,所以第6類文件是需要拷貝的。除此之外,第5類文件當然要拷貝。但第5類文件的大小也相當大。dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ du -c -si *.so* 7.2M total 需要全部拷貝嗎?非也,非也!其實,需要哪些庫完全取決于要運行的應(yīng)用程序使用了哪些庫函數(shù)

43、。如果我們只制作最簡單的系統(tǒng),那么我們只需要運行busybox這一個應(yīng)用程序即可。通過執(zhí)行 dennisdennis-desktop:/work/nfs_root/fs_mini3$ arm-linux-readelf -a bin/busybox | grep Shared0 x00000001 (NEEDED) Shared library: libcrypt.so.10 x00000001 (NEEDED) Shared library: libm.so.60 x00000001 (NEEDED) Shared library: libc.so.6 可知:busybox只用到了3個庫:通

44、用C庫(libc)、數(shù)學庫(libm)、加密庫(libcrypt),因此我們只需要拷貝這3個庫的庫文件即可。但是每個庫都有4個文件,4個文件都要拷貝嗎?當然不是。 dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libcrypt.-*-rwxr-xr-x 1 dennis dennis 30700 2008-01-22 05:32 libcrypt-2.3.6.so-rw-r-r- 1 dennis dennis 23118 2008-01-22 05:32 libcrypt.alrwxrw

45、xrwx 1 dennis dennis 13 2008-12-22 15:38 libcrypt.so - libcrypt.so.1lrwxrwxrwx 1 dennis dennis 17 2008-12-22 15:38 libcrypt.so.1 - libcrypt-2.3.6.sodennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libm.-*-rwxr-xr-x 1 dennis dennis 779096 2008-01-22 05:31 libm-2.3.6.so-rw-r

46、-r- 1 dennis dennis 1134282 2008-01-22 05:32 libm.alrwxrwxrwx 1 dennis dennis 9 2008-12-22 15:38 libm.so - libm.so.6lrwxrwxrwx 1 dennis dennis 13 2008-12-22 15:38 libm.so.6 - libm-2.3.6.sodennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libc.-*-rwxr-xr-x 1 dennis dennis 14

47、35660 2008-01-22 05:48 libc-2.3.6.so-rw-r-r- 1 dennis dennis 2768280 2008-01-22 05:31 libc.a-rw-r-r- 1 dennis dennis 195 2008-01-22 05:34 libc.solrwxrwxrwx 1 dennis dennis 13 2008-12-22 15:38 libc.so.6 - libc-2.3.6.so 4個文件中的.a文件是靜態(tài)庫文件,是不需要拷貝的。另外3個文件是: 實際的共享鏈接庫:libLIBRARY_NAME-GLIBC_VERSION.so。當然需要拷貝

48、。 主修訂版本的符號鏈接,指向?qū)嶋H的共享鏈接庫:libLIBRARY_NAME.so.MAJOR_REVISION_VERSION,程序一旦鏈接了特定的鏈接庫,將會參用該符號鏈接。程序啟動時,加載器在加載程序前,會檢索該文件。所以需要拷貝。 與版本無關(guān)的符號鏈接,指向主修訂版本的符號連接(libc.so是唯一的例外,他是一個鏈接命令行:libLIBRARY_NAME.so,是為編譯程序時提供一個通用條目)。這些文件在程序被編譯時會被用到,但在程序運行時不會被用到,所以不必拷貝它。關(guān)于共享庫的2個符號鏈接的作用的特別說明:當我們使用gcc hello.c -o hello -lm編譯程序時,gc

49、c會根據(jù)-lm的指示,加頭(lib)添尾(.so)得到libm.so,從而沿著與版本無關(guān)的符號鏈接(libm.so - libm.so.6)找到libm.so.6并記錄在案(hello的ELF頭中),表示hello需要使用libm.so.6這個庫文件所代表的數(shù)學庫中的庫函數(shù)。而當hello被執(zhí)行的時候,動態(tài)鏈接庫加載器會從hello的ELF頭中找到libm.so.6這個記錄,然后沿著主修訂版本的符號鏈接(libm.so.6 - libm-2.3.6.so)找到實際的共享鏈接庫libm-2.3.6.so,從而將其與hello作動態(tài)鏈接??梢?,與版本無關(guān)的符號鏈接是供編譯器使用的,主修訂版本的符號

50、鏈接是供動態(tài)鏈接庫加載器使用的,而實際的共享鏈接庫則是供應(yīng)用程序使用的。通過以上分析,我們只需要拷貝3個庫(每個庫各1個主修訂版本的符號鏈接和1個實際的共享鏈接庫)以及動態(tài)鏈接庫加載器(1個符號鏈接和1個實體文件)。步驟如下:dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ mkdir /work/nfs_root/fs_mini3/lib dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp libcrypt-*

51、 /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l libcrypt.so.* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp libm-* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc

52、-2.3.6/arm-linux/lib$ cp -l libm.so.* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp libc-* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l libc.so.* /work/nfs_root/fs_mini3/lib dennisdennis-d

53、esktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l ld-* /work/nfs_root/fs_mini3/lib 四、手工構(gòu)建/etc目錄 /etc目錄存放的是系統(tǒng)程序的主配置文件,因此需要哪些配置文件取決于要運行哪些系統(tǒng)程序。即使最小的系統(tǒng)也一定會運行1號用戶進程init,所以我們至少要手工編寫init的主配置文件inittab。busybox的inittab文件的語法、語義與傳統(tǒng)的SYSV的inittab有所不同。 inittab文件中每個條目用來定義一個需要init啟動的子進程,并確定它的啟動方式,格式為:。例如

54、:ttySAC0:askfirst:-/bin/sh 表示子進程要使用的控制臺,若省略則使用與init進程一樣的控制臺 表示運行級別,busybox init程序這個字段沒有意義 表示init進程如何控制這個子進程 sysinit:系統(tǒng)啟動后最先執(zhí)行,只執(zhí)行一次,init進程等待它結(jié)束后才繼續(xù)執(zhí)行其它動作 wait:系統(tǒng)執(zhí)行完sysinit條目后執(zhí)行,只執(zhí)行一次,init進程等待它結(jié)束后才繼續(xù)執(zhí)行其它動作 once:系統(tǒng)執(zhí)行完wait條目后執(zhí)行,只執(zhí)行一次,init進程不等待它結(jié)束 respawn:啟動完once進程后,init進程監(jiān)測發(fā)現(xiàn)子進程退出時,重新啟動它 askfirst:啟動完re

55、spawn進程后,與respawn類似,不過init進程先輸出” Please press Enter to activate this console“,等用戶輸入回車后才啟動子進程 shutdown:當系統(tǒng)關(guān)機時 restart:Busybox中配置了CONFIG_FEATURE_USE_INITAB,并且init進程接收到SIGUP信號時執(zhí)行,先重新讀取、解析/etc/inittab文件,再執(zhí)行restart程序 ctrlaltdel:按下ctrl+alt+del鍵時執(zhí)行,不過在串口控制臺中無法輸入它 表示進程對應(yīng)的二進制文件。如果前面有-號,表示該程序是“可以與用戶進行交互的”我們制作

56、最簡單的/etc/inittab文件,其內(nèi)容如下::sysinit:/etc/init.d/rcS:askfirst:-/bin/sh:ctrlaltdel:/sbin/reboot:shutdown:/bin/umount -a r 制作最簡單的腳本程序文件/etc/init.d/rcS,其內(nèi)容如下: #!/bin/shifconfig eth0 7修改shell腳本文件/etc/init.d/rcS的權(quán)限,以使其可被執(zhí)行:# chmod a+x /etc/init.d/rcS五、手工構(gòu)建最簡化的/dev目錄 在linux機器上,執(zhí)行l(wèi)s /dev可看到幾百個設(shè)備文件,我需要手工創(chuàng)建它們嗎?

57、maybe,我只需要手工創(chuàng)建幾個設(shè)備文件!我怎么知道我應(yīng)該創(chuàng)建哪幾個設(shè)備文件呢?管它呢,先看看開發(fā)板上可愛的linux的反應(yīng)再說。 啟動Linux操作系統(tǒng),顯示: VFS: Mounted root (nfs filesystem).Freeing init memory: 112KWarning: unable to open an initial console. 這說明,內(nèi)核已經(jīng)成功掛載根文件系統(tǒng),但卻未能成功啟動第1個用戶進程init。通過錯誤消息“unable to open an initial console”搜索內(nèi)核源代碼,找到init/main.c文件。748 static

58、int noinline init_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(const char _user *) /dev/console, O_RDWR, 0) 0)757 printk(KERN_WARNING Warning: unable to open an initial console.n);758 759 (v

59、oid) 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 Failed to execute %sn,765 ramdisk_execute_command);766 767 768 /*769 * We try each of these until one succeeds.770 *771 * The Bourne shell can be used inst

60、ead of init if we are772 * trying to recover a really broken machine.773 */774 if (execute_command) 775 run_init_process(execute_command);776 printk(KERN_WARNING Failed to execute %s. Attempting 777 defaults.n, execute_command);778 779 run_init_process(/sbin/init);780 run_init_process(/etc/init);781

溫馨提示

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

評論

0/150

提交評論