當前位置:首頁 » 操作系統 » linux內核模式

linux內核模式

發布時間: 2023-03-27 07:15:28

1. linux中的用戶模式和內核模式是什麼含意

在內核模式下用戶可以訪問所有的內存和硬體資源。
在用戶模式下訪問受到限制,例如用戶訪問了禁區,則用戶進逗宴程將被殺死。用戶模式必須通過系統調用或庫函數切換至內廳頌核模式後,山伏銀才允許訪問硬體資源。

2. windows內核跟linux內核哪個好給個全方位的比較。謝謝

Windows內核模式為mono;Linux內核模式為mini;另有開發中的內納返核hurd,以及初具形態,可以被看作內核的Grub2等採用更先進的模式micro。
一般是內核越小越嘩正好;但同時,內核小了,包含的內容就少了洞蘆飢。
為了解決這個問題,Linux採用模塊化內核,按需載入。上述排序就是按模塊化程度由低往高排的。

3. ARM有七種工作模式,請問Linux內核工作在哪種模式

你的問題好詭異;
1.arm是硬體,linux是軟體是操作廳碰搏系統,繼承與unix,他們吵橋倆風扮祥馬牛不相及;

4. linux內核版本號的格式和版本號變化規律是什麼

Linux內核版本號的格式為x.yy。zz,yy是主版本號,yy是二次版本號和zz是修訂版本號。升級的主要版本號是緩慢的,和修訂版本號只會讓微小的變化,內部和外部的版本。

因此主版本號是次版本號。如果小版本號是奇數,這意味著開發版本尚未正式發布,甚至和版本號代表著穩定版本。

版本號是版本的標識號。每個操作系統(或者更廣泛地說,每個軟體)都有一個版本號。版本號允許用戶知道操作系統是否是最新的版本,以及它提供了什麼功能和設施。每個版本號可以分為兩部分:主要版本號和次要版本號。

(4)linux內核模式擴展閱讀:

注意事項:

Linux內核的第二種模式只有在內核發生很大變化時才會改變(歷史上只有兩次,分別是1994年的1.0和1996年的2.0)。數字B可以用來判斷Linux是否穩定,偶數B表野殲者示穩定版本,奇數B表示開發版本。頌薯C表示錯誤修復、安全更新、新特性和驅動程序的數量。

以2.4.0版本為例。2表示主版本號,4表示次版本號,0表示最終版本號,只做了少量更改。在版本號中,第二個偶數版本表示它是一個可以使用的穩定版本,例如2.2.5,而第二個奇改或數版本添加了一些新內容,一個不一定穩定的測試版本,例如2.3.1。

因此,穩定版本來自於最後的beta升級,而穩定版本不再是在完全成熟時開發的。

在3.0版本之後出現了「A.B.」C」格式,隨著新版本的發布,B也在增加,C表示修復錯誤、安全更新、新功能和驅動程序的數量。第三種方法是不再將偶數用於穩定版本,而將奇數用於開發版本。例如:3.7.0並不代表開發版本,而是代表穩定版本。

5. linux內核系統進入>模式怎麼辦

1、可以刪除圓櫻剛剛寫入的信息。
2、然後進行虛擬機設置。
3、看橘賣叢看共享文件配改的情況。
4、然後在點擊設置,選擇模式就好了。

6. Linux內核中的RCU機制

Linux內核中的RCU機制

RCU的設計思想比較明確,通過新老指針替換的方式來實現免鎖方式的共享保護。但是具體到代碼的層面,理解起來多扒岩少還是會有些困難。下面我准備了關於Linux內核中的RCU機制的文章,提供給大家參考!

RCU讀取側進入臨界區的標志是調用rcu_read_lock,這個函數的代碼是:

static inline void rcu_read_lock(void)

{

__rcu_read_lock();

__acquire(RCU);

rcu_read_acquire();

}

該實現裡面貌似有三個函數調用,但實質性的工作由第一個函數__rcu_read_lock()來完成,__rcu_read_lock()通過調用 preempt_disable()關閉內核可搶占性。但是中斷是允許的,假設讀取者正處於rcu臨界區中且剛讀取了一個共享數據區的指針p(但是還沒有訪問p中的數據成員),發生了一個中斷,而該中斷處理常式ISR恰好需要修改p所指向的數據區,按照RCU的設計原則,ISR會新分配一個同樣大小的數據區new_p,再把老數據區p中的數據拷貝到新數據區,接著是在new_p的基礎上做數據修改的工作(因為是在new_p空間中修改,所以不存在對p的並發訪問,因此說RCU是一種免鎖機制,原因就在這里),ISR在把數據更新的工作完成後,將new_p賦值給p(p=new_p),最後它會再注冊一個回調函數用以在適當的時候釋放老指針p。因此,只要對老指針p上的所有引用都結束了,釋放p就不會有問題。當中斷處理常式做完這些工作返回後,被中斷的進程將依然訪問到p空間上的數據,蘆滑也就是老數據,這樣的結果是RCU機制所允許的。RCU規則對讀取者與寫入者之間因指針切換所造成的短暫的資源視圖不一致問題是允許的。

