系統(tǒng)軟件開發(fā)實踐報告_第1頁
系統(tǒng)軟件開發(fā)實踐報告_第2頁
系統(tǒng)軟件開發(fā)實踐報告_第3頁
系統(tǒng)軟件開發(fā)實踐報告_第4頁
系統(tǒng)軟件開發(fā)實踐報告_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、計算機科學與技術學院系統(tǒng)軟件開發(fā)實踐報告姓 名: 王冬升 學 號: 08123228 專 業(yè): 計算機科學與技術 班 級: 計科12-1班 指導教師: 張 博 2015年 4月 摘 要操作系統(tǒng)和編譯原理是大學計算機專業(yè)的必修課程。在這些課程的教學教程中,容易偏重于理論的介紹,而忽視了實踐環(huán)節(jié)。本課程設計是在完成C+程序設計、數(shù)據(jù)結構、操作系統(tǒng)、編譯技術教學后所進行的,全面綜合訓練學生的系統(tǒng)軟件開發(fā)能力關鍵字:編譯系統(tǒng)、Flex、Bison、操作系統(tǒng)、啟動、內(nèi)存管理目 錄1 借助Flex進行詞法分析 2 1.1實驗內(nèi)容 2 1.2 實驗要求 2 1.3 程序代碼 2 1.4 實驗結果 42 借助

2、Flex/Bison進行語法分析 5 2.1 實驗內(nèi)容 5 2.2 實驗要求 52.3 程序代碼 52.4 實驗步驟 52.5 實驗結果 73 Flex/Bison綜合實驗 7 3.1 實驗內(nèi)容 7 3.2 計算器具體需要實現(xiàn)的功能 7 3.3 實驗要求 7 3,4 程序代碼 8 3.5 實驗結果 114(操作系統(tǒng)實驗)lib0:熟悉實驗環(huán)境 114.1 實驗目的 114.2 實驗環(huán)境搭建 114.3 GCC編譯練習 124.4 GDB調(diào)試練習 125(操作系統(tǒng)實驗)lib1:啟動操作系統(tǒng) 135.1 實驗目的 135.2 實驗內(nèi)容 145.3 實驗步驟 145.4 操作系統(tǒng)啟動過程 155.

3、5 實模式與保護模式 166(操作系統(tǒng)實驗)lib2:物理內(nèi)存管理 166.1 實驗目的 166.2 實驗內(nèi)容 166.3 7實驗體會 8參考文獻 1借助Flex進行詞法分析1.1實驗內(nèi)容給定C語言的一個子集,具體內(nèi)容如下:1. 下面是語言的關鍵字: else if switch for int float return void while 所有的關鍵字都是保留字,并且必須是小寫。2. 下面是專用符號: + - * / = = != = ; , ( ) /* */3. 其他標記是標識符(ID) 和數(shù)字(NU ),通過下列正則表達式定義:ID = letter letter*NUM = dig

4、it digit*letter = a|.|z|A|.|Zdigit = 0|.|9 注:小寫和大寫字母是有區(qū)別的。4. 空格由空白、換行符和制表符組成??崭裢ǔ1缓雎?,除了它必須分開ID、NUM 關鍵字。5. 注釋用通常的C語言符號/* . . . */圍起來。注釋可以放在任何空白出現(xiàn)的位置(即注釋不能放在標記內(nèi))上,且可以超過一行。注釋不能嵌套1.2實驗要求編寫 LEX 源文件,實現(xiàn)C 語言子集的詞法分析功能,最后上機調(diào)試。要求編寫一個測試程序,以給定的測試文件作為輸入,輸出運行結果到輸出文件中1.3程序代碼Lex.l源碼:%#include #include #include int y

