⑴ linux為什麼區分內核空間和用戶空間
程序如果要被CPU執行,就得編譯成CPU可以執行的指令,一大堆的程序就變成了一堆的指令。
一個操作系統它也是一堆程序組成的,可以想像CPU的指令是很多的,但是這么多的指令中,有些指令涉及到系統底層的東西,如果有些指令錯用或者使用不當是非常危險的,比如清內存、設置時鍾、修改用戶訪問許可權、分配系統資源等等,可能導致系統崩潰。
CPU將這些指令進行了分類,分為 特權指令 和 非特權指令 ,不讓所有程序都能使用所有指令,如果所有程序都能使用,那系統崩潰就會變得非常常見了。
操作系統的核心是內核,它是獨立於普通的應用程序,負責管理系統的進程、內存、設備驅動程序、文件和網路系統,決定著系統的性能和穩定性,所以一定要埋悄鉛保證內核的安全。
為了保護內核的安全,操作系統一般都限制用戶進程不能直接操作內核,在32位操作系統總的地址空間4G(2^32 = 4GB),實現這個限制的方式就是操作系統將總的地址空間分為兩個部分,對於Linux操作系統:
《 你該知道你寫的程序的內存布局 》
總之,有1G的內核空間是每個進程共享的,剩下的3G是進程自己使用的。
在內核態下,CPU可以執行指令系統的全集,也就是說內核態進程可以調用系統的一切資源,但是特權指令只能在內核態下執行,它不直接提供給用戶使用,用戶態下只能使用非特權指令,也就是說用戶態進程只能執行簡單運算,不能直接調用系統資源。
那麼CPU如何知道當前是否可以使用特權指令?
Linux操作系統通過區分內核空間和用戶空間的這種設計,將操作系統代碼和用戶程序代碼分開,這樣即使在某一個應用程序出錯,也不會影響到操作系統,再說,Linux操作系統是多任務系統,其它應用程彎好序不也還能運行。
現代操作系統基本上都是分內核空間和用戶空間的做法,來 保護操作系統自身的安全性和穩定性,這也是區分內核空間和用戶空間的本質。
你也可以繼續閱讀 點擊 以下文運信章,下面是我推薦給大家的幾篇文章:
1.《 竟然把通信協議講的如此通俗? 》
2.《 c++如何學習?趕緊收藏這些好書 》
3.《 select和epoll的前世今生 》
4.《 徹底明白Linux硬鏈接和軟鏈接 》
⑵ linux系統為什麼給內核分配1G不是500M為什麼不是2:2分配
所有進程都必須佔用一定數量的內存,這些內存用來存放從磁碟載入的程序代碼,或存放來自用戶輸入的數據等。內存可以提前靜態分配和統一回收,也可以按需動態分配和回收。
對於普通進程對應的內存空間包含5種不同的數據區:
代碼段
數據段
BSS段
堆:動態分配的內存段,大小不固定,可動態擴張(malloc等函數分配內存),或動態縮減(free等函數釋放);
棧:存放臨時創建的局部變數;
其中物理地址空間中除了896M(ZONE_DMA + ZONE_NORMAL)的區域是絕對的物理連續,其他內存都不是物理內存連續。在虛擬內核地址空間中的安全保護區域的指針都是非法的,用於保證指針非法越界類的操作,vm_struct是連續的虛擬內核空間,對應的物理頁面可以不連續,地址范圍(3G + 896M + 8M) ~ 4G;另外在虛擬用戶空間中 vm_area_struct同樣也是一塊連續的虛擬進程空間,地址空間范圍0~3G。
⑶ Linux進程內存管理
對於包含MMU的處理器而言,Linux系統提供了復雜的存儲管理系統,使得進程所能訪問的內存達到4GB。在Linux系統中,進程的4GB內存空間被分為兩個部分——用戶空間與內核空間。用戶空間的地址一般分布為0~3GB(即PAGE_OFFSET,在Ox86中它等於OxC0000000),這樣,剩下的3~4GB為內核空間,用戶進程通常只能訪問用戶空間的虛擬地址,不能訪問內核空間的虛擬地址。用戶進程只有通過系統調用(代表用戶進程在內核態執行)等方式才可以訪問到內核空間。
每個進程的用戶空間都是完全獨立、互不相乾的,用戶進程各自有不同的頁表。而內核空間是由內核負責映射,它並不會跟著進程改變,是固定的。內核空間的虛擬地址到物理地址映射是被所有進程共享的,內核的虛擬空間獨立於其他程序。
Linux中1GB的內核地址空間又被劃分為物理內存映射區、虛擬內存分配區、高端頁面映射區、專用頁面映射區和系統保留映射區這幾個區域。
對於x86系統而言,一般情況下,物理內存映射區最大長度為896MB,系統的物理內存被順序映射在內核空間的這個區域中。當系統物理內存大於896MB時,超過物理內存映射區的那部分內存稱為高端內存(而未超過物理內存映射區的內存通常被稱為常規內存),內核在存取高端內存時必須將它們映射到高端頁面映射區。Linux保留內核空間最頂部FIXADDR_TOP~4GB的區域作為保留區。
當系統物理內存超過4GB時,必須使用CPU的擴展分頁(PAE)模式所提供的64位頁目錄項才能存取到4GB以上的物理內存,這需要CPU的支持。加入了PAE功能的Intel Pentium Pro及以後的CPU允許內存最大可配置到64GB,它們具備36位物理地址空間定址能力。
由此可見,對於32位的x86而言,在3~4GB之間的內核空間中,從低地址到高地址依次為:物理內存映射區→隔離帶→vmalloc虛擬內存分配器區→隔離帶→高端內存映射區→專用頁面映射區→保留區。
⑷ Linux內核:用戶空間與內核空間的數據傳遞方式
Linux採用了段頁式存儲管理方式,Linux的虛擬地址空間為0~4G,如圖1,Linux內核將這4G空間分為兩部分,0~3G(0xC0000000~0xFFFFFFFF)的部分為用戶空間,供用戶進程使用,3~4G(0x00000000~0xBFFFFFFF)的部分為內核空間,專門供內核使用[4]。
八種用戶空間與內核空間的數據交換方式,這八種方式各有優劣,下面就每種方式的優劣做一下對比:
⑸ linux內核主要由哪幾個部分組成
一個完整的Linux內核一般由5部分組成,它們分別是內存管理、進程管理、進程間通信、虛擬文件系統和網路介面。
1、內存管理
內存管理主要完成的是如何合理有效地管理整個系統的物理內存,同時快速響應內核各個子系統對內存分配的請求。
Linux內存管理支持虛擬內存,而多餘出的這部分內存就是通過磁碟申請得到的,平時系統只把當前運行的程序塊保留在內存中,其他程序塊則保留在磁碟中。在內存緊缺時,內存管理負責在磁碟和內存間交換程序塊。
2、進程管理
進程管理主要控制系統進程對CPU的訪問。當需要某個進程運行時,由進程調度器根據基於優先順序的調度演算法啟動新的進程。:Linux支持多任務運行,那麼如何在一個單CPU上支持多任務呢?這個工作就是由進程調度管理來實現的。
在系統運行時,每個進程都會分得一定的時間片,然後進程調度器根據時間片的不同,選擇每個進程依次運行,例如當某個進程的時間片用完後,調度器會選擇一個新的進程繼續運行。
由於切換的時間和頻率都非常的快,由此用戶感覺是多個程序在同時運行,而實際上,CPU在同一時間內只有一個進程在運行,這一切都是進程調度管理的結果。
3、進程間通信
進程間通信主要用於控制不同進程之間在用戶空間的同步、數據共享和交換。由於不用的用戶進程擁有不同的進程空間,因此進程間的通信要藉助於內核的中轉來實現。
一般情況下,當一個進程等待硬體操作完成時,會被掛起。當硬體操作完成,進程被恢復執行,而協調這個過程的就是進程間的通信機制。
4、虛擬文件系統
Linux內核譽衫鉛中的虛擬文件系統用一個通用的文件模型表示了各種不同的文件系統,這個文件模型屏蔽了很多具體文件系統的差異,使Linux內核支持很多不同的文件系統。
這個文件系統可以分為邏輯文件系統和設備驅動程序:邏輯文件系統指Linux所支持的文件系統,例如ext2、ext3和fat等;設備驅動程序指為每一種硬體控制器所編寫的設備驅動程序模塊。
5、網路介面
網路介面提供了對各種網路標準的實現和各種網路硬體的支持。網路介面一般分為網路協議慶好和網路驅動程序。網路協議部分負責實現每一種可能的網路傳輸協議。
網路設備驅動程序則主要負責與硬體設備進行通信,每一種可能的網路硬體設備都有相應的設備驅動程序。
(5)linux內核進程空間擴展閱讀:
Linux 操作系統的誕生、發展和成長過程始終依賴著五個重要支柱:UNIX操作系統、MINIX操作系統、GNU計劃、POSIX標准和Internet 網路。
1981 年IBM公司推出微型計算機IBM PC。
1991年,GNU計劃已經開發出了許多工具軟體,最受期盼的GNU C編譯器已經出現,GNU的操作系統核心HURD一直處於實驗階段,沒有任何可用性,實質上也沒能開發出完整的GNU操作系統,但是GNU奠定了Linux用戶基礎和開發環境。
1991年初,林納斯·托瓦茲開始在一台386sx兼容微機上學習minix操作系統。1991年4月,林納斯·托瓦茲開始醞釀並著手編制自己的操作系統。
1991 年4 月13 日在comp.os.minix 上發布說自己已經成功地將bash 移植到了minix 上,而且已經愛不釋手、不能離開這個shell軟體了。
1993年,大約有100餘名程序員參與了Linux內核代碼編寫/修改工作,其中核心組由5人組成,此時Linux 0.99的代碼大約有十萬行,用戶大約有10萬左右。
1994年3月,Linux1.0發布,代碼量17萬行,當時是按照完全自由免費的協議發布,隨後正式採用GPL協議。
1995年1月,Bob Young創辦了RedHat(小紅帽),以GNU/Linux為核心,集成了400多個源代碼開放的程序模塊,搞出了一種冠以品牌的Linux,即RedHat Linux,稱為Linux"發行版",在市場上出售。這在經營模式上是一種創舉。
2001年1月,Linux 2.4發布,它進一步地提升了SMP系統的擴展性,同時它也集成了很多用於支持桌面系統的特性:USB,PC卡(PCMCIA)的支持,內置的即插即用,等等功能。
2003年12月,Linux 2.6版內核發布,相對於2.4版內核2.6在對系統的支持都有很大的變化。
2004年的第1月,SuSE嫁到了Novell,SCO繼續頂著罵名四處強行「塌棚化緣」, Asianux, MandrakeSoft也在五年中首次宣布季度贏利。3月,SGI宣布成功實現了Linux操作系統支持256個Itanium 2處理器。