接下來關於RCU一個有趣的問題是:何時才能釋放老指針。我見過很多書中對此的'回答是:當系統中所有處理器上都發生了一次進程切換。這種程式化的回答常常讓剛接觸RCU機制的讀者感到一頭霧水,為什麼非要等所有處理器上都發生一次進程切換才可以調用回調函數釋放老指針呢?這其實是RCU的設計規則決定的: 所有對老指針的引用只可能發生在rcu_read_lock與rcu_read_unlock所包括的臨界區中,而在這個臨界區中不可能發生進程切換,而一旦出了該臨界區就不應該再有任何形式的對老指針p的引用。很明顯,這個規則要求讀取者在臨界區中不能發生進程切換,因為一旦有進程切換,釋放老指針的回調函數就有可能被調用,從而導致老指針被釋放掉,當被切換掉的進程被重新調度運行時它就有可能引用到一個被釋放掉的內存空間。

現在我們看到為什麼rcu_read_lock只需要關閉內核可搶占性就可以了,因為它使得即便在臨界區中發生了中斷,當前進程也不可能被切換除去。 內核開發者,確切地說,RCU的設計者所能做的只能到這個程度。接下來就是使用者的責任了,如果在rcu的臨界區中調用了一個函數,該函數可能睡眠,那麼RCU的設計規則就遭到了破壞,系統將進入一種不穩定的狀態。

這再次說明,如果想使用一個東西,一定要搞清楚其內在的機制,象上面剛提到的那個例子,即便現在程序不出現問題,但是系統中留下的隱患如同一個定時炸彈, 隨時可能被引爆,尤其是過了很長時間問題才突然爆發出來。絕大多數情形下,找到問題所花費的時間可能要遠遠大於靜下心來仔細搞懂RCU的原理要多得多。

RCU中的讀取者相對rwlock的讀取者而言,自由度更高。因為RCU的讀取者在訪問一個共享資源時,不需要考慮寫入者的陪此臘感受,這不同於rwlock的寫入者,rwlock reader在讀取共享資源時需要確保沒有寫入者在操作該資源。兩者之間的差異化源自RCU對共享資源在讀取者與寫入者之間進行了分離,而rwlock的 讀取者和寫入者則至始至終只使用共享資源的一份拷貝。這也意味著RCU中的寫入者要承擔更多的責任,而且對同一共享資源進行更新的多個寫入者之間必須引入某種互斥機制,所以RCU屬於一種"免鎖機制"的說法僅限於讀取者與寫入者之間。所以我們看到:RCU機制應該用在有大量的讀取操作,而更新操作相對較少的情形下。此時RCU可以大大提升系統系能,因為RCU的讀取操作相對其他一些有鎖機制而言,在鎖上的開銷幾乎沒有。

實際使用中,共享的資源常常以鏈表的形式存在,內核為RCU模式下的鏈表操作實現了幾個介面函數,讀取者和使用者應該使用這些內核函數,比如 list_add_tail_rcu, list_add_rcu,hlist_replace_rcu等等,具體的使用可以參考某些內核編程或者設備驅動程序方面的資料。

在釋放老指針方面,Linux內核提供兩種方法供使用者使用,一個是調用call_rcu,另一個是調用synchronize_rcu。前者是一種非同步 方式,call_rcu會將釋放老指針的回調函數放入一個結點中,然後將該結點加入到當前正在運行call_rcu的處理器的本地鏈表中,在時鍾中斷的 softirq部分(RCU_SOFTIRQ), rcu軟中斷處理函數rcu_process_callbacks會檢查當前處理器是否經歷了一個休眠期(quiescent,此處涉及內核進程調度等方面的內容),rcu的內核代碼實現在確定系統中所有的處理器都經歷過了一個休眠期之後(意味著所有處理器上都發生了一次進程切換,因此老指針此時可以被安全釋放掉了),將調用call_rcu提供的回調函數。

