1. 編寫一個操作系統,應該先編寫一個編譯器那編譯器是用機器碼寫的嗎
你可以用C或者匯編 編寫內核 內核出來了以後 你用任何語言編寫GUI都不是問題
2. 操作系統的代碼是由誰編譯的,執行的
操作系統的代碼也是用某種語言寫和程序,所以由對應語言的編譯器編譯(如果是匯編語言程序,就由匯編程序進行匯編),執行當然是由CPU來做了!
3. UNIX操作系統是怎麼被編譯的
unix下一般用gcc編譯C語言,g++編譯c++
編譯其實是四個過程:預處理、編譯、匯編、鏈接
由gcc這個程序執行。
gcc只是個程序,程序也就是一堆二進制碼構成的東西罷了!
寫個字元串變成二進制碼的程序不沖突呀!
4. 普及知識!跪求答案! 操作系統是怎麼開發、編譯(怎麼編譯的)並且運行在設備上(這個問題的意思是
就我知道的向你說一說:
1,操作系統用的是c語言開發的:
但這c語言和普通的c語言是有區別的,不能使用庫函數。
這個c語言的編譯器也和普通的編譯器有區別的。《30天自製操作系統》-用的是開源的c編譯器並且經過修改的。
2,第一扇區的bootstrap
bootloader或者說bootlstrap是用匯編語言寫的
但是這個匯編器和拿來開發應用程序也是有區別的,
就拿匯編中的偽指令org和p應用程序的匯編編譯器是無法達到想要的目的的。
如果第一扇區是啟動分區,那麼對應的最後兩個位元組為511-0x55AA
bootloader開始就是一條跳轉指令0xeb開頭的後面是偏移量,緊接著就是這個媒介的配置信息
,緊接著才是我們要寫的16bit的匯編語言。
這里要做的事就是:
讀取硬碟上的數據放到內存中准備運行,保存配置數據,由16bit實地址模式切換到32模式。。。
本人原來照葫蘆畫瓢畫過。
但是切換到32bit下要用到內存保護機制,內存映射機制,虛擬內存機制。。。這些和計算機硬體的密切相關。無奈本人了解的計算機硬體一般都是十六位的,而且大多與概念相關。
而且對於的intel指令手冊都是英文的,總而言之能力有限無法進行下去。
如果要開發操作系統,以我看:
計算機組成原理特別是32bit下的內存映射保護相關內容必須知道
匯編和c語言那時必須的會
耐心時間
推薦書籍《30天自製操作系統》
通過開發操作系統可以加深 匯編與計算機硬部件 匯編和c語言 相關連的理解。
如果你想試一試可以在虛擬機下玩一玩。
——以上內容僅供參考——
5. 世界上第一個操作系統是如何編寫的
人家就問第一個操作系統是怎麼做出來的,樓下一堆人都沒說到點子上。
這個問題就像是沒有生產機器,那第一台機器是怎麼生產出來的。
第一台計算機,或者稱之為打孔計算機,破譯機。它的作用就是讀0和1的不同排列組合,通過這些組合來解譯不同的意思。比如 0010代表什麼意思,1101代表什麼意思。這些是一開始就設定好了的,就像是中國古代的算盤一樣,上面的運算元代表5,下面的運算元代表1是一個道理。
好了,開始就設定好這個解碼功能後,這台破譯機就可以讀信息了,它通過什麼讀呢?那時候沒有數據,沒有數字信號,只有模擬信號,它們就讀打孔紙。就是在紙上寫,然後打出一個一個孔,像卡紙一樣。設備就讀這個孔的排列,根據不同的排列去找這個排列代表了什麼,然後給出答案。這就是最初的計算機原理,非常簡單,它就是一個密碼解釋器,或者說是簡單的編譯器。
那時候就是用來算加減法等一些計算,它就是一個大型的計算器。
後來發展的復雜一些了,也就是增加了更多的0和1的組合來豐富機器的解釋庫,來計算更復雜的公式。
這時候你要問了,這些0和1的解釋庫是存在哪裡的?這就是為什麼以前的計算機房間那麼大個。它們是通過電子管的開和關來代表了0和1,通過電路給電子管通電,比如說那張紙打的孔,有一個像探頭一樣的東西,探測到那裡有一個孔,或者沒有孔,就給出電信號來控制不同的電子管組合的通路和斷路,最後給出結果。
比如我用紙戳一個1+1=?,我就戳一個(0000 0000 0000 0001)代表1(00001 001000 ....)代表+ (0000 0000 0000 0001)代表1,然後給機器讀,機器讀出來後,就會根據電子管的通斷組合,最後將結果反饋回來。一開始是用亮了多少盞燈來表示計算結果,有了顯示器後,才把它變成了顯示畫面。
顯示畫面其實也是有一個庫的,比如0001,你就給我顯示1,00010,你就給我顯示2,它會找對應的庫,這個庫一開始就用不同的電路
搭建做好,無非就是不同的電路通斷,電壓,電流等各種奇怪的組合來完成 。它自身有一套神奇的檢測機制,這個就不說了,我也說不清楚。
那麼回到最開始的問題,世界上第一個操作系統是怎麼出現的?就是用手在紙上寫出來的。
一開始不能算是系統,比如我要算一個公式,a /b +1+a+5*b,舉個例子,這個公式我要經常用,我不可能每次都要去戳很多紙,所以我只需要先做一個模板,然後留出一個空白,需要的時候,把a和b戳出來就可以了,這樣就很方便了。
後來這些公式越來越復雜,甚至是出現了不同的計算,比如說, 如果a<100,那麼就執行xxxx,如果a>100,就執行xxxx。然後這個模板就越做越大,需要戳的紙也越來越長。
好傢伙,後來實在戳不過來了,十個手指都戳破了,甚至計算機也運行不過來了,更復雜的運算根本做不了。不行,不能這樣下去了。
後來就開始有人研究了,電子技術的發展越來越高科技,電子管也做得越來越小,最後用集成電路來控制開關,但是其實原理都是一樣的。可以運算的公式和能力也越來越強。其實還是不同的電子管組合成不同的開關,你以為這個組合就是幾個電子組的組合嗎?不,已經達到上億,上千億個電子管的組合了,這也是集成電路的優勢。
一開始是用紙來保存信息,但是前面說了,紙已經不夠用了,就開始出現了軟盤,光碟。光碟上的凹凸點,代表了0和1,其實就是存儲的介質發生了變化,後面發明了磁碟,發明了光碟,甚至是軟盤、機械硬碟,SSD等不同的儲存介質,這些其實就是保存的方式不同而已,其實它們保存的數據還是和打孔紙一樣,就是0和1的數據,只是相比紙而言,保存得更多,更方便,也更容易被機器讀取。
這時候保存的介質發生了變化 ,那麼讀取這些數據的那個探頭也發生了變化,變成了像軟盤的磁頭,光碟的激光頭等。
當這種保存的介質從紙變成了硬碟後,就會出現一個問題,一開始寫這些孔的時候,是用筆和給紙戳一個窟窿來讓機器識別,現在要怎麼把0和1這種數據寫到磁碟里呢?這里就發明了鍵盤了,最初的鍵盤當然和現在不一樣,但是原理是一樣的。還是按一個鍵,給一個電信號,磁頭收到了電信號,會判斷是0還是1,如果是0,就是反磁,如果是1就是正磁。一開始的鍵盤,就是只有幾個鍵,1鍵和0鍵。
後來有人覺得整天打0和1太麻煩了,如果我要打a這個符號,我就要按(0000000000000000),按這么多下,我的手都要變成一指禪了,於是就發明更復雜的鍵盤,比如我要打a,b,c,d,我就一開始就設定好,我打a,就直接發送一串機器碼(0000000000000000),我要打b就發送一串機器碼(0000000000000001),類似這樣的。其實也是給鍵盤做好一個約定,我一開始就把一些特定的,經常使用到的符號或其他有代表性的字母、數字,把它們對應的0和1組合的機器碼先做成一個表格,存到鍵盤的識別庫里,我按哪一個字元,你就給我發送哪一個字元對應的機器碼就可以了,這樣我就不用從早到晚按0和1這兩個鍵,按個沒完。這么一設定,我就不用記太多的機器碼組合了,一開始就把這些組合給分門別類。
這樣發展到這里,鍵盤的雛形就出來了,也為匯編的發展埋下了伏筆。匯編其實就是最接近或者它就是機器碼的一種組合語言,機器是可以直接識別出來。
前面說了,為了執行不同的公式和復雜的計算,就出現了這同的模板,只需要修改模板上的參數,就可以重復執行這些模板。
現在這些板從紙上存到了軟盤上,現在就更方便了。以前用紙的時候,用過一次,紙就沒用了,現在軟盤上的數據一直在,我只需要用磁頭把原來填的數據擦掉,重新寫個新的參數就可以了。你可以理解成當時在紙上我用鉛筆寫參數,用過一次,用橡皮擦給擦掉重復寫。但是紙是需要打孔的,打了孔,橡破擦也沒用,已經是一個孔了,你也補不上,所以那紙就廢掉了。
但是軟盤不一樣,軟盤是可以重復寫的。可以把磁消掉重新在那個位置寫一個新的參數,這樣就可以重復利用了。
後來這些模板越做越復雜,最後慢慢的發展成了一個小型的,有自己一些獨立功能的計算系統,這可以理解為,它有了系統的一些特性,但是還不算系統。
後來這些模板更強大了,有人覺得,因為需要更加強大的功能,一般的模板已經沒辦法滿足了,而且通過這種最原始的abcd來拼湊這些公式、模板,太累了。於是就有人開始寫中間解釋器。
怎麼理解呢?前面說了,一開始大家都是寫1和0組合,覺得太累了,於是把1和0的不同組合做成了一個庫,我只需要輸入1+1,abcd這種鍵盤上約定好的字母,鍵盤就發送對應的1和0組合給機器,機器就可以直接識別了。
現在需求越來越復雜,發現光打這些abcd,需要打越來越多的代碼,發現和之前打1和0一樣累了,怎麼辦呢?於是就有人打算再創一個中間庫,把這些abcd,1,2,3等組合做成一個庫,不同的組合代碼不同的意思,這就是從機器向交互語言的發展了初期了。
這個庫一開始還是用abcd等最初的那個鍵盤庫打上去的,當然做的也很累,但是只要這個庫完善好了,後面要繼續發展更高級的交互語言就簡單多了,以後所有交互語言寫出來的東西,都通過這個庫翻譯成機器語言庫,機器語言庫就可以識別了。
於是有了交互語言庫,大家就不用打太多的字元來拼湊成不同的模板了,因為交互語言庫有了不同的單片語合成更加有意義符號,人一看就懂,不需要那些零零散散的字母,沒有任何意義在裡面,還需要死記硬背。
這就有點像是古代的文言文,你一聽不知道他在說什麼,然後去查一下文言文字典,這樣你才能知道他在說什麼。
現在你可以用白話言語來交流了,這樣就更輕鬆了,你可以直接和他對話。
至於機器聽不聽的懂你說的意思,這個不要緊,有解釋庫,你把解釋庫做好了,你說的每一句話會自動翻譯成機器語言,就可以了。
隨著語言的越來越強大,現在就可以寫出更加復雜的模板了,後來顯示器的發展越來越強大,讓這些模板出現了更豐富的畫面,其實它顯示什麼東西,也還是會有一個庫的,只要約定好,我返回的這串代碼代表了什麼東西,你就顯示什麼東西就可以了。甚至後來有了圖片。
其實圖片的顯示也有自己的一個約定,就是我返回什麼代碼,你就解析成什麼顏色點,然後不同的代碼組合,就會現出一大串的顏色點組合在一起,就變成了有顏色的圖片和畫面。其實文字也是圖片的一種,就是一種圖信號。
回到模板上來,後來慢慢的,這些模板越來越強大,甚至有人開始動起心思,開始給這些模板加皮膚,加各種好看或者神奇的功能,讓它更加好用,於是最初始的系統就這么慢慢的發展起來了。
其實系統它不是突然就有的,是在整個機器的發展的過程中,慢慢的累積到一定程度後,順應發展而來的。
這些模板也是從最簡單的公式模板慢慢發展成了現在有了自己的界面,有了自己的獨立運算功能和各種娛樂功能等強大的系統。
最初的系統,也就是這些模板的誕生,其實是很辛苦的,它們需要有一定的積累,一些基礎的識別庫的完善,這些都是需要最初的那代人,一開始就約定好,然後慢慢地完善起來,然後高級的語言和系統才能通過這些庫來和機器交流。
6. 不同的操作系統如何編譯一段軟體的代碼
首先,准備好命令行和編輯器。針對主流操作系統分別做簡單的解釋:Linux:已經具備了命令行和一個叫GCC 的編輯器。在命令行中輸入gcc ,如果「command not found」,那麼請安裝GCC。Mac OS X:命令行是Terminal,位於Applications/Utilities。你需要下載XCode ,它包含Apple的編輯器。Windows:微軟在免費下載的Visual Studio Express中提供了編輯器,但是Cygwin 界面更友好。安裝中要注意的是:要選擇「Devel」部分中所有的安裝包。下載:基本上所有的源數據包都有.tgz或者.tar.gz的後綴,有文件名和版本號,比如example-3.2.8.tar.gz。建立一個名為「source」或者「build」的目錄,下載並放在該目錄中。解壓縮:從命令行進入工作目錄(用cd命令):cd source 最快的方法是:tar -xzvf example-3.2.8.tar.gz這會將所有的源代碼解壓到一個新的子目錄中,而且文件名跟應用是一樣的。進入目錄只需要敲:cd example-3.2.8讀文檔:在代碼的文件包中會有像README 和INSTALL之類的文件,一定要讀。你也可以使用less 命令在命令行中讀取:less INSTALL 或者直接用合適的格式打開它們,它們會告訴你要安裝哪些包、安裝指南、注意問題等。Building:雖然各有不同,但大抵方法如下:輸入:./configure 運行配置工具會告訴你缺少哪些軟體和重要的文件的位置。有時候你需要自己指明特定文件在你計算機上的位置,比如:./configure --ssl-dir=/usr/local/include Configuration 過程要用幾分鍾,當它完畢的時候,你就可以編譯了。如果出現錯誤,參考下面的Troubleshooting。編譯請輸入:make一切順利就開始編譯了。編譯會佔用一段時間而且當運行時會佔用你電腦的所有進程。不要擔心,當編譯結束的時候,如果你仍然沒有看到已錯誤,那你已經搞定了。剩下要做的只是將不同的文件放到文件系統中:make installTroubleshooting: 如果以上的步驟有遇到錯誤,有方法讓你知道問題所在。確認你是否嚴格地按要求執行以上步驟。【
7. 操作系統的源代碼指的是什麼
操作系統的源代碼是組成操作系統的所有源程序集,一般是匯編或C等語言編寫而成,至於與計算機硬體打交道。一旦公開源代碼,將意味著版權的喪失。
源代碼經過編譯後生產可執行文件、動態連接庫、資源等文件,這樣就實現了對操作系統內部演算法和技術細節的封裝,從而達到「不可見」的目的。