.c程式要被轉化為可執行檔案,並以二進位制磁碟檔案的形式存放起來。
過程由gcc編譯器驅動程式完成:
gcc讀取hello.c(源程式,文字) -> 經過預處理器(cpp),讀取系統標頭檔案內容並插入程式 -> hello.i(修改後源程式,文字) -> 經過編譯器(ccl) -> hello.s(匯程式設計序,文字) -> 彙編器(as),翻譯為機器語言指令 -> hello.o(可重定位目標程式,二進位制) -> 鏈結器(ld),程式中呼叫的一些標準c庫函式如printf -> hello(可執行目標程式,二進位制)可載入到記憶體中,由系統執行
系統的硬體組成
1.匯流排(傳送定長的word)
2.i/o裝置
每個io裝置都通過乙個控制器或介面卡與io匯流排相連,前者是io裝置本身或者主機板上的晶元組;後者是插在主機板插槽上的卡
3.主存
臨時儲存裝置,在處理器執行程式時,用來 存放程式和程式處理的資料。
從物理上說,主存是一組dram晶元組成的;邏輯上看,儲存器是乙個線性的位元組陣列,每個位元組都有其唯一的位址(陣列索引),位址從0開始。
4.處理器
**處理器(cpu),解釋(或執行儲存在主存中指令的引擎)。處理器的核心是乙個大小為乙個字的儲存裝置(或暫存器),成為程式計數器(pc)。在任何時候,pc都指向主存中的某條機器語言指令(即含有該條指令的位址)。
執行hello程式
總之就是由主存中儲存資料,cpu中的暫存器通過匯流排讀寫主存與外設獲取資料後進行操作,最後再將reg中的資料要麼存主存要麼給io
上圖是計算機系統的分層檢視。作業系統有兩個基本功能:1.防止硬體被失控的應用程式濫用 2.向應用程式提供簡單一致的機制來控制複雜而又通常大不相同的低階硬體裝置。作業系統通過幾個基本的抽象概念來實現這兩個功能:程序,虛擬記憶體和檔案
檔案:對io裝置的抽象表示
虛擬記憶體:對主存和磁碟io裝置的抽象表示
程序:對處理器,主存和io裝置的抽象表示
作業系統對乙個正在執行的程式的一種抽象。
併發執行:看似同時,實則多程序分時占用cpu,通過處理器在程序間切換實現。該交錯執行的機制成為上下文切換。
上下文:作業系統保持跟蹤程序執行所需的所有狀態資訊,該狀態稱為上下文
從乙個程序到另乙個程序的轉換是由作業系統核心管理的。核心是作業系統**常駐主存的部分。當應用程式需要作業系統的某些操作時會執行系統呼叫指令,將控制權傳遞給核心,然後核心執行被請求的操作並返回應用程式。
乙個程序可由多個稱為執行緒的執行單元(顆粒更小)組成,每個執行緒都執行在程序的上下文中,並共享同樣的**和全域性資料。
虛擬記憶體是乙個抽象概念,它為每個程序提供了乙個假象,即每個程序都在獨佔地使用主存。每個程序看到的記憶體都是一致的,稱為虛擬位址空間。圖1-13所示的是linux程序的虛擬位址空間(其他unix系統的設計也與此類似)。在linux中,位址空間最上面的區域是保留給作業系統中的**和資料的,這對所有程序來說都是一樣。位址空間的底部區域存放使用者程序定義的**和資料。請注意,圖中的位址是從下往上增大的。每個程序看到的虛擬位址空間由大量準確定義的區構成,每個區都有專門的功能。
我們從最低的位址開始,逐步向上介紹。
程式**和資料。 對所有的程序來說,**是從同一固定位址開始,緊接著的是和c全域性變數相對應的資料位置。**和資料區是直接按照可執行目標檔案的內容初始化的,在示例中就是可執行檔案hello。
堆。 **和資料區後緊隨著的是執行時堆。**和資料區在程序一開始執行時就被指定了大小,與此不同,當呼叫像malloc和free這樣的c標準庫函式時,堆可以在執行時動態地擴充套件和收縮。
共享庫。大約在位址空間的中間部分是一塊用來存放像c標準庫和數學庫這樣的共享庫的**和資料的區域。
棧。 位於使用者虛擬位址空間頂部的是使用者棧,編譯器用它來實現函式呼叫。和堆一樣,使用者棧在程式執行期間可以動態地擴充套件和收縮。特別地,每次我們呼叫乙個函式時,棧就會增長;從乙個函式返回時,棧就會收縮。
核心虛擬記憶體。 位址空間頂部的區域是為核心保留的。不允許應用程式讀寫這個區域的內容或者直接呼叫核心**定義的函式。相反,它們必須呼叫核心來執行這些操作。
虛擬記憶體的運作需要硬體和作業系統軟體之間精密複雜的互動,包括對處理器生成的每個位址的硬體翻譯。基本思想是把乙個程序虛擬記憶體的內容儲存在磁碟上,然後用主存作為磁碟的快取記憶體。
作業系統筆記一(作業系統概述)
1.1作業系統是什麼?作業系統是管理計算機硬體和軟體資源的計算機程式,管理配置記憶體 決定資源供需順序 控制輸入輸出裝置等,作業系統提供讓使用者和系統互動的操作介面。1.2作業系統有什麼用?作業系統統一管理計算機資源!計算機資源包括處理器資源 io資源 儲存器資源 檔案資源 作業系統實現了對計算機資...
作業系統筆記(一)
乙個程式在載入過程中會發生分頁缺失中斷,為什麼?答 乙個程序在啟動後會分配一塊特定的區域。程式語句的呼叫會有兩種方式 在程式開始,或發生跳轉等語句的時候,先載入硬碟中需要的語句到記憶體,再執行。在發生這些跳轉的時候,先不載入,之間跳轉,執行失敗後,再載入硬碟中的語句到此記憶體。在執行過程中可能發生多...
作業系統筆記(一)
參考書籍 計算機作業系統 都是一些上課記得零散筆記。不全的之後補充,感覺第一章介紹了一下作業系統,都是些理論的東西 作業系統的學習在我看來可能並不能增長我語言程式設計的能。但可以讓我成為真正的程式設計高手。讓我能更好的理解程式設計 作業系統並不能做具體應用。而是為所有的軟體提供最基礎的硬體相關。實體...