synchronize_rcu的實現則利用了等待隊列,在它的實現過程中也會向call_rcu那樣向當前處理器的本地鏈表中加入一個結點,與 call_rcu不同之處在於該結點中的回調函數是wakeme_after_rcu,然後synchronize_rcu將在一個等待隊列中睡眠,直到系統中所有處理器都發生了一次進程切換,因而wakeme_after_rcu被rcu_process_callbacks所調用以喚醒睡眠的 synchronize_rcu,被喚醒之後,synchronize_rcu知道它現在可以釋放老指針了。

所以我們看到,call_rcu返回後其注冊的回調函數可能還沒被調用,因而也就意味著老指針還未被釋放,而synchronize_rcu返回後老指針肯定被釋放了。所以,是調用call_rcu還是synchronize_rcu,要視特定需求與當前上下文而定,比如中斷處理的上下文肯定不能使用 synchronize_rcu函數了。 ;

7. Linux內核參數之arp_ignore和arp_announce

arp_ignore和arp_announce參數都和ARP協議相關,主要用於控制系統返回arp響應和發送arp請求時的動作。這兩個參數很重要,特別是在LVS的DR場景下,它們的配置直接影響到DR轉發是否正常。

首先看一下Linux內核文檔中對於它們的描述:

arp_ignore - INTEGER

Define different modes for sending replies in response to

received ARP requests that resolve local target IP addresses:

0 - (default): reply for any local target IP address, configured

on any interface

1 - reply only if the target IP address is local address

configured on the incoming interface

2 - reply only if the target IP address is local address

configured on the incoming interface and both with the

sender's IP address are part from same subnet on this interface

3 - do not reply for local addresses configured with scope host,

only resolutions for global and link addresses are replied

4-7 - reserved

8 - do not reply for all local addresses

The max value from conf/{all,interface}/arp_ignore is used

when ARP request is received on the {interface}

arp_ignore參數的作用是控制系統在收到外部的arp請求時,是否要返回arp響應。

arp_ignore參數常用的取值主要有0,1,2,3~8較少用到:

0:響應任意網卡上接收到的對本機IP地址的arp請求(包括環回網卡上的地址),而不管該目的IP是否在接收網卡上。

1:只響應目的IP地址為接收網卡上的本地地址的arp請求。

2:只響應目的IP地址為接收網卡上的本地地址的arp請求,並且arp請求的源IP必須和接收網卡同網段。

3:如果ARP請求數據包所請求的IP地址對應的本地地址其作用域(scope)為主機(host),則不回應ARP響應數據包,如果作用域為全局(global)或鏈路(link),則回應ARP響應數據包。

4~7:保留未使用

8:不回應所有的arp請求

sysctl.conf中包含all和eth/lo(具體網卡)的arp_ignore參數,取其中較大的值生效。

arp_announce - INTEGER

Define different restriction levels for announcing the local

source IP address from IP packets in ARP requests sent on

interface:

0 - (default) Use any local address, configured on any interface

1 - Try to avoid local addresses that are not in the target's

subnet for this interface. This mode is useful when target

hosts reachable via this interface require the source IP

address in ARP requests to be part of their logical network

configured on the receiving interface. When we generate the

request we will check all our subnets that include the

target IP and will preserve the source address if it is from

such subnet. If there is no such subnet we select source

address according to the rules for level 2.

2 - Always use the best local address for this target.

In this mode we ignore the source address in the IP packet

and try to select local address that we prefer for talks with

the target host. Such local address is selected by looking

for primary IP addresses on all our subnets on the outgoing

interface that include the target IP address. If no suitable

local address is found we select the first local address

we have on the outgoing interface or on all other interfaces,

with the hope we will receive reply for our request and

even sometimes no matter the source IP address we announce.

The max value from conf/{all,interface}/arp_announce is used.

arp_announce的作用是控制系統在對外發送arp請求時,如何選擇arp請求數據包的源IP地址。(比如系統准備通過網卡發送一個數據包a,這時數據包a的源IP和目的IP一般都是知道的,而根據目的IP查詢路由表,發送網卡也是確定的,故源MAC地址也是知道的,這時就差確定目的MAC地址了。而想要獲取目的IP對應的目的MAC地址,就需要發送arp請求。arp請求的目的IP自然就是想要獲取其MAC地址的IP,而arp請求的源IP是什麼呢? 可能第一反應會以為肯定是數據包a的源IP地址,但是這個也不是一定的,arp請求的源IP是可以選擇的,控制這個地址如何選擇就是arp_announce的作用)