5、ywrap();int lineno=1;%delim t ws delim+ letter A-Za-zdigit 0-9id letter+number digit+enter nspchar (|(|)|;|=|,|+|-|*|/|=|=|!=)comment /*(*/|*)*/kwd (else|if|switch|for|int|float|return|void|while)%ws comment enter lineno+;kwd fprintf(yyout,%d行tkeywodt%sn,lineno,yytext);spchar fprintf(yyout,%d行tspcha

6、rt%sn,lineno,yytext);id fprintf(yyout,%d行tidentit%sn,lineno,yytext);number fprintf(yyout,%d行tnumbert%sn,lineno,yytext);.%int yywrap() return 1;int main(void)char infilename100;printf(輸入文件名:);scanf(%s,infilename);yyin = fopen(infilename,r);yyout = fopen(out,w);yylex();return 0;測試程序:1-1.cpp#includeusi

7、ng namespace std;int main() int a;int d=123456;float b=123.45;int e=9;a=(1+2-1)*4/2;if(ab)coutbendl;else couta=bendl;coutaendl;coutbendl;coutWelcome to c+ endl;return 0;1.4實驗結果實驗結果輸出到.out文件中,截圖示例:2借助Flex/Bison進行語法分析2.1實驗內(nèi)容利用附錄提供的C語言文法的相關參考資料,利用Yacc/Bison編寫一個C語言分析器。具體內(nèi)容:1) 利用語法分析器生成工具Bison編寫一個語法分析程序,

8、與詞法分析器結合能夠根據(jù)語言的上下文無關文法,識別輸入的單詞序列是否文法的句子2) 利用附錄提供的C語言文法的相關參考資料,利用Yacc/Bison編寫一個C語言分析器。 2.2 實驗要求1) 編寫 Bison源文件,實現(xiàn)C 語言的語法分析功能,最后上機調(diào)試。2) 要求編寫一個測試程序,以給定的測試文件作為輸入,輸出運行結果到輸出文件中。2.3程序代碼由于本實驗的lex源文件和yacc源文件代碼較長而且在“實驗附錄:C語言相關文法”文件夾中已經(jīng)給出相關源碼的鏈接,由于報告篇幅限制不再貼出源碼Test.測試文件源碼:void main() int i = 0;int j = 0;void t1(

9、) int i = 0;typedef unsigned int uint;uint xx;uint yy;2.4實驗步驟 1、flex -l input.lexbison -d cgrammar-new.y (產(chǎn)生頭文件和.c文件)2、comment函數(shù)調(diào)用yyinput,編譯會有鏈接錯誤,解決方法一,將lex.yy.c中的yyinput函數(shù)定義拷貝一份到input.lex, 重命名為my_yyinput, 或者將lex.yy.c中的#ifdef _cplusplusstatic int yyinput()#elsestatic int input()#endif改為static int y

10、yinput()上述問題出現(xiàn)的情形:詞法分析器的后綴名為.c, 而不是.cpp3、cgrammar-new.tab.c中如下程序段/*-.| yyparse. |-*/#ifdef YYPARSE_PARAM# if defined (_STDC_) | defined (_cplusplus)int yyparse (void *YYPARSE_PARAM)# elseint yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM;# endif#else /* ! YYPARSE_PARAM */#if defined (_STDC_) | defined

11、(_cplusplus)intyyparse (void)#elseintyyparse () ;#endif#endif改為int yyparse () 或者 int yyparse (void)4、lex.yy.c中,將下面語句注釋if ( ! yyin )yyin = stdin;5、解析之前,設置yyin為輸入文件指針extern FILE *yyin;if(!(yyin = fopen(filename,r) printf(the file not existn); exit(0);2.5實驗結果 實驗結果輸出到.out文件中,截圖示例:3 Flex/Bison綜合實驗3.1實驗內(nèi)容

