1. 程式人生 > >Linux使用者態和核心態

Linux使用者態和核心態

1. 使用者態和核心態的概念區別

先看一個例子:

1)例子

   void testfork(){

       if(0 = = fork()){/////系統呼叫

       printf(“create new process success!/n”);

}

printf(“testfork ok/n”);

}

2)特權級

       fork的工作實際上是以系統呼叫的方式完成相應功能的,具體的工作是由sys_fork負責實施。其實無論是不是Unix或者Linux,對於任何作業系統來說,建立一個新的程序都是屬於核心功能,因為它要做很多底層細緻地工作,消耗系統的物理資源,比如分配實體記憶體,從父程序拷貝相關資訊,拷貝設定頁目錄頁表等等,這些顯然不能隨便讓哪個程式就能去做,於是就自然引出特權級別的概念,顯然,最關鍵性的權力必須由高特權級的程式來執行,這樣才可以做到集中管理,減少有限資源的訪問和使用衝突。

      特權級顯然是非常有效的管理和控制程式執行的手段,因此在硬體上對特權級做了很多支援,就Intel x86架構的CPU來說一共有0~3四個特權級,0級最高,3級最低,硬體上在執行每條指令時都會對指令所具有的特權級做相應的檢查,相關的概念有CPL、DPL和RPL,這裡不再過多闡述。硬體已經提供了一套特權級使用的相關機制,軟體自然就是好好利用的問題,這屬於作業系統要做的事情,對於Unix/Linux來說,只使用了0級特權級和3級特權級。也就是說在Unix/Linux系統中,一條工作在0級特權級的指令具有了CPU能提供的最高權力,而一條工作在3級特權級的指令具有CPU提供的最低或者說最基本權力。Linux

使用了ring0模式來執行核心態的程式碼,ring3來執行使用者態的程式碼

3)使用者態和核心態

        現在我們從特權級的排程來理解使用者態和核心態就比較好理解了,當程式執行在3級特權級上時,就可以稱之為執行在使用者態,因為這是最低特權級,是普通的使用者程序執行的特權級,大部分使用者直接面對的程式都是執行在使用者態;反之,當程式執行在0級特權級上時,就可以稱之為執行在核心態。

       雖然使用者態下和核心態下工作的程式有很多差別,但最重要的差別就在於特權級的不同,即權力的不同。執行在使用者態下的程式不能直接訪問作業系統核心資料結構和程式,比如上面例子中的testfork()就不能直接呼叫sys_fork(),因為前者是工作在使用者態,屬於使用者態程式,而sys_fork()是工作在核心態,屬於核心態程式。

       當我們在系統中執行一個程式時,大部分時間是執行在使用者態下的,在其需要作業系統幫助完成某些它沒有權力和能力完成的工作時就會切換到核心態,比如testfork()最初執行在使用者態程序下,當它呼叫fork()最終觸發sys_fork()的執行時,就切換到了核心態。

2.   使用者態和核心態的轉換

1)使用者態切換到核心態的3種方式

a. 系統呼叫

        這是使用者態程序主動要求切換到核心態的一種方式,使用者態程序通過系統呼叫申請使用作業系統提供的服務程式完成工作,比如前例中fork()實際上就是執行了一個建立新程序的系統呼叫。而系統呼叫的機制其核心還是使用了作業系統為使用者特別開放的一箇中斷來實現,例如Linux的int 80h中斷。

b. 異常

        當CPU在執行執行在使用者態下的程式時,發生了某些事先不可知的異常,這時會觸發由當前執行程序切換到處理此異常的核心相關程式中,也就轉到了核心態,比如缺頁異常。

c. 外圍裝置的中斷

        當外圍裝置完成使用者請求的操作後,會向CPU發出相應的中斷訊號,這時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷訊號對應的處理程式,如果先前執行的指令是使用者態下的程式,那麼這個轉換的過程自然也就發生了由使用者態到核心態的切換。比如硬碟讀寫操作完成,系統會切換到硬碟讀寫的中斷處理程式中執行後續操作等。

      這3種方式是系統在執行時由使用者態轉到核心態的最主要方式,其中系統呼叫可以認為是使用者程序主動發起的,異常和外圍裝置中斷則是被動的

