一步步编写操作系统 2 部署工作环境 2
1.22匯編語言編譯器新貴,NASM
"新"是相對于舊來說的,老的匯編器MASM和TASM已經過時了,從名稱上可以看出字母n是在m之后,其功能必然有所超越才會被大家接受。
請用一句話概括NASM優勢在哪里?免費+語法簡潔使人舒適+支持linux平臺。這里所說的任何一個理由都是其它同類產品不具備的,敏銳的同學是不是察覺到了什么。。。哈哈,怎么給人的感覺是:其它編譯器不是花錢就是語法怪異讓人不爽,要么就不支持linux,看上去選擇nasm是沒得可選了?我就不自問自答了,反正NASM語法很接近咱們當初學的intel語法,我是用得很爽呢。這里就不再比較其優越性了,大家若感興趣還是自行查閱吧。
同樣是為了抒發一下對這位新貴的愛慕之情,簡要的介紹還是要的:
NASM是一個為可移植性與模塊化而設計的一個80x86的匯編器。它支持相當多的目標文件格式,包括Linux和'NetBSD/FreeBSD','a.out','ELF','COFF',微軟16位的'OBJ'和'Win32'。它還可以輸出純二進制文件。它的語法設計得相當的簡潔易懂,和Intel語法相似但更簡單。它支持'Pentium','P6','MMX','3DNow!','SSE' and 'SSE2'指令集,
介紹完了之后,咱們討論下為什么要用匯編語言開發系統呢?就目前來看,無論再怎么要求開發過程簡單,也避免不了用匯編語言,尤其是開發操作系統這類底層軟件。越底層的軟件就越要與硬件直接打交道,這就要求在語言層面上給開發人員提供訪問端口寄存器的方法。顯然,目前的高級語言都做不到這一點,像C語言這類偏底層的語言都不支持修改寄存器,用匯編語言則是不可避免的事了。
包括我在內的很多同學一聽要用匯編了,都有一種小小的恐懼感,認為這是一種不好掌握的東西(我沒有稱之為語言而是稱之為東西,是因為曾經有個女同學都不知道匯編是什么),而且程序編寫起來特別麻煩,要考慮的東西太多了,代碼邏輯寫起來不夠直接,似乎總是在迂回…以至于我們經常被匯編語言“搞定”。我個人的感覺是,當我熟悉了匯編語言后,甚至覺得有一點親切呢,當然了,任何陌生的事物經過熟悉的過程后都會變得有親切感,關鍵是咱們得扛到對它熟悉為止,不能讓心里的畏懼戰勝自己。用匯編語言和cpu直接對話,想想就有點小興奮呢。
不過好在我們需要用匯編的地方只是一些硬件訪問、中斷調用、端口讀寫、線程切換之類(怎么看上去好多…),我們可以寫出一些通用的代碼來減少匯編的枯燥。總之,只有不得不用時我們才會向匯編語言屈服(其實也沒那么悲壯啦^_^)。
1.3操作系統的宿主環境。
操作系統雖然是軟件,但其可不是一般的軟件。我們平時寫出來的程序都是基于操作系統之上,程序本身是由操作支持的,開發人員只要專注于自己這塊業務邏輯就好了,很多復雜的問題是不需要開發人員考慮的。而操作系統這個軟件靠誰來支持呢?是靠你自己…這是用一身老骨頭扛出來的,現在明白為什么linux之父linus那么強壯了吧,不是誰都能隨隨便便成功的,所以,寫操作系統那可是要有個好身板,要多鍛煉身體才能熬得住,看完這章趕緊出去跑步吧^_^,玩笑玩笑。如果一般應用軟件能稱得上魚香肉絲的話,那操作系統得相當于龍蝦鮑魚,這可是硬菜,不出去跑個幾公里都啃不下來呢。哈哈,其實也沒那么夸張,現在有很多計算機大牛寫了好多開源軟件幫助我們調試操作系統。話說,自從有了虛擬機,我再也用不著鍛煉身體了,每次出現bug時不需要重啟真機了,只需要重啟虛擬機就好。
1.31什么是虛擬機
虛擬機在當今已經不是陌生的概念了,要是在幾年前,我還得搬出個概念放在這給大家看看。個人覺得,要解釋一個東西是什么,不如直接解釋這個東西解決了哪些問題,這樣大家自然就從本質上真正理解了它是什么。
沒有虛擬機的時候,一臺機器只有交給一個用戶使用,而且一個人根本無法將這臺機器的性能完全發揮出來,造成了極大的浪費不算,還有很多人正等著用呢。于是出現了虛擬機的需求:將一臺物理機通過軟件邏輯分割成幾個虛擬的計算機,每個計算機之間互不干涉,即使一臺虛擬計算機崩潰了也只是影響了它自身,不會讓整個物理機癱瘓,安全可靠,可以自由測試而不必擔心損傷物理機。這不僅在硬件投入上節省了大筆開銷,還讓更多的人同時使用了計算機資源。
現在很多廠商都在搞虛擬化,如域名的虛擬空間,還有如火如荼的阿里云、這是虛擬機的應用。虛擬機就是用軟件來模擬硬件。虛擬機只是一個普通的進程,該進程模擬了硬件資源,在虛擬機中運行的程序其所做出的任何行為都先被虛擬機檢查,由虛擬機分析后,代為向操作系統申請。
上面對虛擬機的解釋是主觀上的理解,我可不愿意說概念了,因為概念是對事物的抽象。抽象就意味著不易理解,容易把簡單的事復雜化。我舉個簡單的例子來說明什么是虛擬機。
假設V是虛擬機進程,U是普通的用戶程序。程序運行起來才叫進程,進程是要有pcb的,程序老實的放在磁盤上不動,那可不叫進程。虛擬機跑起來后,就形成了進程V,在它被調度期間,cpu執行的是此進程中的指令。讓虛擬機執行U程序,有如解釋器進程在解析腳本文件一樣,此時的U程序是被當作參數傳給了V程序,U程序就像文章一樣由V進程閱讀。還是拿解釋型語言舉例子,比如python語言,其腳本從來就沒有直接作用于cpu上,而是其字節碼交給了python解釋器,這個解釋器將通過python虛擬機來代為完成python腳本中的代碼行為。
讓我們說得再具體一點,比如在linux平臺上,寫了一個python腳本文件file.py,其中有這樣一句代碼:fh=open(“hello.txt”,'w'),這是在用可寫的方式打開hello.txt文件,將其句柄返回給fh。自此操作文件句柄fh,便是操作了文件hello.txt。python虛擬機是一個進程,它是直接作用在硬件之上的。當它分析python腳本file.py中上面的那句代碼時,發現有關鍵字open(當然關鍵字得是python解釋器支持的,此解釋器為它們而生才行),于是執行了open(“hello.txt”,'w')函數,其內部是封裝的系統調用(系統調用這方面內容以后咱們在自己的系統中細說。),通過系統調用,python虛擬機替python腳本完成了打開hello.txt的工作。
選擇虛擬機的一個原因;
它在宿主系統上只是一個進程,在宿主系統如linux眼里,它與一般的用戶進程是沒任何區別的。進程咱們都可以隨意啟動,虛擬機也是一樣的,在這一點保證了使用上的方便性。
如果您有一般的軟件開發經驗,就會了解,很少有程序能一下就編譯通過。當然,如果您的編程經驗無比豐富,代碼無比規范,無比了解編譯器,確實不需要虛擬機來調試了,編寫完成后直接就能運行。以上我用了三個“無比”,打造了似乎沒有人能達到這種水平的假象,其實是有的。不知道大家聽說過Jon Skeet大神沒有,他是谷歌軟件工程師,《c# In Depth》就是他的神來之筆。看看別人對他是怎樣評價的,看完之后您就知道我說的并不夸張了:
“他并不需要調試器,只要他盯著代碼看幾眼,bug自己就跑出來了”。
“他根本不需要什么編程規范,他的代碼就是規范”
還有還有,這個最威武霸氣…
“如果他的代碼沒有通過編譯,編譯器廠商就會道歉”
為了表示對大神的崇拜,我刻意把上面空出一行。每次看到第三個評論,我的血液中就會流淌一些讓我振奮的東西,我深知自己還差得很遠,以至于每次貪睡的時候,心靈深處總會傳來一句充滿愛的關懷:還特么不起來看書。
如果咱們都不能保證寫出這樣質量出色的代碼,咱們還是老老實實的裝虛擬機吧(土豪隨意)。因為如果要把操作系統裝在真機器上,每次調試的時候,無論代碼是否崩潰,都是要重啟計算機的。為了保護咱們的愛機,虛擬機必裝不可。不知道你們心疼電腦嗎,反正我要是一天開電腦三次以上,我就會很自責,不知道這種性格和水瓶座有沒有關系。
說了虛擬機的好處,那咱們有哪些虛擬機可用呢。一般的有qemu、bochs、virtualBox、xen和vmware等。
我們要用的就是bochs.選擇bochs的理由如下:
對于虛擬機的選擇,能工作能調試夠用就行了,遇到問題時再尋求新方案也不遲,畢竟咱們的重點是后面的寫操作系統,學太多的虛擬機也沒啥用。
介紹一下bochs吧,怎么也得讓大家有個初步的印象。下面的內容是我從維基百科翻譯過來的,其實就是從繁體中文翻譯成了簡體中文^_^,而且只有幾個繁體字,哈哈。
Bochs(發音:box)是一個以LGPL許可證發放的開放源代碼的x86、x86-64IBM PC兼容機模擬器和調試工具。它支持處理器(包括保護模式),內存,硬盤,顯示器,以太網,BIOS,IBM PC兼容機的常見硬件外設的仿真。
許多客戶操作系統能通過該仿真器運行,包括DOS,Microsoft Windows的一些版本,AmigaOS 4,BSD,Linux,MorphOS,Xenix和Rhapsody (Mac OS X的前身)。Bochs能在許多主機操作系統運行,例如Windows、Windows Mobile、 Linux、Mac OS X、iOS和PlayStation 2。
Bochs主要用于操作系統開發(當一個模擬操作系統崩潰,它不崩潰主機操作系統,所以可以調試仿真操作系統)和在主機操作系統運行其他來賓操作系統。它也可以用來運行不兼容的舊的軟件(如電腦游戲)。
它的優點在于能夠模擬跟主機不同的機種,例如在Sparc系統里模擬x86,但缺點是它的速度卻慢得多。
介紹完了,不知道您看了嗎,不看也行,反正以后咱們實際應用時還會細說的。
總結
以上是生活随笔為你收集整理的一步步编写操作系统 2 部署工作环境 2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全球唯一一款!谷歌Pixel 4被科学家
- 下一篇: 河南郑州冲上41℃!汽车仪表台被烧出大洞