12、使用flex和bison開發(fā)了一個具有全部功能的桌面計算器,能夠支持變量,過程,循環(huán)和條件表達式,使它成為一個雖然短小但是具有現(xiàn)實意義的編譯器。重點學習抽象語法樹的用法,它具有強大而簡單的數(shù)據(jù)結構來表示分析結果3.2計算器具體需要實現(xiàn)的功能變量命名;實現(xiàn)賦值功能;實現(xiàn)比較表達式(大于、小于、等于等等)實現(xiàn)if/then/else和do/while的流程控制;用戶可以自定義函數(shù);簡單的錯誤恢復機制3.3實驗要求編寫 Flex/Bison源文件,實現(xiàn)C 語言的語法分析功能,最后上機調(diào)試。要求編寫一個測試程序:1) 首先自定義兩個函數(shù)sq和avg,sq函數(shù)使用Newton方法來迭代計算平方根;avg

13、函數(shù)計算兩個數(shù)值的平均值。2) 利用定義好的函數(shù)進行計算,得到計算結果并顯示出來3.4程序代碼Cal.l源碼% #include cal.tab.h%option noyywrapinteger 0-9+dreal (0-9*.0-9+)ereal (0-9*.0-9+EedD+-?0-9+)real dreal|erealnl nplus +minus -times *divide /lp (rp )module %power % t ; /*skip any blanks */integer sscanf(yytext, %d, &eger); return INTEG

14、ER;real sscanf(yytext, %lf, &yylval.real);/*yylval = atof(yytext); it doesnt work under MSVSC*/ return REAL; plus return PLUS;minus return MINUS;times return TIMES;divide return DIVIDE;module return MODULE;power return POWER;lp return LP;rp return RP;nl return NL;. return yytext0;Cal.y源碼%#include #i

15、nclude %union double real; /* real value */ int integer; /* integer value */%token REAL%token INTEGER%start lines%token NUMBER NL%token PLUS MINUS TIMES DIVIDE MODULE POWER LP RP%type rexpr%type iexpr%left PLUS MINUS /*left associative */%left TIMES DIVIDE MODULE /*left associative */%left POWER%lef

16、t UNARYMINUS%lines: /* nothing */ | lines line NL | lines error NL yyerror();yyerrok; ;line : iexpr printf(%dn,$1); | rexpr printf(%lfn,$1); ;iexpr: INTEGER $ = $1; | iexpr PLUS iexpr $ = $1 + $3; | iexpr MINUS iexpr $ = $1 - $3; | iexpr TIMES iexpr $ = $1 * $3; | iexpr DIVIDE iexpr if($3) $ = $1 /

17、$3; else $ = $1; printf (stderr, %d.%d-%d.%d: division by zero, 3.first_line, 3.first_column, 3.last_line, 3.last_column); | iexpr MODULE iexpr $ = $1 % $3; | iexpr POWER iexpr $ = pow($1, $3); | MINUS iexpr %prec UNARYMINUS $ = - $2; | LP iexpr RP $ = $2; | LP iexpr error $ = $2; yyerror(missing );

18、 yyerrok; | PLUS iexpr %prec UNARYMINUS $ = $2; rexpr :REAL $ = $1; | rexpr PLUS rexpr $ = $1 + $3; | rexpr MINUS rexpr $ = $1 - $3; | rexpr TIMES rexpr $ = $1 * $3; | rexpr DIVIDE rexpr if ($3)$ = $1 / $3; else $ = $1; printf (stderr, %d.%d-%d.%d: division by zero, 3.first_line, 3.first_column, 3.l

19、ast_line, 3.last_column); | rexpr POWER rexpr $ = pow($1,$3); | LP rexpr RP $ = $2; | LP rexpr error $ = $2; yyerror(missing ); yyerrok; | MINUS rexpr %prec UNARYMINUS $ = -$2; | PLUS rexpr %prec UNARYMINUS $ = $2; | iexpr PLUS rexpr $ = (double)$1 + $3; | iexpr MINUS rexpr $ = (double)$1 - $3; | ie