2)具體的切換操作

       從觸發方式上看,可以認為存在前述3種不同的型別,但是從最終實際完成由使用者態到核心態的切換操作上來說,涉及的關鍵步驟是完全一致的,沒有任何區別,都相當於執行了一箇中斷響應的過程,因為系統呼叫實際上最終是中斷機制實現的,而異常和中斷的處理機制基本上也是一致的,關於它們的具體區別這裡不再贅述。關於中斷處理機制的細節和步驟這裡也不做過多分析,涉及到由使用者態切換到核心態的步驟主要包括:

       [1] 從當前程序的描述符中提取其核心棧的ss0及esp0資訊。

       [2] 使用ss0和esp0指向的核心棧將當前程序的 cs,eip,eflags,ss,esp 資訊儲存起來,這個

過程也完成了由使用者棧到核心棧的切換過程,同時儲存了被暫停執行的程式的下一

條指令。

       [3] 將先前由中斷向量檢索得到的中斷處理程式的cs,eip 資訊裝入相應的暫存器,開始

執行中斷處理程式,這時就轉到了核心態的程式執行了。

相關推薦

(轉)linux使用者心態理解 Linux探祕之使用者心態

原文:https://blog.csdn.net/buptapple/article/details/21454167 Linux探祕之使用者態與核心態-----------https://www.cnblogs.com/bakari/p/5520860.html 1、特權級  &

Linux使用者心態

