Linux 內核概述 - Linux Kernel

来源:http://www.cnblogs.com/kelsen/archive/2016/08/26/5808879.html
-Advertisement-
Play Games

Linux 內核學習筆記整理。 Unix unix 已有40歷史,但電腦科學家仍認為其是現存操作系統中最大和最優秀的系統,它已成為一種傳奇的存在,歷經時間的考驗卻依然聲名不墜。 1973 年,在用 C 語言重寫了 Unix 系統後,大量的Unix衍生版本開始出現,許多公司把 unix 移植到新的機 ...


Linux 內核學習筆記整理。

Unix

unix 已有40歷史,但電腦科學家仍認為其是現存操作系統中最大和最優秀的系統,它已成為一種傳奇的存在,歷經時間的考驗卻依然聲名不墜。

1973 年,在用 C 語言重寫了 Unix 系統後,大量的Unix衍生版本開始出現,許多公司把 unix 移植到新的機型上,開發者們都按照自己的方式不斷增強系統的功能。Unix 系統設計簡潔併在發佈時提供源代碼,所以許多團體都對其進行了進一步的開發。加州大學伯克利分校便是其中影響最大的一個。在BSD基礎上,很多廠商也推出了自己的unix ,如 SunOS、HP-UX 等。1991 年,linus 在Internet 上發佈了它的 Unix 。從此 linux 便起航了,Linux很快吸引了眾多開發者、黑客對其代碼進行修改和完善,由於其開源性,Linux 迅速成為多人合作的開源項目。

操作系統與內核

操作系統包括內核、設備驅動程式、啟動引導程式、命令行shell、基本系統工具等部分。內核是操作系統的真正核心,負責硬體設備管理、分配系統資源等任務。內核一般處於系統態,擁有受保護的記憶體空間和訪問硬體設備的所有許可權,這種系統態和被保護起來的空間統稱為內核空間。應用程式在用戶空間只能看到允許它們訪問的部分系統資源、只能使用某些特定的系統功能,無法直接訪問硬體、也不能訪問內核劃給別人的記憶體範圍,還有一些其他的限制。應用程式通過 系統調用 與內核通信,讓內核代其完成不同的任務。

內核還負責管理系統的硬體設備。當硬體設備想要和系統通信的時候,它會發出一個非同步的中斷信號以打斷處理器執行,繼而打斷內核執行。中斷通常對應著一個中斷號,內核通過中斷號查找相應的中斷服務程式,並調用這個程式響應和處理中斷。中斷服務程式在一個與所有進程都無關的、專門處理中斷的上下文中運行,以保證中斷服務程式能在第一時間響應和處理中斷請求並快速退出。

單內核與微內核

操作系統的內核可分為兩大陣營:單內核和微內核。單內核就是把它從整體上作為一個大的過程來實現,同時也運行在一個單獨的地址空間上,其特點是高性能。微內核並不作為一個單獨的大過程來實現,其根據功能不同劃分成多個獨立的過程,其特點是各過程獨立運行,避免了一個模塊出現問題後禍及另一個。其相比單內核設計多了模塊間的通信機制等環節,而單內核卻沒有這些消息傳遞的開銷。所以,大部分基於微內核的系統都讓大部分或全部功能過程全部運行在內核,如此便可以直接調用函數,消除頻繁的上下文切換。windowNT、Mach就是微內核的典型實例。Linux 是單內核,但是其汲取了微內核的精華部分。Linux是模塊化的、多線程的以及內核本身可調度的操作系統。

內核版本號

主版本號.副版本號.修訂版本號

副版本號反映了該內核是一個穩定版本還是一個處於開發中的版本:如果該數字是偶數,那麼此版本就是穩定版;如果是奇數,那麼他就是開發版。

獲取源碼

官網地址:www.kernel.org

倉庫地址:git.kernel.org

編譯內核

由於從未配置過內核,所以使用預設配置編譯內核,據說這個預設配置是 Linus 本人的配置。

$make defconfig 

如果要減少編譯過程中的輸出信息,可以使用下列命令