20、xpr TIMES rexpr $ = (double)$1 * $3; | iexpr DIVIDE rexpr if($3) $ = (double)$1 / $3; else $ = $1; printf (stderr, %d.%d-%d.%d: division by zero, 3.first_line, 3.first_column, 3.last_line, 3.last_column); | iexpr POWER rexpr $ = pow(double)$1,$3); | rexpr PLUS iexpr $ = $1 + (double)$3; | rexpr MINU

21、S iexpr $ = $1 - (double)$3; | rexpr TIMES iexpr $ = $1 * (double)$3; | rexpr DIVIDE iexpr if($3) $ = $1 / (double)$3; else $ = $1; printf (stderr, %d.%d-%d.%d: division by zero, 3.first_line, 3.first_column, 3.last_line, 3.last_column); | rexpr POWER iexpr $ = pow($1,(double)$3); ;%void main() yypa

22、rse();int yyerror(char* msg)printf(Error: %s encountered n, msg);3.5實驗結果實驗結果截圖:4(操作系統(tǒng)實驗)lib0:熟悉實驗環(huán)境4.1實驗目的1) 了解操作系統(tǒng)開發(fā)實驗環(huán)境2) 熟悉命令行方式的編譯、調(diào)試工程3) 掌握基于硬件模擬器的調(diào)試技術4) 熟悉C語言編程和指針的概念5) 了解X86匯編語言4.2實驗環(huán)境搭建1) 在線實驗-基于實驗樓在線平臺2) Windows下基于MingW進行實驗3) Windows下基于VirtualBox or VMWare進行實驗4) 在MAC OS下進行實驗5) 手動在物理PC中安裝環(huán)境4

23、.3 GCC編譯練習采用實驗環(huán)境:在線實驗-基于實驗樓在線平臺gcc示例:#includeint main(void)printf(hello!n);return 0;在實驗環(huán)境中右鍵-從模板創(chuàng)建-空文件,將上述示例代碼輸入1) 保存為hello.c打開命令行,輸入以下命令:2) 編譯:gcc -Wall hello.c -o hello3) 執(zhí)行:./hello操作及結果截圖:4.4 GDB調(diào)試練習 1)輸入命令:gcc -o hello hello.c g進行編譯 2)輸入命令:gdb進入調(diào)試 3)依次輸入以下命令熟悉gdb調(diào)試file hello:進入hello文件run:運行hello

24、break 1:在第一行插入斷點next:單步執(zhí)行下一行語句clear 1:清除第一行的斷點list :顯示hello文件的內(nèi)容quit:退出gdb調(diào)試對應命令執(zhí)行結果截圖:GDB的其它調(diào)試命令補充:next :單步到程序源代碼的下一行,不進入函數(shù)。nexti :單步一條機器指令,不進入函數(shù)。step :單步到下一個不同的源代碼行(包括進入函數(shù))。stepi :單步一條機器指令他們功能各不相同,區(qū)別在于單步的“跨度”上。5(操作系統(tǒng)實驗)lib1:啟動操作系統(tǒng)5.1實驗目的操作系統(tǒng)是一個軟件,也需要通過某種機制加載并運行它。在這里我們將通過另外一個更加簡單的軟件-bootloader來完成這些

25、工作。為此,我們需要完成一個能夠切換到x86的保護模式并顯示字符的bootloader,為啟動操作系統(tǒng)ucore做準備。lab1提供了一個非常小的bootloader和ucore OS,整個bootloader執(zhí)行代碼小于512個字節(jié),這樣才能放到硬盤的主引導扇區(qū)中。通過分析和實現(xiàn)這個bootloader和ucore OS,讀者可以了解到:1)計算機原理CPU的編址與尋址: 基于分段機制的內(nèi)存管理CPU的中斷機制外設:串口/并口/CGA,時鐘,硬盤2)Bootloader軟件編譯運行bootloader的過程調(diào)試bootloader的方法PC啟動bootloader的過程ELF執(zhí)行文件的格式和