arp_announce參數常用的取值有0,1,2。

0:允許使用任意網卡上的IP地址作為arp請求的源IP,通常就是使用數據包a的源IP。

1:盡量避免使用不屬於該發送網卡子網的本地地址作為發送arp請求的源IP地址。

2:忽略IP數據包的源IP地址,選擇該發送網卡上最合適的本地地址作為arp請求的源IP地址。

sysctl.conf中包含all和eth/lo(具體網卡)的arp_ignore參數,取其中較大的值生效。

(1)當arp_ignore參數配置為0時,eth1網卡上收到目的IP為環回網卡IP的arp請求,但是eth1也會返回arp響應,把自己的mac地址告訴對端。

(2)當arp_ignore參數配置為1時,eth1網卡上收到目的IP為環回網卡IP的arp請求,發現請求的IP不是自己網卡上的IP,不會回arp響應。

(3)當arp_announce參數配置為0時,系統要發送的IP包源地址為eth1的地址,IP包目的地址根據路由表查詢判斷需要從eth2網卡發出,這時會先從eth2網卡發起一個arp請求,用於獲取目的IP地址的MAC地址。該arp請求的源MAC自然是eth2網卡的MAC地址,但是源IP地址會選擇eth1網卡的地址。

(4)當arp_announce參數配置為2時,eth2網卡發起arp請求時,源IP地址會選擇eth2網卡自身的IP地址。

因為DR模式下,每個真實伺服器節點都要在環回網卡上綁定虛擬服務IP。這時候,如果客戶端對於虛擬服務IP的arp請求廣播到了各個真實伺服器節點,如果arp_ignore參數配置為0,則各個真實伺服器節點都會響應該arp請求,此時客戶端就無法正確獲取LVS節點上正確的虛擬服務IP所在網卡的MAC地址。假如某個真實伺服器節點A的網卡eth1響應了該arp請求,客戶端把A節點的eth1網卡的MAC地址誤認為是LVS節點的虛擬服務IP所在網卡的MAC,從而將業務請求消息直接發到了A節點的eth1網卡。這時候雖然因為A節點在環回網卡上也綁定了虛擬服務IP,所以A節點也能正常處理請求,業務暫時不會受到影響。但時此時由於客戶端請求沒有發到LVS的虛擬服務IP上,所以LVS的負載均衡能力沒有生效。造成的後果就是,A節點一直在單節點運行,業務量過大時可能會出現性能瓶頸。

所以DR模式下要求arp_ignore參數要求配置為1。

每個機器或者交換機中都有一張arp表,該表用於存儲對端通信節點IP地址和MAC地址的對應關系。當收到一個未知IP地址的arp請求,就會再本機的arp表中新增對端的IP和MAC記錄;當收到一個已知IP地址(arp表中已有記錄的地址)的arp請求,則會根據arp請求中的源MAC刷新自己的arp表。

如果arp_announce參數配置為0,則網卡在發送arp請求時,可能選擇的源IP地址並不是該網卡自身的IP地址,這時候收到該arp請求的其他節點或者交換機上的arp表中記錄的該網卡IP和MAC的對應關系就不正確,可能會引發一些未知的網路問題,存在安全隱患。

所以DR模式下要求arp_announce參數要求配置為2。

arp_ignore和arp_announce參數分別有all,default,lo,eth1,eth2...等對應不同網卡的具體參數。當all和具體網卡的參數值不一致時,取較大值生效。

一般只需修改all和某個具體網卡的參數即可(取決於你需要修改哪個網卡)。下面以修改lo網卡為例:

net.ipv4.conf.all.arp_ignore=1

net.ipv4.conf.lo.arp_ignore=1

net.ipv4.conf.all.arp_announce=2

net.ipv4.conf.lo.arp_announce=2

sysctl -w net.ipv4.conf.all.arp_ignore=1

sysctl -w net.ipv4.conf.lo.arp_ignore=1

sysctl -w net.ipv4.conf.all.arp_announce=2

sysctl -w net.ipv4.conf.lo.arp_announce=2

echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore

echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "2">/proc/sys/net/ipv4/conf/all/arp_announce

echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce

8. linux內核態是實模式還是分頁模式

linux運行在保護模式下,並且在啟動保護模式之前准備好了分頁式內存管理的頁表,在進入保護模式的同時一並開啟了分頁模式(同時置PE和PG位,即or eax,0x80000001)。
需要注意的是不要把保護模式和分頁模式混淆,與實模式相對的是保護模式,與分頁式內存管理相對的是分段式內存管理;當然,也有兩者結合的段頁式。

