nachos中文教程java_Nachos3.4系列-2 Makefile 与Nachos中文教程 【转】
本文轉自http://blog.sina.com.cn/s/blog_a2dded3d010195hf.html
Nachos系列免責說明:本系列博客所用Nachos源代碼及文檔均來自互聯網,如有侵權,請私信,馬上刪除。此外,Nachos為高校操作系統實習課程所用,本系列博客只為讀者提供思路,以避免浪費不必要的時間,這是博主寫這個系列的初衷所在。如果出現作業抄襲現象,博主一概不負責,希望讀者實事求是,自己思考!
第一部分 Makefile簡介
Linux--Makefile簡介下載:http://pan.baidu.com/share/link?shareid=850895810&uk=2822100601
很多window的程序員都不知道makefile這個東東,因為現在主流的IDE都把編譯工作自動化完成了,但是作為一個敢于挑戰自己工程能力的人,makefile還是要懂。
Makefile類似與一個shell腳本,里面定義了如何編譯眾多的頭文件,源文件。一旦寫好,整個工程自動編譯,極大提高了開發效率。大多數IDE都有類似的命令,如Delphi的make,Visual C++的nmake和Linux GUN的gmake。
1.回憶一下上一篇博客的cd到nachos/code目錄下的make,我們應該是執行了nachos/code下的Makefile,打開此Makefile:
開頭的MAKE=gmake是說,以后的gmake都可以用$(MAKE)代替,這樣做的好處是跨平臺很方便,應為只需要把MAKE=nmake就可以方便移植到visual 平臺,對于程序規范化書寫,向伯克利那幫大佬們致敬!
接下來的all:是要執行的所有make,我們可以看到執行該make之后其實是對每個代碼包里面的.cc或者.h文件里面都做makefile,其中相應的makefile寫在相應的代碼包中。以Threads為例,code/threads包下面也有makefile,那個makefile才執行了編譯code/threads包下面.cc(.h)的操作。在以后的編程中,比如我們只修改了threads代碼包下面的.cc或者.h文件,我們就可以直接cd到threads/下面執行make,而不用把整個工程編譯。
可能你會覺得奇怪,為什么要寫$(MAKE) nachos和$(MAKE) depend兩次呢,這是因為在Makefile.common文件中,既有nachos:(其中$(PROGRAM)的值就是nachos) 又有depend:,一次make只能生成一個,如果只是make,那么會自動尋找第一個,所以要寫兩次,在depend:里面,只要是為了應對不同的機型采取的編譯。
2.此外,相信不少人已經注意到了code包下面同時還有Makefile.common,Makefile.dep等文件,我們打開Makefile.dep文件,看到如下:
可見,makefile.dep是為了說明不同的機型所采用的,我所用的處理器就是i386的,所以Host=-DHOST_i386是沒錯的,如果你的機型是Sun APARC 或者HP,那么把相應的注釋除去就好。
再看makefile.common
其中定義了一些其他makefile文件可能會用到的常量,比如$(CC)就是g++,這個語句在以后還會遇見,提前注意一下。
另外,注意THREAD_H=../threads/copyright.h\
../threads/list.h\
../threads/scheduler.h\
../threads/synch.h \
../threads/synchlist.h\
../threads/system.h\
../threads/thread.h\
../threads/utility.h\
../machine/interrupt.h\
../machine/sysdep.h\
../machine/stats.h\
../machine/timer.h這種定義方法,這樣以后要用到這些頭文件時,直接一個THREAD_H就可一代表了,/代表換行符,是為了程序的美觀易讀。makefile.common的例外一些內容,下面講解。
3.具體代碼Makefile
以code/threads下的makefile為例:
注意以前定義過的常量,如$(THREAD_H),$(THREAD_C),$(THREAD_O),等等
此外,需要注意的是,DEFINES=-DTHREADS這行的意義在程序中可以用#ifdef的宏命令檢測到,這在以后文件系統中有重要應用。
main.o: ../threads/main.cc ../threads/copyright.h ../threads/utility.h \
../threads/bool.h ../machine/sysdep.h ../threads/copyright.h \
/usr/include/stdio.h /usr/include/features.h \
/usr/include/i386-linux-gnu/bits/predefs.h \
/usr/include/i386-linux-gnu/sys/cdefs.h \
/usr/include/i386-linux-gnu/bits/wordsize.h \
/usr/include/i386-linux-gnu/gnu/stubs.h \
/usr/include/i386-linux-gnu/gnu/stubs-32.h \
/usr/lib/gcc/i686-linux-gnu/4.7/include/stddef.h \
/usr/include/i386-linux-gnu/bits/types.h \
/usr/include/i386-linux-gnu/bits/typesizes.h /usr/include/libio.h \
/usr/include/_G_config.h /usr/include/wchar.h ../threads/stdarg.h \
/usr/include/i386-linux-gnu/bits/stdio_lim.h \
/usr/include/i386-linux-gnu/bits/sys_errlist.h /usr/include/string.h \
/usr/include/xlocale.h ../threads/system.h ../threads/thread.h \
../threads/scheduler.h ../threads/list.h ../machine/interrupt.h \
../threads/list.h ../machine/stats.h ../machine/timer.h \
../threads/utility.h
這些代碼是說main.o文件的生成以來后面的.h文件
此外,這里的include相當與把后面的makefile里面的內容全部加載到這個文件,也就是要執行Makefile.common和Makefile.dep各一次,
于是我們把剩下沒看的Makefile.common看一下:
首先來看
$(PROGRAM): $(OFILES)
$(LD) $(OFILES) $(LDFLAGS) -o $(PROGRAM)
這條語句,這條語句是為了生成可執行文件nachos的,
$(PROGRAM)=nachos
$(OFILES)=$(C_OFILES)+$(S_OFILES)
$(S_OFILES)=switch.o
$(C_OFILES)=$(*.o)這個看是那個包調用的,里面有定義
表示這個包里面的nachos可執行文件依賴于哪些.o文件和.c文件
然后執行$(LD)(=g++) $(OFILES) $(LDFLAGS) -o $(PROGRAM)
這種語句相當與我們平時的編譯語句g++ main.o -o main應該很好理解
然后我們再來看看
$(C_OFILES): %.o:
$(CC) $(CFLAGS) -c $<
%表示任意長度的非空字符,%.o文件表示任意.o文件,表明.o文件的生成方式。
$(CC) =g++,$
為了給lab1線程切換做好準備,要注意一個文件的生成,那就是switch.o的生成方式,這個是采用交叉編譯實現的。我們可以看到switch.c這個文件里面寫的都是匯編代碼,因此需要使用$(INPATH)和$(HOST)的值,這些值什么意思都講過。
其他包里面的Makefile基本上是和threads包里面是差不多的,再次不再贅述!
在此給出注釋過的Makefile的代碼包下載:
http://pan.baidu.com/share/link?shareid=2443717544&uk=2822100601
第二部分 Nachos中文教程
想要快速了解nachos如何模擬計算機上真實的操作系統,必須仔細研讀Nachos中文教程,建議每個Lab先把Nachos中文讀個2~3遍,然后自己思考。
Nachos中文教程分為六個章節,第一第二個章節主要對Nachos整體的介紹,這兩章很重要,也是lab1之前必須研讀完的。
每個章節,Nachos中文教程都會列出Nachos其中的函數,具體的原理等等信息。
這對于我們了解操作系統理論,養成良好變成習慣以及提升自己工程能力都是非常有幫助的。
下一期,我們將進入Nachos lab1-線程。
總結
以上是生活随笔為你收集整理的nachos中文教程java_Nachos3.4系列-2 Makefile 与Nachos中文教程 【转】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 67 个JavaScript和CSS实用
- 下一篇: Android studio 修改gra