26、加載外設訪問:讀硬盤,在CGA上顯示字符串3)ucore OS軟件編譯運行ucore OS的過程ucore OS的啟動過程調(diào)試ucore OS的方法函數(shù)調(diào)用關系:在匯編級了解函數(shù)調(diào)用棧的結構和處理過程中斷管理:與軟件相關的中斷處理外設管理:時鐘5.2實驗內(nèi)容lab1中包含一個bootloader和一個OS。這個bootloader可以切換到X86保護模式,能夠讀磁盤并加載ELF執(zhí)行文件格式,并顯示字符。而這lab1中的OS只是一個可以處理時鐘中斷和顯示字符的幼兒園級別OS。5.3實驗步驟熟悉以下命令,掌握操作系統(tǒng)的啟動過程:1) make(ucore.img的生成過程)2) make V=(g

27、cc把c的源代碼編譯成.o的目標文件 ld會把這些目標文件呢會轉換成一個執(zhí)行程序,這里面會轉換成這個bootblock.out這個實際上是可以理解為是一個Bootloader一個執(zhí)行程序,第一個是Bootloader 第二叫kernel)3)啟動系統(tǒng):make qemu4)啟動并調(diào)試:make debug:進入debug模式n(執(zhí)行下一行代碼)p ph(顯示當前值)continue(繼續(xù)執(zhí)行)ctrl+c(中斷)quit(推出5.4操作系統(tǒng)啟動過程當X86一開始加電時候,啟動是實模式(實地址尋址模式)(早期的為了ss向下兼容以前的80X86一開始啟動是16位的實模式)第一條地址:段地址寄存器C

28、SCS和EIP結合在一起來決定它啟動的第一條地址:按實模式的尋址方式:cs(base)基址+EIP-bios(指向bios)這個bios固件會去加載磁盤或者硬盤的第一個主引導扇區(qū)(即執(zhí)行0號扇區(qū) lab1中的bootloader)它完成來對我們說的這個操作系統(tǒng) uCore的進一步加載Bootloader的工作:1)要從實模式切換到保護模式,就是從實模式的16位的尋址空間切換到了32位的尋址空間尋址空間:從1M(物理地址=左移4位的段地址+偏移地址)變?yōu)?G,段機制可以正常工作了。對系統(tǒng)寄存器CRO(或者叫控制寄存器 )把它的第0號bit置成1那么就意味著現(xiàn)在的系統(tǒng)我們的CPU會進入到保護模式2

29、)就是讀取kernel 就是uCore的代碼,CS EIP的值指向我們操作系統(tǒng)內(nèi)核所在內(nèi)存中的起始點,之后就相當于是把控制權交給了uCore OS去執(zhí)行5.5實模式與保護模式(1) 實模式在bootloader接手BIOS的工作后,當前的PC系統(tǒng)處于實模式(16位模式)運行狀態(tài),在這種狀態(tài)下軟件可訪問的物理內(nèi)存空間不能超過1MB,且無法發(fā)揮Intel 80386以上級別的32位CPU的4GB內(nèi)存管理能力。實模式將整個物理內(nèi)存看成分段的區(qū)域,程序代碼和數(shù)據(jù)位于不同區(qū)域,操作系統(tǒng)和用戶程序并沒有區(qū)別對待,而且每一個指針都是指向實際的物理地址。這樣,用戶程序的一個指針如果指向了操作系統(tǒng)區(qū)域或其他用戶程序區(qū)域,并修改了內(nèi)容,那么其后果就很可能是災難性的。通過修改A20地址線可以完成從實模式到保護模式的轉換(2) 保護模式只有在保護模式下,80386的全部32根地址線有效,可尋址高達4G字節(jié)的線性地址空間和物理地址空間,可訪問64TB(有214個段,每個段最大空間為232

溫馨提示

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

評論

0/150

提交評論