9. Linux內核中如何申請和釋放內存

申請內存:
void *kmalloc(size_t size, int flags)
kmalloc函數和malloc函數相似,它有兩個參數,一個參數是size,即申請內存塊的大小,這個參數比較簡單,就像malloc中的參數一樣。第二個參數是一個標志,在裡面可以指定優先權之類的信息。在Linux中,有以下的一些優先權:
GFP_KERNEL,它的意思是該內存分配是由運行在內核模式的進程調用的,即當內存低於min_free_pages的時候可以讓該進程進入睡眠;
GFP_ATOMIC,原子性的內存分配允許在實際內存低於min_free_pages時繼續分配內存給進程。
GFP_DMA:此標志位需要和GFP_KERNEL、GFP_ATOMIC等一起使用,用來申請用於直接內存訪問的內存頁。
釋放:
Kfree(const void *objp) const void *objp=為需要釋放的內存空間指針

10. linux內核主要由哪幾個部分組成

一個完整的Linux內核一般由5部分組成,它們分別是內存管理、進程管理、進程間通信、虛擬文件系統和網路介面。

1、內存管理
內存管理主要完成的是如何合理有效地管理整個系統的物理內存,同時快速響應內核各個子系統對內存分配的請求。

Linux內存管理支持虛擬內存,而多餘出的這部分內存就是通過磁碟申請得到的,平時系統只把當前運行的程序塊保留在內存中,其他程序塊則保留在磁碟中。在內存緊缺時,內存管理負責在磁碟和內存間交換程序塊。

2、進程管理
進程管理主要控制系統進程對CPU的訪問。當需要某個進程運行時,由進程調度器根據基於優先順序的調度演算法啟動新的進程。:Linux支持多任務運行,那麼如何在一個單CPU上支持多任務呢?這個工作就是由進程調度管理來實現的。

在系統運行時,每個進程都會分得一定的時間片,然後進程調度器根據時間片的不同,選擇每個進程依次運行,例如當某個進程的時間片用完後,調度器會選擇一個新的進程繼續運行。

由於切換的時間和頻率都非常的快,由此用戶感覺是多個程序在同時運行,而實際上,CPU在同一時間內只有一個進程在運行,這一切都是進程調度管理的結果。

3、進程間通信
進程間通信主要用於控制不同進程之間在用戶空間的同步、數據共享和交換。由於不用的用戶進程擁有不同的進程空間,因此進程間的通信要藉助於內核的中轉來實現。

一般情況下,當一個進程等待硬體操作完成時,會被掛起。當硬體操作完成,進程被恢復執行,而協調這個過程的就是進程間的通信機制。

4、虛擬文件系統
Linux內核譽衫鉛中的虛擬文件系統用一個通用的文件模型表示了各種不同的文件系統,這個文件模型屏蔽了很多具體文件系統的差異,使Linux內核支持很多不同的文件系統。

這個文件系統可以分為邏輯文件系統和設備驅動程序:邏輯文件系統指Linux所支持的文件系統,例如ext2、ext3和fat等;設備驅動程序指為每一種硬體控制器所編寫的設備驅動程序模塊。

5、網路介面
網路介面提供了對各種網路標準的實現和各種網路硬體的支持。網路介面一般分為網路協議慶好和網路驅動程序。網路協議部分負責實現每一種可能的網路傳輸協議。

網路設備驅動程序則主要負責與硬體設備進行通信,每一種可能的網路硬體設備都有相應的設備驅動程序。

(10)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處理器。

熱點內容
python基礎語言 發布:2024-04-27 11:54:40 瀏覽:83
ioshttp伺服器搭建 發布:2024-04-27 11:40:26 瀏覽:912
忘記密碼如何強制刷機vivo 發布:2024-04-27 11:28:40 瀏覽:384
c語言讀取指定行 發布:2024-04-27 11:28:30 瀏覽:51
c語言中a10什麼意思 發布:2024-04-27 10:45:43 瀏覽:58
物聯網中ftp是什麼意思 發布:2024-04-27 10:41:17 瀏覽:986
銀行密碼保護在哪裡 發布:2024-04-27 10:25:23 瀏覽:189
tomcat源碼導入eclipse 發布:2024-04-27 10:25:15 瀏覽:194
android的api 發布:2024-04-27 10:23:39 瀏覽:683
官式訪問 發布:2024-04-27 10:04:00 瀏覽:522