$make > .. /detritus

如此一來,如果你要查看編譯信息,可查看該文件。當然你也可以直接 $make > /dev/null 把無用信息重定向。

安裝內核

% make modules_install

上面命令可以把所有已編譯的模塊安裝到正確的主目錄。編譯時會在內核代碼根目錄生成一個 system.map 文件,這是一個符號對照表。

內核開發

內核開發對性能的要求非常高。內核開發不能訪問 C 庫,也不能訪問標準的 C 頭文件。內核開發必須使用 GNU C,對內核來說完整的 C 庫(甚至是一個子集)太大且太低效了。但大部分常用的 C 庫函數在內核中都已經得到了實現。Linux 的內核混合使用了 C 語言和彙編語言,在靠近底層或對執行時間要求嚴格的地方,一般使用的都是彙編語言。GCC 支持使用 asm() 指令在 C 中嵌入彙報代碼。

條件分支優化

對於條件選擇語句,在經常條件經常出現或極少出現的時候,編譯前可根據分支聲明語句對條件分支進行優化。示例:

/* 把一個條件標記成極少發生的分支。 */
if (unlikely(err)){
    ...
}

這裡一定要確保是否當前條件在絕大多數都會成立,如果你判斷正確,那麼程式性能將得到答覆提升,否則,反而會降低性能。

沒有記憶體保護機制

如果用戶程式試圖進行一次非法的記憶體訪問,內核會發現這個錯誤,並結束這個進程。然而如果內核自己非法訪問了記憶體,那後果就很難控制了,因為沒有其他的任何東西可以對內核進行監控。還有一點,內核中的記憶體都不分頁。

擴展

內核擁有整個系統的最高許可權,關於內核開發的特別註意事項還有很多,可以到更專業一點的文章中瞭解。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 表大小 慢的sql select a.city, a.agent_id, a.username, a.real_name, phone, zgy_name, login_count, user_count, count(distinct b.invest_id) user_invested, sum ...
  • 一個學習性任務:每個人有不同次數的成績,統計出每個人的最高成績。 這個問題應該還是相對簡單,其實就用聚合函數就好了。 select id,name,max(score) from Student group by id,name order by name 上邊這種情況只適用id 和name是一一對 ...
  • 1.安裝MySql 目前MySQL有兩種形式的文件,一個是msi格式,一個是zip格式的。msi格式的直接點擊setup.exe就好,按照步驟進行。但是很多人下了zip格式的解壓發現沒有setup.exe,本人下載的也是這樣的,不知道怎麼安裝,點哪裡都沒有反應。只能尋求度娘幫助,然後才瞭解到,這種文 ...
  • 方法一: 直接(手動)去修改資料庫名稱,資料庫表名稱,資料庫列名稱、列屬性 方法二: 使用SQL語句去修改 ...
  • 彙編器構造 一、 彙編器簡介 前面介紹了編譯器構造和靜態鏈接器構造的具體方法,而且我們實現了一個將高級語言轉化為彙編語言的編譯器,同時又實現了一個將多個目標文件鏈接為一個可執行文件的鏈接器。現在需要一個連接這兩個模塊的功能模塊——彙編器,它能將一個單獨的彙編文件轉換為一個可重定位目標文件,如圖1-1 ...
  • file命令及其用法 file:查看文件內容 的類型 du命令及其用法 -s: -h: read命令及其用法 描述GPL,BSD,Apache三個開源協定的大體聯繫及區別 自由軟體 開源協定,版權描述 列出Linux的發行版,並說明其跟Linux內核的關係 Linux,GNU:GNU/Linux, ...
  • UDP和TCP處於同一層網路模型中,也就是運輸層,基於二者之上的應用有很多,常見的基於TCP的有HTTP、Telnet等,基於UDP有DNS、NFS、SNMP等。UDP是無連接,不可靠的數據協議服務,而TCP提供面向流、提供可靠數據服務。註意,UDP和TCP沒有好壞之分,只是二者的適用場景不同罷了。 ...
  • ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...