kernel 是什么?
- 當(dāng)計(jì)算機(jī)接上電源的那一刻,會(huì)啟動(dòng)一個(gè)
kernel程序,加載到內(nèi)存當(dāng)中,這是整套系統(tǒng)第一個(gè)加載到內(nèi)存當(dāng)中的程序,也就是說kernel接管了硬件的調(diào)用,kernel它將最底層封裝后,內(nèi)核會(huì)向外暴露一些調(diào)用,又叫系統(tǒng)調(diào)用(system call)。
當(dāng)其他程序要調(diào)用資源的時(shí)候,是直接面向于kernel的。例如訪問硬盤。 -
kernel還起到一個(gè)非常關(guān)鍵的安全性保證,不讓其他程序亂動(dòng)硬件和訪問其他程序的內(nèi)存,因此kernel與cpu存在著兩種交互模式。
kernel加載到內(nèi)存前與cpu的交互是實(shí)模式,加載完畢以后,轉(zhuǎn)換為保護(hù)模式。
實(shí)模式下,kernel訪問cpu請(qǐng)求,獲取到的都是真實(shí)的物理地址。
保護(hù)模式將kernel本身的內(nèi)存地址虛擬化隔離開,還可以將其他程序分配到一個(gè)虛擬地址。 -
kernel中有個(gè)調(diào)度程序,會(huì)將其他的活動(dòng)進(jìn)程扔到一個(gè)隊(duì)列里面。內(nèi)核里面還有一個(gè)中斷向量表,是一個(gè)hashmap,key為中斷號(hào),值為回調(diào)函數(shù)。
在程序沒啟動(dòng)前,程序只是一個(gè)文件,當(dāng)程序啟動(dòng)時(shí),內(nèi)核會(huì)讀取文件將其讀取到內(nèi)存當(dāng)中。
時(shí)分系統(tǒng)與中斷
單核cpu利用時(shí)間片來保證每個(gè)程序同時(shí)運(yùn)行。也叫時(shí)分系統(tǒng)。
時(shí)間片如何產(chǎn)生的?
晶振(硬件):直流電輸入,輸入過程是沒有間歇的,它的輸出是按照一定頻率分段的(交流電的輸入是有間隔的)。它的輸出會(huì)連接到cpu上,因?yàn)橛虚g隔的輸出,每當(dāng)cpu收到一個(gè)電流信號(hào),則會(huì)發(fā)生一個(gè)中斷行為。
當(dāng)中斷行為產(chǎn)生,cpu會(huì)把當(dāng)前執(zhí)行的程序在cpu上的寄存器中緩存的數(shù)據(jù)寫回到內(nèi)存(先找到中斷向量表,再通過kernel),保留上下文現(xiàn)場(chǎng)。再把另外一個(gè)(Kernel的隊(duì)列按順序取出看優(yōu)先級(jí))需要加載的程序的內(nèi)存再放回到寄存器中。之后,再執(zhí)行用戶的程序代碼,開始進(jìn)入了用戶態(tài)。如此循環(huán)。

鍵盤會(huì)產(chǎn)生中斷告訴cpu該執(zhí)行此程序了,因?yàn)橥庠O(shè)設(shè)備可以自己產(chǎn)生間斷的電壓告訴cpu發(fā)生中斷。
當(dāng)執(zhí)行到 system.out.println("hello world")
在這個(gè)過程中,我們首先會(huì)進(jìn)入到系統(tǒng)調(diào)用入口程序,然后會(huì)往cpu寄存器(eax)送寫了一個(gè)write函數(shù),參數(shù)('hello world')也會(huì)放到一個(gè)寄存器(ebx),緊接著當(dāng)cpu看到write后,就會(huì)開始找內(nèi)核kernel,因?yàn)樗恢纖rite函數(shù)是在內(nèi)核的哪個(gè)地址上,然后cpu會(huì)埋下一個(gè)cpu的指令 int 0x80,int是指令不是變量類型,為中斷的前三個(gè)字母的首字母interrupt,當(dāng)讀到int指令后,就會(huì)讀到0x80,0x80是16進(jìn)制的128,128存在中斷向量表當(dāng)中,找到對(duì)應(yīng)的回調(diào)函數(shù),即切換程序指令,這個(gè)回調(diào)函數(shù)的大致內(nèi)容是不要執(zhí)行當(dāng)前程序了,開始保護(hù)當(dāng)前程序的上下文現(xiàn)場(chǎng),放入到寄存器,然后進(jìn)入阻塞狀態(tài),到內(nèi)核,把剛才寄存器里放的write在kernel重新注冊(cè)的地址,找到這個(gè)函數(shù)運(yùn)行執(zhí)行,這個(gè)時(shí)候就是由用戶態(tài)的程序跑到內(nèi)核態(tài)。
結(jié)論,cpu最終會(huì)從內(nèi)核中讀取指令。程序給cpu指令,產(chǎn)生中斷,cpu再通過內(nèi)核執(zhí)行函數(shù)。這個(gè)叫做系統(tǒng)調(diào)用態(tài)的切換過程。
函數(shù)調(diào)用:不需要產(chǎn)生中斷,同一個(gè)程序發(fā)生兩個(gè)指令,不需要切換時(shí)間片,就在同一個(gè)進(jìn)程所有的內(nèi)存中
系統(tǒng)調(diào)用成本比較高,需要產(chǎn)生中斷。io牽扯到硬件,必然會(huì)發(fā)生中斷,會(huì)有內(nèi)核態(tài)切換的過程。
內(nèi)核要保護(hù)進(jìn)程內(nèi)存,多個(gè)程序需要以中斷的方式使用內(nèi)核。
中斷,陷阱,異常的該方面知識(shí)的擴(kuò)展
https://www.cnblogs.com/broglie/p/5463359.html
https://blog.csdn.net/yikaozhudapao/article/details/89279304
https://www.cnblogs.com/yudao/p/4386775.html?utm_source=tuicool&utm_medium=referral