1. 使用者態和核心態的概念區別 先看一個例子: 1)例子    void testfork(){        if(0 = = fork()){/////系統呼叫        printf(“create new process success!/n”); } printf(“testfork o

linux 使用者心態以及程序上下文、中斷上下文 核心空間使用者空間理解

7、記憶體管理單元(MMU)介紹:其是實現虛擬地址和實體地址空間以及核心空間、使用者空間的基礎 MMU是儲存器管理單元的縮寫,是用來管理虛擬記憶體系統的器件。MMU通常是CPU的一部分,本身有少量儲存空間存放從虛擬地址到實體地址的匹配表,一種轉換方法(演算法)。此表稱作TLB(轉換旁置緩衝區)。所有資料請求都

[保留] Linux 使用者心態的互動——netlink 篇

[size=4]Linux 使用者態與核心態的互動 ——netlink 篇[/size] 作者:Kendo 2006-9-3 這是一篇學習筆記,主要是對《Linux 系統核心空間與使用者空間通訊的實現與分析》中的原始碼imp2的分析。其中的原始碼,可以到以下URL下載: http://www-128.ibm.

Linux使用者心態通訊的幾種方式

本文首發於我的公眾號 Linux雲端計算網路(id: cloud_dev),專注於乾貨分享,號內有 10T 書籍和視訊資源,後臺回覆「1024」即可領取,歡迎大家關注,二維碼文末可以掃。 Linux 使用者態和核心態由於 CPU 許可權的限制,通訊並不像想象中的使用程序間通訊方式那麼簡單,今天這篇文章就來

Linux 系統】Linux探祕之使用者心態

一、 Unix/Linux的體系架構                                            如上圖所示,從巨集觀上來看,Linux作業系統的體系架構分為使用者態和核心態(或者使用者空間和核心)。核心從本質上看是一種軟體——控制計算機的硬體資源,並提供上

Linux探祕之使用者心態

一、Unix/Linux的體系架構   Linux作業系統的體系架構分為使用者態和核心態。   核心:本質是一種軟體,控制計算機的硬體資源,並提供給上層應用程式執行的環境。   使用者態:上層應用程式的活動空間。為了是上層應用能訪問CPI資源、儲存資源、I/O資

linux系統呼叫使用者心態流程

Linux系統呼叫流程分析 一直很好奇系統呼叫的詳細過程,只簡單的瞭解系統呼叫是使用者與核心互動的藉口,看了幾天的內容,不知道從何下手開始寫,今天略有頭緒,做以簡單總結。 1,  什麼是系統呼叫。 系統呼叫:系統呼叫是作業系統為使用者提供的一系列API;系統呼叫將使用者的請

Linux核心入門——使用者心態切換

除了使用者資料段、使用者程式碼段、核心資料段、核心程式碼段這4個段以外,Linux還使用了其它幾個專門的段,下面我們專門來探討,如圖:在單處理器系統中只有一個GDT,而在多處理器系統中每個CPU對應一個GDT。所有的GDT都存放在cpu_gdt_table 陣列中,而所有GDT(當初始化gdtr 暫存器時

Linux核心分析(四)系統呼叫,使用者心態

禹曉博+ 原創作品轉載請註明出處 + 歡迎加入《Linux核心分析》MOOC網易雲課堂學習 一、什麼是系統呼叫 我們知道由於種種原因(就是安全穩定性大部分)的考慮,作業系統是不能讓使用者直接進行一些有可能破換系統的行為,實際上還有另外一部分原因及時基於封裝性的考慮。作業系統

從深圳到江蘇,從使用者心態

      首先談下,為什麼寫這個文章呢,因為我感覺,年紀越來越大了(1990年出生),想記下一些東西。       為什麼從深圳就想去江蘇了呢,是因為愛嗎?是,我自認為酷愛linux核心,在深圳上班的時候雖然一直從事跟linux相關的工作,也有幸和參加主持過宋寶華老師在廣

使用者心態的切換與區別

核心態和使用者態的區別 當一個任務(程序)執行系統呼叫而陷入核心程式碼中執行時,我們就稱程序處於核心狀態。此時處理器處於特權級 最高的(0級)核心程式碼。當程序處於核心態時,執行的核心程式碼會使用當前的核心棧。每個程序都有自己的核心 棧。當程序在執行使用者自己的程式碼時,則

linux互斥鎖簡介(心態)

一、什麼是互斥鎖1、概念互斥鎖(Mutex)是在原子操作API的基礎上實現的訊號量行為。互斥鎖不

驅動開發基礎 -- 使用者心態、系統呼叫

1.在計算機系統中,許多硬體資源是受保護的,這層保護由作業系統提供,它就像一個圍牆,將這些資源包圍保護起來,然後它提供了一個門(系統呼叫)。只有通過系統呼叫,才能訪問到硬體資源。2.系統呼叫是作業系統核心的一部分,作業系統提供了一些介面API,來允許程式呼叫核心。(特定的函式

使用者心態切換分析

本文將主要研究在X86體系下Linux系統中使用者態到核心態切換條件,及切換過程中核心棧和任務狀態段TSS在中斷機制/任務切換中的作用及相關暫存器的變化。 一:使用者態到核心態切換途徑: 1:系統呼叫        2:中斷   3:異常 對應程式碼,在3.

linux心態使用者的訊號量

在Linux的核心態和使用者態都有訊號量,使用也不同,簡單記錄一下。 1> 核心訊號量,由核心控制路徑使用。 核心訊號量是struct semaphore型別的物件,它在<asm/semaphore.h>中定義 struct semaphore {    

Linux心態使用者的切換

1. 使用者態和核心態的概念區別 究竟什麼是使用者態,什麼是核心態,這兩個基本概念以前一直理解得不是很清楚,根本原因個人覺得是在於因為大部分時候我們在寫程式時關注的重點和著眼的角度放在了實現的功能和程式碼的邏輯性上,先看一個例子: 1)例子 void testfork(){ if(0 = = fo

Linux用戶

esp clear 理解 檢查 bin eat 數據 沖突 create 究竟什麽是用戶態,什麽是內核態,這兩個基本概念以前一直理解得不是很清楚,根本原因個人覺得是在於因為大部分時候我們在寫程序時關註的重點和著眼的角度放在了實現的功能和代碼的邏輯性上,先看一個例子: 1)

linux 用戶以及進程上下文、中斷上下文 內空間用戶空間理解

內存映射 自旋鎖 復制。 系統性能 準備 emc 進入 就會 運行環境 1、特權級 Intel x86架構的cpu一共有0~4四個特權級,0級最高,3級最低,ARM架構也有不同的特權級,硬件上在執行每條指令時都會對指令所具有的特權級做相應的檢查。硬件已經提

Linux下如何從使用者切換到心態

首先我們得明白什麼是使用者態和核心態? 明白這兩個概念之前,我們得知道使用者空間和核心空間。 使用者空間:指的就是使用者可以操作和訪問的空間,這個空間通常存放我們使用者自己寫的資料等等;而核心空間則是系統核心來操作的一塊空間,這塊空間裡面存放系統核心的函式、介面等。 不管對於Linux還