操作系统 真象还原 读书笔记
文章目錄
- 環(huán)境配置
- 1、虛擬機(jī)virtualBox和centos
- 2、最小化虛擬機(jī)安裝后需要配置的基本軟件
- 2、1虛擬機(jī)連網(wǎng)
- 2.2 虛擬機(jī)軟件安裝
- 3、共享文件設(shè)置
- 3.1安裝virtualBox增強(qiáng)工具
- 3.2掛載文件
- 4、bochs安裝使用
- 1 實(shí)模式下內(nèi)存布局及BIOS
- bios(base input output system)干了什么事情?
- 2 mbr與loader引導(dǎo)程序
- loader 創(chuàng)建全局描述符表進(jìn)入保護(hù)模式
- loader創(chuàng)建頁表進(jìn)行內(nèi)存分頁管理(虛擬地址核心)
- loader中掃描內(nèi)存大小 加載內(nèi)核文件 進(jìn)行內(nèi)核文件映象的創(chuàng)建 執(zhí)行內(nèi)核文件
- 3 計(jì)算機(jī)開機(jī)過程總結(jié)
- 計(jì)算機(jī)上電
- 執(zhí)行 bios
- 執(zhí)行mbr
- 執(zhí)行l(wèi)oader進(jìn)入內(nèi)核程序(操作系統(tǒng))
- 補(bǔ)充計(jì)算機(jī)特權(quán)級的知識
- 4函數(shù)調(diào)用的約定
- 4.1 匯編代碼和C語言調(diào)用
- 5 中斷機(jī)制
- 中斷的分類
- 中斷描述符表
- 可編程中斷芯片
- 6 內(nèi)存管理
- 7 線程
- 7.1多線程機(jī)制
- 8 鎖機(jī)制
環(huán)境配置
1、虛擬機(jī)virtualBox和centos
下載virtualBox 安裝centos 這個(gè)比較簡單,但是安裝centos可以選擇安裝完整版也可以選擇安裝最小版,安裝最小版就需要補(bǔ)充安裝其他包
2、最小化虛擬機(jī)安裝后需要配置的基本軟件
2、1虛擬機(jī)連網(wǎng)
首先在virtualBox中將網(wǎng)絡(luò)設(shè)置為 NAT
然后到虛擬機(jī)中修改虛擬機(jī)的網(wǎng)絡(luò)腳本文件,主要就是將存在于/etc/sysconfig/network-scripts/ifcfg-enp0s3中的ONBOOT改為yes就可以了,不需要其他設(shè)置,之前重啟虛擬機(jī)就可以聯(lián)網(wǎng)了
可以嘗試拼一下百度網(wǎng)站
2.2 虛擬機(jī)軟件安裝
常用軟件安裝
yum groupinstall "Development Tools" //gcc, gcc-c++等常用軟件都會(huì)裝上gcc –v //正常則會(huì)顯示gcc 版本 [root@localhost ~]# yum -y install vim* [root@localhost ~]# yum install ncurses-devel zlib-devel texinfo gtk2-devel qt-devel tcl-devel tk-devel kernel-headers kernel-devel //不裝則bochs編譯時(shí)會(huì)出錯(cuò) [root@localhost ~]# yum install gtk* //前一行的gtk2-dvel已經(jīng)安裝,此行可不執(zhí)行 [root@localhost ~]# yum install build-essential nasm圖形化軟件安裝
因?yàn)閎ochs需要在圖形界面下才能正常運(yùn)行,所以需要安裝X Windows和Gnome [root@localhost ~]# yum grouplist |more //察看Gnome安裝包的名稱 [root@localhost ~]# yum groupinstall "X Window System" // 安裝基本的X系統(tǒng)組件 [root@localhost ~]# yum groupinstall "Gnome Desktop " //這一行根據(jù)第一行代碼查出來的名稱確定 [root@localhost ~]# startx //進(jìn)入Gnome3、共享文件設(shè)置
3.1安裝virtualBox增強(qiáng)工具
選擇安裝曾強(qiáng)工具,虛擬機(jī)中會(huì)出現(xiàn)一個(gè)新的DVD盤,
進(jìn)入這個(gè)vbox中在命令行用
第一次安裝可能會(huì)保存有kernerl headers沒有安裝,根據(jù)提示用yum將缺少的軟件包安裝后重啟,再重新用上面的命令安裝增強(qiáng)工具
3.2掛載文件
增強(qiáng)工具安裝成功后
在設(shè)備中設(shè)置共享文件夾就可以了
然后虛擬機(jī)中就會(huì)出現(xiàn)一個(gè)新的文件夾
4、bochs安裝使用
第一下載bochs文件,這本書使用的是bochs2.6.2 在bochs官網(wǎng)就可以直接下載,下載tar.gz版本然后解壓
利用,進(jìn)入解壓目錄設(shè)置配置文件
執(zhí)行完這一個(gè)configure命令之后。會(huì)生成一個(gè)makefile文件,這個(gè)時(shí)候需要打開makefile文件,在第92行中加上-lpthread 庫
然后執(zhí)行make 在執(zhí)行make install
執(zhí)行完make install
會(huì)在configure中指定的目錄下生成bochs可執(zhí)行文件
在安裝目錄根據(jù)書上教程添加bochsrc文件hd60M.img文件 mbr.bin等文件可以測試bochs是否正常,但是bochs報(bào)錯(cuò)不會(huì)彈出書中的對話框
bochsrc.disk中內(nèi)容
注意按下C仿真程序才會(huì)執(zhí)行
1 實(shí)模式下內(nèi)存布局及BIOS
書中采用intel8086系列講解,實(shí)模式下內(nèi)存大小為1MB,分為ROM(只讀內(nèi)存)和RAM(隨機(jī)存儲(chǔ))。BIOS存在于ROM中,并且所處的位置也是固定的在F000-fffff中,但是計(jì)算機(jī)開機(jī)最開始cs:ip指令指向的確實(shí)F0000:FFFF0,是因?yàn)檫@一行存儲(chǔ)的是一個(gè)跳轉(zhuǎn)指令,程序會(huì)跳轉(zhuǎn)到bios中的起點(diǎn)出,為什么這么設(shè)計(jì)呢?我覺得就是因?yàn)檫@個(gè)地址設(shè)計(jì)是靠硬件設(shè)計(jì)的,不好改,但是bios的大小可能會(huì)變,所以bios的起始地址可能會(huì)變,所以需要用一條跳轉(zhuǎn)指令來間接的確定bios的起始地址。
bios(base input output system)干了什么事情?
第1件事情: 檢測基本硬件
第2件事情: 初始化中斷向量表,中斷向量表存在最低地址處,中斷向量表指向的中斷程序存在于bios中
第3鍵事情最重要: 加載mbr引導(dǎo)程序,(這個(gè)是一個(gè)基礎(chǔ)引導(dǎo)程序,(會(huì)引導(dǎo)loader加載器程序)),并且跳轉(zhuǎn)執(zhí)行這個(gè)引導(dǎo)程序,加載mbr的時(shí)候就把它加載到0x7000這個(gè)位置,跳轉(zhuǎn)頁跳轉(zhuǎn)到這個(gè)位置執(zhí)行程序。
2 mbr與loader引導(dǎo)程序
mbr最主要的工作就是加載loader引導(dǎo)程序,loader程序做了很多工作,
loader 創(chuàng)建全局描述符表進(jìn)入保護(hù)模式
其中最關(guān)鍵之一就是將系統(tǒng)從實(shí)模式轉(zhuǎn)變?yōu)榱吮Wo(hù)模式。
實(shí)模式轉(zhuǎn)變?yōu)楸Wo(hù)模式中起到關(guān)鍵作用的就是全局描述符表GDT(存在去內(nèi)存中),全局描述符表中記錄的是段描述符,段描述符中記錄了一個(gè)段的屬性(這是保護(hù)模式的精髓):有段基址,內(nèi)存段類型,段界限,特權(quán)級,段是否存在于內(nèi)存中。也就是說訪問一個(gè)地址時(shí),需要通過這個(gè)全局描述符表找到對應(yīng)的段。怎么找段描述符呢?這個(gè)時(shí)候段寄存器中存著的就是選擇子(選擇子中0-1位表示特權(quán)級(將這里的特權(quán)級和段描述符中的特權(quán)級比較就可以實(shí)現(xiàn)一個(gè)權(quán)限等級的保護(hù)) 第2位表示在全局描述符表還是局部描述符表中查找段描述符),通過選擇子作為索引在全局描述符表中查找段描述符。全局描述符表通過全局描述符表指針GDTR找到,GDTR通過lgdt指令完成初始化,lgdt可以在實(shí)模式和保護(hù)模式實(shí)用。
進(jìn)入保護(hù)模式還需要其他工作配合:比如打開控制寄存器CR0的PE標(biāo)志位,匯編程序中用bit[32]來標(biāo)記。
loader創(chuàng)建頁表進(jìn)行內(nèi)存分頁管理(虛擬地址核心)
首先頁式管理和段式管理的不同在于,段式管理是將執(zhí)行文件分成不同的段,但是每一個(gè)段中地址必須是連續(xù)的,在物理地址上和邏輯地址都是相同的,但是頁式管理實(shí)現(xiàn)了邏輯地址式連續(xù)的但是物理地址是不連續(xù)的,程序執(zhí)行的時(shí)候首先是獲取了邏輯地址(線性地址),經(jīng)過頁部件的轉(zhuǎn)化為物理地址后,給相應(yīng)的寄存器去尋址。具體來說:分頁就是將段按照4kb大小來進(jìn)行分頁,然后每一個(gè)邏輯頁對應(yīng)一個(gè)物理頁。當(dāng)每次獲取一個(gè)邏輯地址(32位),前面20位相當(dāng)于頁索引,后面12位相當(dāng)于頁內(nèi)偏移。這20位索引又可以分為兩個(gè)10位的索引,形成頁目錄和頁表兩級索引。頁表項(xiàng)中內(nèi)容:4字節(jié):20位頁地址,12位屬性。
loader中掃描內(nèi)存大小 加載內(nèi)核文件 進(jìn)行內(nèi)核文件映象的創(chuàng)建 執(zhí)行內(nèi)核文件
loader程序首相創(chuàng)建全局描述符表,進(jìn)入保護(hù)模式,然后檢查系統(tǒng)最大內(nèi)存,將內(nèi)核文件加載到內(nèi)存中,創(chuàng)建頁表,進(jìn)入分頁模式,將內(nèi)核文件按照編譯地址完成內(nèi)核映射,形成內(nèi)核映像,然后跳轉(zhuǎn)到內(nèi)核映像中執(zhí)行內(nèi)核內(nèi)容。
在這本書中當(dāng)編譯內(nèi)核文件時(shí)需要修改一下編譯命令,不然gcc編譯出來的時(shí)elf64的頭文件而不是elf32的頭文件
gcc -m32 -c -o main.o main.c ld -m elf_i386 main.o -Ttext 0xc0001500 -e main -o kernel.bin3 計(jì)算機(jī)開機(jī)過程總結(jié)
計(jì)算機(jī)上電
計(jì)算機(jī)上電后,cpu的指令地址寄存器被初始化為0xF000:0xFFF0,這個(gè)地址指向一段物理內(nèi)存區(qū)域(ROM區(qū)域),然后獲取一個(gè)跳轉(zhuǎn)指令轉(zhuǎn)到bios代碼的執(zhí)行處,執(zhí)行bios代碼,完成硬件自檢的任務(wù)。注意這一段代碼載rom中,只可讀不可改。
執(zhí)行 bios
bios執(zhí)行最后會(huì)從磁盤(硬盤)中加載主引導(dǎo)程序MBR,
執(zhí)行mbr
MBR主要用來初始化CPU各種寄存器的值,然后從硬盤中讀取loader內(nèi)核加載程序。
執(zhí)行l(wèi)oader進(jìn)入內(nèi)核程序(操作系統(tǒng))
內(nèi)核加載程序需要完成比較多的事情,最主要的是內(nèi)核加載程序中實(shí)現(xiàn)了從實(shí)模式到保護(hù)模式的變換,以及虛擬地址的使用。在加載器中需要初始化全部描述符表GDT,全局描述符表主要用來在虛擬地址中通過選擇子(段寄存器中的內(nèi)容)查找段基址,以及通過描述段的屬性,來判定命令是否違規(guī),這里涉及到特權(quán)級的表示。加載器完成了這些負(fù)載工作后就可以加載真正的內(nèi)核程序了,加載內(nèi)核程序后創(chuàng)建頁表 ,開啟分頁管理模式,完成內(nèi)核映像,進(jìn)入內(nèi)核程序執(zhí)行。
補(bǔ)充計(jì)算機(jī)特權(quán)級的知識
計(jì)算機(jī)中將程序按照權(quán)限分為不同的級別0 1 2 3四個(gè)級別,級別數(shù)子越小權(quán)限越大。每一個(gè)段描述符中都有一個(gè)權(quán)限描述(DPL),然后訪問者也就是段寄存器中的屬性(除了選擇器,還有一個(gè)CPL訪問者權(quán)限),只有CPL <= DPL訪問才可以進(jìn)行。程序的執(zhí)行的權(quán)限可以改變,通過各種門結(jié)構(gòu)。比如用戶程序變?yōu)閮?nèi)核程序的時(shí)候CPL就會(huì)改變。
除了CPL DPL還有RPL,就是用戶程序的請求指令通過門變換為內(nèi)核程序等更高權(quán)限的指令時(shí)候,用RPL來記錄這條指令真正的背后發(fā)起者所擁有的權(quán)限。
權(quán)限檢查發(fā)生在利用選擇子去全局描述符表中查找段的時(shí)候。
4函數(shù)調(diào)用的約定
函數(shù)調(diào)用的核心就是參數(shù)傳遞,CS:IP地址指針的保存。參數(shù)傳遞利用棧來實(shí)現(xiàn),參數(shù)就是壓棧,調(diào)用者先把參數(shù)按照某個(gè)順序(從右到左)壓棧,然后被調(diào)用者按照順序取出參數(shù)。最后由調(diào)用者或者被調(diào)用者重置棧指針的值(相當(dāng)于清空棧)。
4.1 匯編代碼和C語言調(diào)用
因?yàn)镃代碼也會(huì)被編譯成匯編代碼,所以C代碼可以和匯編代碼相互調(diào)用,只要遵守相當(dāng)?shù)恼{(diào)用約定。
5 中斷機(jī)制
中斷的分類
可以分為內(nèi)中斷和外中斷,內(nèi)中斷是由內(nèi)部軟件驅(qū)動(dòng)了,外中斷是由硬件驅(qū)動(dòng)
中斷是否可屏蔽,有的中斷不可屏蔽(比如外部斷電等緊急外中斷,運(yùn)行時(shí)錯(cuò)誤等內(nèi)部中斷),有的中斷可屏蔽。
中斷描述符表
中斷描述符表中的每一條數(shù)據(jù)是八個(gè)字節(jié),記錄了中斷處理程序的地址以及其他屬性,中斷發(fā)生時(shí)通過中斷描述符表找到對應(yīng)的中斷處理程序進(jìn)行處理。
可編程中斷芯片
給外設(shè)用的,用于將外部中斷統(tǒng)一管理,可編程體現(xiàn)在中斷向量號可以分配,優(yōu)先級等其他屬性可以設(shè)置。
6 內(nèi)存管理
內(nèi)存管理真正管理的是物理內(nèi)存,內(nèi)存管理是通過位圖來管理的,用一位來管理4kb的內(nèi)存(bitmap)。具體來說,將內(nèi)存分為物理內(nèi)核內(nèi)存區(qū),物理用戶內(nèi)存區(qū),虛擬內(nèi)核內(nèi)存區(qū),虛擬用戶內(nèi)存區(qū)。內(nèi)存管理就是當(dāng)發(fā)現(xiàn)虛擬地址所表示的空間不在物理內(nèi)存中,就要向操作系統(tǒng)申請空間,分配內(nèi)存。
7 線程
進(jìn)程是一個(gè)程序執(zhí)行的完整描述,包含完整的地址空間,完整的資源控制。線程只是一段執(zhí)行流,包含執(zhí)行代碼段以及執(zhí)行的上下文環(huán)境(寄存器環(huán)境)。一個(gè)進(jìn)程中可以有多個(gè)線程,多個(gè)線程共享進(jìn)程的資源(鎖機(jī)制),
7.1多線程機(jī)制
多線程機(jī)制的核心在于需要線程表(記錄所有線程,這個(gè)線程表可以是鏈表),一個(gè)調(diào)度器,適時(shí)的調(diào)度不同的線程上處理器,并且為線程的調(diào)度創(chuàng)建或者保護(hù)上下文環(huán)境。
多線程可以在用戶級實(shí)現(xiàn),比如C++中提供的poxis多線程機(jī)制,也可以在內(nèi)核級實(shí)現(xiàn)。用戶級實(shí)現(xiàn)的多線程在操作系統(tǒng)層面不可見,操作系統(tǒng)依然以為只是一個(gè)進(jìn)程一個(gè)線程在運(yùn)行,但是內(nèi)核級的多線程機(jī)制,在操作系統(tǒng)層面也對應(yīng)多個(gè)任務(wù),這樣同一個(gè)進(jìn)程就可以占用更多的處理器資源。
操作系統(tǒng)層面的多線程需要借助PCB這種進(jìn)程線程的的文件格式進(jìn)行管理。
在操作系統(tǒng)中線程切換需要三步:時(shí)鐘中斷處理,調(diào)度器調(diào)度,任務(wù)切換函數(shù)。
8 鎖機(jī)制
加鎖釋放鎖本質(zhì)上也是很多操作的集合,怎么保證加鎖釋放鎖的原子性呢?這就是通過關(guān)中斷實(shí)現(xiàn)鎖操作的原子性(所以開關(guān)中斷是實(shí)現(xiàn)鎖的最底層技術(shù))。
臨界區(qū):多線程進(jìn)程對共享資源的競爭代碼
阻塞是一個(gè)線程或者進(jìn)程的主動(dòng)行為,自己將自己移動(dòng)到阻塞隊(duì)列中
喚醒:是當(dāng)前線程將鎖上等待的其他線程從阻塞隊(duì)列中救出來放到就緒隊(duì)列首部
總結(jié)
以上是生活随笔為你收集整理的操作系统 真象还原 读书笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode:位操作
- 下一篇: TCP/UDP 套接字总结