新聞中心
Linux是一種非常強(qiáng)大的操作系統(tǒng),在開(kāi)發(fā)、服務(wù)器、嵌入式等領(lǐng)域有著廣泛的應(yīng)用。與其他操作系統(tǒng)不同,Linux內(nèi)核在設(shè)計(jì)上采用了“內(nèi)核態(tài)”和“用戶態(tài)”的概念,用戶態(tài)是指應(yīng)用程序運(yùn)行的環(huán)境,而內(nèi)核態(tài)則是指內(nèi)核運(yùn)行的環(huán)境。在Linux中,內(nèi)核態(tài)具有更高的權(quán)限和更多的功能,用戶可以通過(guò)各種方式進(jìn)入內(nèi)核態(tài),從而實(shí)現(xiàn)更多的操作。本文將深入了解Linux內(nèi)核態(tài)的進(jìn)入方式。

成都創(chuàng)新互聯(lián)長(zhǎng)期為超過(guò)千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為宛城企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都網(wǎng)站建設(shè),宛城網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
1. 系統(tǒng)調(diào)用
系統(tǒng)調(diào)用是Linux內(nèi)核與用戶程序之間通信的一種非常常見(jiàn)和基礎(chǔ)的方法。當(dāng)用戶程序需要執(zhí)行一種特殊功能時(shí),如讀取文件或進(jìn)行網(wǎng)絡(luò)連接等,用戶程序就會(huì)向內(nèi)核發(fā)出請(qǐng)求,內(nèi)核會(huì)執(zhí)行操作并返回結(jié)果。這個(gè)過(guò)程就是系統(tǒng)調(diào)用。
系統(tǒng)調(diào)用是Linux內(nèi)核直接提供給用戶程序的接口。用戶通過(guò)特定的庫(kù)函數(shù)調(diào)用系統(tǒng)調(diào)用,使得程序進(jìn)入內(nèi)核態(tài)。系統(tǒng)調(diào)用常常被使用在I/O操作、進(jìn)程控制、文件管理、進(jìn)程間通信等場(chǎng)景中。常見(jiàn)的系統(tǒng)調(diào)用有open、read、write、close、fork、exec、wt、exit等。使用這些系統(tǒng)調(diào)用可以進(jìn)行普通用戶難以實(shí)現(xiàn)的底層操作,這也是Linux廣受開(kāi)發(fā)者歡迎的原因之一。
2. 庫(kù)函數(shù)
庫(kù)函數(shù)是調(diào)用系統(tǒng)調(diào)用的語(yǔ)言層次的封裝。在Linux中,庫(kù)函數(shù)一般分為兩類:標(biāo)準(zhǔn)庫(kù)和第三方庫(kù)。標(biāo)準(zhǔn)庫(kù)就是操作系統(tǒng)提供的C語(yǔ)言標(biāo)準(zhǔn)庫(kù),例如stdio.h和stdlib.h等。標(biāo)準(zhǔn)庫(kù)中包含了一系列與系統(tǒng)調(diào)用相關(guān)的封裝函數(shù),可以方便地進(jìn)行操作。
第三方庫(kù)包括了許多第三方開(kāi)發(fā)者開(kāi)發(fā)的庫(kù)。這些庫(kù)可以幫助用戶完成一些普通操作的封裝,有時(shí)甚至可以替代系統(tǒng)調(diào)用的封裝。常見(jiàn)的第三方庫(kù)有GTK、QT、OpenGL、Glib等。
庫(kù)函數(shù)與系統(tǒng)調(diào)用之間的關(guān)系十分緊密。庫(kù)函數(shù)本身就是基于系統(tǒng)調(diào)用實(shí)現(xiàn)的,內(nèi)核態(tài)也是通過(guò)庫(kù)函數(shù)實(shí)現(xiàn)對(duì)系統(tǒng)調(diào)用的調(diào)用。庫(kù)函數(shù)具有較高的抽象性和封裝程度,方便用戶直接使用。
3. 中斷
中斷是一種從用戶態(tài)進(jìn)入內(nèi)核態(tài)的方式。中斷是來(lái)自外部設(shè)備的一種特殊信號(hào),當(dāng)外設(shè)需要處理時(shí)發(fā)出。中斷處理程序會(huì)通過(guò)跳轉(zhuǎn)到內(nèi)核代碼中響應(yīng)中斷,進(jìn)行必要的操作。
中斷分為硬件中斷和軟件中斷兩種類型。硬件中斷由硬件設(shè)備發(fā)出,如鍵盤(pán)輸入、鼠標(biāo)移動(dòng)、網(wǎng)絡(luò)中斷等。軟件中斷是由內(nèi)核主動(dòng)發(fā)起的,如定時(shí)器中斷、軟中斷等。
中斷機(jī)制也是Linux操作系統(tǒng)中非常常見(jiàn)的一種內(nèi)核態(tài)進(jìn)入方式。中斷機(jī)制與其他機(jī)制相比,具有更高的敏捷性和靈活性,能夠直接響應(yīng)外部事物的變化,使得操作系統(tǒng)具備更強(qiáng)的可移植性和智能性。
4. 系統(tǒng)異常
系統(tǒng)異常是一種系統(tǒng)狀態(tài)發(fā)生異常時(shí)的處理機(jī)制。當(dāng)內(nèi)核態(tài)發(fā)生不可預(yù)期的錯(cuò)誤、中斷或異常時(shí),操作系統(tǒng)會(huì)自動(dòng)切換到內(nèi)核態(tài),并執(zhí)行相應(yīng)的異常處理程序。
系統(tǒng)異常分為兩種:同步異常和異步異常。同步異常是由當(dāng)前CPU指令引起的,如分母為零、非法內(nèi)存訪問(wèn)等。異步異常則是由硬件設(shè)備或其他進(jìn)程引起的,如較高優(yōu)先級(jí)的中斷等。
系統(tǒng)異常處理程序也是Linux內(nèi)核不可或缺的一部分。異常處理程序可以根據(jù)具體情況采取不同的處理方式,防止因?yàn)殄e(cuò)誤的引起操作系統(tǒng)崩潰、損壞用戶數(shù)據(jù)等不良后果。
Linux內(nèi)核態(tài)的進(jìn)入方式非常多,如系統(tǒng)調(diào)用、庫(kù)函數(shù)、中斷、系統(tǒng)異常等。這些方式各具特色,可以滿足不同場(chǎng)景下的不同需求。在實(shí)際應(yīng)用中,尤其是在開(kāi)發(fā)、服務(wù)器等領(lǐng)域,熟練掌握這些方式可以使程序的性能和可靠性得到進(jìn)一步的提升。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗(yàn)豐富以策略為先導(dǎo)10多年以來(lái)專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),響應(yīng)式網(wǎng)站制作,設(shè)計(jì)師量身打造品牌風(fēng)格,熱線:028-86922220當(dāng)一個(gè)線程從用戶態(tài)進(jìn)入到內(nèi)核態(tài)時(shí),需要進(jìn)行哪些切換?
1、幾乎所有的程序都要切換到內(nèi)核態(tài)運(yùn)行再返回用戶態(tài),用中斷完成的,因?yàn)樵趦?nèi)核下封裝了一些東西,用戶態(tài)下只是傳入某些參數(shù)后調(diào)用內(nèi)核態(tài)下的模扮函數(shù)罷了,
2、進(jìn)程有三態(tài)(執(zhí)行態(tài),謹(jǐn)畢就緒態(tài),阻塞態(tài)),cpu任何時(shí)刻都只有一個(gè)進(jìn)祥碼芹程在執(zhí)行,so從用戶態(tài)切換到內(nèi)核態(tài)時(shí),用戶態(tài)下的進(jìn)程就處于阻塞或就緒態(tài)了,至于從用戶態(tài)切換到內(nèi)核態(tài)執(zhí)行哪個(gè)函數(shù)那就看你在用戶態(tài)下執(zhí)行的是什么函數(shù)了,比如在用戶態(tài)下的lseek在內(nèi)核下就是llseek了,不一樣的。
3、這問(wèn)題就是linux的內(nèi)存管理了,這里就得提到三種地址(邏輯地址、線性地址、物理地址),這里我們提到的4G地址是邏輯地址,不是我們實(shí)際的物理地址,linux中一個(gè)進(jìn)程用戶占0-3G對(duì)應(yīng)的內(nèi)核占3G-4G部分
說(shuō)得不是很清楚,這是比較復(fù)雜的內(nèi)容,需要從頭看起,單就這幾個(gè)問(wèn)題是不能搞懂linux的,更好還是系統(tǒng)的學(xué)習(xí),不斷的重復(fù)
希望對(duì)你有所幫助!
用戶棧到內(nèi)核棧
在unix/linux系統(tǒng)中,什么是用戶態(tài),什么是內(nèi)核態(tài)
究竟什么是用戶態(tài),什么是內(nèi)核態(tài),這兩個(gè)基本概念以前一直理解得不是很清楚,根本原因個(gè)人覺(jué)得是在于因?yàn)榇蟛糠謺r(shí)候我們?cè)趯?xiě)程序時(shí)關(guān)注的重點(diǎn)和著眼的角度放在了實(shí)現(xiàn)的功能和代碼的邏輯性上,先看一個(gè)例子:
1)例子
C代碼
1. void testfork(){
2. if(0 = = fork()){
3. printf(“create new process success!\n”);
4. }
5. printf(“testfork ok\n”);
6. }
這段代碼很簡(jiǎn)單,從功能的角度來(lái)看,就是實(shí)際執(zhí)行了一個(gè)fork(),生成一個(gè)新的進(jìn)程,從邏輯的角度看,就是判斷了如果巖枝fork()返回的是則打印相關(guān)語(yǔ)句,然后函數(shù)最后再打印一句表示執(zhí)行完整個(gè)testfork()函數(shù)。代碼的執(zhí)行邏輯和功能上看就是如此簡(jiǎn)單,一共四行代碼,從上到下一句一句執(zhí)行而已,完全看不出來(lái)哪里有體現(xiàn)出用戶態(tài)和進(jìn)程態(tài)的概念。
如果說(shuō)前面兩種是靜態(tài)觀察的角度看的話,我們還可以從動(dòng)態(tài)的角度來(lái)看這段代碼,即它被轉(zhuǎn)換成CPU執(zhí)行的指令后加載執(zhí)行的過(guò)程,這時(shí)這段程序就是一個(gè)動(dòng)態(tài)執(zhí)行的指令序列。而究竟加載了哪些代碼,如何加載就是和操作系統(tǒng)密切相關(guān)了。
2)特權(quán)級(jí)
熟悉Unix/Linux系統(tǒng)的人都知道,fork的工作實(shí)際上是以系統(tǒng)調(diào)用的方式完成相應(yīng)功能的,具體的工作是由sys_fork負(fù)責(zé)實(shí)施。其實(shí)無(wú)論是不是Unix或者Linux,對(duì)于任何操作系統(tǒng)來(lái)說(shuō),創(chuàng)建一個(gè)新的進(jìn)程都是屬于核心功能,因?yàn)樗龊芏嗟讓蛹?xì)致地工作,消耗系統(tǒng)的物理資源,比如分配物理內(nèi)存,從父進(jìn)程拷貝相關(guān)信息,拷貝設(shè)置頁(yè)目錄頁(yè)表等等,這些顯然不能隨便讓哪個(gè)程序就能去做,于是就自然引出特權(quán)級(jí)別的概念,顯然,最關(guān)鍵性的權(quán)力必須由高特權(quán)級(jí)的程序來(lái)執(zhí)行,這樣才可以做到集中管理,減少有限資源的訪問(wèn)和使用沖突。
特權(quán)級(jí)顯然是非常有效的管理和控制程序執(zhí)行的手段,因此在硬件上對(duì)特權(quán)級(jí)做了很多支持,就Intel x86架構(gòu)的CPU來(lái)說(shuō)一共有0~3四個(gè)特權(quán)級(jí),0級(jí)更高,3級(jí)更低,硬件上在執(zhí)鬧納行每條指令時(shí)都會(huì)對(duì)指令所具有的特權(quán)級(jí)做相應(yīng)的檢查,相關(guān)的概念有 CPL、DPL和RPL,這里不再過(guò)多闡述。硬件已經(jīng)提供了一套特權(quán)級(jí)使用的相關(guān)機(jī)制,軟件自然就是好好利用的問(wèn)題,這屬于操作系統(tǒng)要做的事情,對(duì)于 Unix/Linux來(lái)說(shuō),只使用了0級(jí)特權(quán)級(jí)和3級(jí)特權(quán)級(jí)。也就是說(shuō)在Unix/Linux系統(tǒng)中,一條工作在級(jí)特權(quán)級(jí)的指令具有了CPU能提供的更高權(quán)力,而一條工作在3級(jí)特權(quán)級(jí)的指令具有CPU提供的更低或者說(shuō)最基本權(quán)力。
3)用戶態(tài)和內(nèi)核態(tài)
現(xiàn)在我們從特權(quán)級(jí)的調(diào)度來(lái)理解用戶態(tài)和內(nèi)核態(tài)就比較好理解了,當(dāng)程序運(yùn)行在3級(jí)特權(quán)級(jí)上時(shí),就可以稱之為運(yùn)行在用戶態(tài),因?yàn)檫@是更低特權(quán)級(jí),是普通的用戶進(jìn)程運(yùn)行的特權(quán)級(jí),大部分用戶直接面對(duì)的程序都是運(yùn)行在用戶態(tài);反之,當(dāng)程序運(yùn)行在級(jí)特權(quán)級(jí)上時(shí),就可以稱之為運(yùn)行在內(nèi)核態(tài)。
雖然用戶態(tài)下和內(nèi)核態(tài)下工作的程序有很多差別,但最重要的差別就在于特權(quán)級(jí)的不同,即權(quán)力的不同。運(yùn)行在用戶態(tài)下的程序不能直接訪問(wèn)操作系統(tǒng)內(nèi)核數(shù)據(jù)結(jié)構(gòu)和程序,比如上面例子中的testfork()就不能直接調(diào)用 sys_fork(),因?yàn)榍罢呤枪ぷ髟谟脩魬B(tài),屬于用戶態(tài)程序,而sys_fork()是工作在內(nèi)核態(tài),屬于內(nèi)核態(tài)程序。
當(dāng)我們?cè)谙到y(tǒng)中執(zhí)行一個(gè)程序時(shí),大部分時(shí)間是運(yùn)行在用戶態(tài)下的,在其需要操作系統(tǒng)幫助完成某些它沒(méi)有權(quán)力和能力完成的工作時(shí)就會(huì)切換到內(nèi)核態(tài),比如testfork()最初運(yùn)行在用戶態(tài)進(jìn)程下,當(dāng)它調(diào)用fork()最終觸發(fā) sys_fork()的執(zhí)行時(shí),就切換到了內(nèi)核態(tài)。
2. 用戶態(tài)和內(nèi)核態(tài)的轉(zhuǎn)換
1)用戶態(tài)切換到內(nèi)核態(tài)的3種方式
a. 系統(tǒng)調(diào)用
這是用戶態(tài)進(jìn)程主動(dòng)要求切換到內(nèi)核態(tài)的一種方式,用戶態(tài)進(jìn)程通過(guò)系統(tǒng)調(diào)用申請(qǐng)使用操作系統(tǒng)提供的服務(wù)程序完成工作,比如前例中fork()實(shí)際上就是執(zhí)行了一個(gè)創(chuàng)建新進(jìn)程的系統(tǒng)調(diào)用。而系統(tǒng)調(diào)用的機(jī)制其核心還是使用了操作系統(tǒng)為用戶特別粗彎敏開(kāi)放的一個(gè)中斷來(lái)實(shí)現(xiàn),例如Linux的int 80h中斷。
b. 異常
當(dāng)CPU在執(zhí)行運(yùn)行在用戶態(tài)下的程序時(shí),發(fā)生了某些事先不可知的異常,這時(shí)會(huì)觸發(fā)由當(dāng)前運(yùn)行進(jìn)程切換到處理此異常的內(nèi)核相關(guān)程序中,也就轉(zhuǎn)到了內(nèi)核態(tài),比如缺頁(yè)異常。
c. 外圍設(shè)備的中斷
當(dāng)外圍設(shè)備完成用戶請(qǐng)求的操作后,會(huì)向CPU發(fā)出相應(yīng)的中斷信號(hào),這時(shí)CPU會(huì)暫停執(zhí)行下一條即將要執(zhí)行的指令轉(zhuǎn)而去執(zhí)行與中斷信號(hào)對(duì)應(yīng)的處理程序,如果先前執(zhí)行的指令是用戶態(tài)下的程序,那么這個(gè)轉(zhuǎn)換的過(guò)程自然也就發(fā)生了由用戶態(tài)到內(nèi)核態(tài)的切換。比如硬盤(pán)讀寫(xiě)操作完成,系統(tǒng)會(huì)切換到硬盤(pán)讀寫(xiě)的中斷處理程序中執(zhí)行后續(xù)操作等。
這3種方式是系統(tǒng)在運(yùn)行時(shí)由用戶態(tài)轉(zhuǎn)到內(nèi)核態(tài)的最主要方式,其中系統(tǒng)調(diào)用可以認(rèn)為是用戶進(jìn)程主動(dòng)發(fā)起的,異常和外圍設(shè)備中斷則是被動(dòng)的。
2)具體的切換操作
從觸發(fā)方式上看,可以認(rèn)為存在前述3種不同的類型,但是從最終實(shí)際完成由用戶態(tài)到內(nèi)核態(tài)的切換操作上來(lái)說(shuō),涉及的關(guān)鍵步驟是完全一致的,沒(méi)有任何區(qū)別,都相當(dāng)于執(zhí)行了一個(gè)中斷響應(yīng)的過(guò)程,因?yàn)橄到y(tǒng)調(diào)用實(shí)際上最終是中斷機(jī)制實(shí)現(xiàn)的,而異常和中斷的處理機(jī)制基本上也是一致的,關(guān)于它們的具體區(qū)別這里不再贅述。關(guān)于中斷處理機(jī)制的細(xì)節(jié)和步驟這里也不做過(guò)多分析,涉及到由用戶態(tài)切換到內(nèi)核態(tài)的步驟主要包括:
從當(dāng)前進(jìn)程的描述符中提取其內(nèi)核棧的ss0及esp0信息。
使用ss0和esp0指向的內(nèi)核棧將當(dāng)前進(jìn)程的cs,eip,eflags,ss,esp信息保存起來(lái),這個(gè)
過(guò)程也完成了由用戶棧到內(nèi)核棧的切換過(guò)程,同時(shí)保存了被暫停執(zhí)行的程序的下一
條指令。
將先前由中斷向量檢索得到的中斷處理程序的cs,eip信息裝入相應(yīng)的寄存器,開(kāi)始
關(guān)于linux進(jìn)入內(nèi)核態(tài)的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)科技有限公司,經(jīng)過(guò)多年的不懈努力,公司現(xiàn)已經(jīng)成為一家專業(yè)從事IT產(chǎn)品開(kāi)發(fā)和營(yíng)銷公司。廣泛應(yīng)用于計(jì)算機(jī)網(wǎng)絡(luò)、設(shè)計(jì)、SEO優(yōu)化、關(guān)鍵詞排名等多種行業(yè)!
當(dāng)前題目:深入理解:Linux內(nèi)核態(tài)的進(jìn)入方式(linux進(jìn)入內(nèi)核態(tài))
分享鏈接:http://m.fisionsoft.com.cn/article/djcosgc.html


咨詢
建站咨詢
