中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

網(wǎng)站備案需要花錢嗎東莞網(wǎng)絡(luò)推廣平臺

網(wǎng)站備案需要花錢嗎,東莞網(wǎng)絡(luò)推廣平臺,今日全國豬價最新表,wordpress 自動作者:小牛呼嚕嚕 | https://xiaoniuhululu.com 計算機內(nèi)功、源碼解析、科技故事、項目實戰(zhàn)、面試八股等更多硬核文章,首發(fā)于公眾號「小牛呼嚕?!?文章目錄 回顧計算機啟動過程8086、80x86是什么意思?寄存器初始化CS:IPCPU是如何和ROM相連的?加載MBR到…

作者:小牛呼嚕嚕 | https://xiaoniuhululu.com
計算機內(nèi)功、源碼解析、科技故事、項目實戰(zhàn)、面試八股等更多硬核文章,首發(fā)于公眾號「小牛呼嚕?!?/p>

文章目錄

    • 回顧計算機啟動過程
      • 8086、80x86是什么意思?
      • 寄存器初始化CS:IP
      • CPU是如何和ROM相連的?
      • 加載MBR到內(nèi)存中
    • bootsect.S具體干了什么?
      • 設(shè)置段基址 & 內(nèi)存分段機制
      • bootsect的"再次搬家"到0x90000
      • 加載setup.s到內(nèi)存0x90200
      • 加載system到內(nèi)存0x10000
    • 尾語

大家好,我是呼嚕嚕,在上一篇文章聊聊x86計算機啟動發(fā)生的事?我們了解了x86計算機啟動過程,MBR、0x7c00是什么?其中當(dāng)bios引導(dǎo)結(jié)束后,操作系統(tǒng)接過計算機的控制權(quán)后,發(fā)生了哪些事?本文將揭開迷霧的序章-Bootsect.S

回顧計算機啟動過程

我們先來回顧一下,上古時期計算機按下電源鍵的啟動過程,這里以8086架構(gòu)為例:

8086、80x86是什么意思?

有許多人不知道 經(jīng)常遇到的8086、80x86是什么意思?我們簡單科普一下:

  1. 8086是Intel公司推出的最早,也是最流行的面向個人電腦的CPU型號
  2. x86泛指一系列基于Intel 8086且向后兼容的中央處理器指令集架構(gòu),由于以“86”作為結(jié)尾,因此其架構(gòu)被稱為"x86"
  3. 80x86也就是在8086基礎(chǔ)上的增強版,包括80286,80386,80486,其后面就是我們所熟悉的奔騰、酷睿、i5、i7等等

寄存器初始化CS:IP

相比于上一篇文章聊聊x86計算機啟動發(fā)生的事,我們這里再講細致點,當(dāng)計算機一按下電源后,8086CPU就處于實模式的狀態(tài),此時會將CPU的寄存器初始化為CS=0xFFFF;IP=0x0000,也就是實際物理地址0xFFFF0(CS左移4位+IP)

CS : 代碼段寄存器;IP : 指令指針寄存器。CS:IP指向的內(nèi)容 會被CPU當(dāng)做計算機指令去執(zhí)行

那么從地址0xFFFF0中取出來的指令是什么?我們知道當(dāng)電路通電后,內(nèi)存是一片空白的,內(nèi)存斷電后 數(shù)據(jù)是無法保存的,所以BIOS程序需要事先被刷入只讀存儲器ROM中。物理地址0xFFFF0就是指向這樣一段BIOS ROM

CPU是如何和ROM相連的?

那么問題又來了,CPU是如何和ROM相連的?CPU 不僅和ROM相連,還和RAM(俗稱內(nèi)存),IO接口等設(shè)備相連,他們是通過總線相連。還好當(dāng)時筆者將計算機組成原理好好復(fù)習(xí)了一遍,不然這部分真挺難理解的。

總線是貫穿整個系統(tǒng)的是一組電子管道,是連接各個部件的信息傳輸線,是各個部件共享的傳輸介質(zhì),稱作總線,它攜帶信息字節(jié)并負(fù)責(zé)在各個計算機部件間傳遞

總線按系統(tǒng)總線傳輸信息內(nèi)容的不同,又可以分為3 種:數(shù)據(jù)總線、地址總線和控制總線。我們這里用到的就是地址總線,把 0xFFFF0 作為 CPU 的地址總線信號傳輸出去,去這個地址總線對應(yīng)的位置處找

由于計算機有多個設(shè)備,必然會存在多個設(shè)備同時競爭總線控制權(quán)的問題,這時候就需要**總線仲裁,**讓某個設(shè)備優(yōu)先獲得總線控制權(quán),獲得了總線控制權(quán)的設(shè)備,才能開始傳送數(shù)據(jù)。未獲勝的設(shè)備只能等待獲勝的設(shè)備處理完成后才能執(zhí)行。

我們簡單總結(jié)一下:當(dāng)總線仲裁器仲裁通過后,CPU可以依靠地址總線尋址,找到對應(yīng)設(shè)備ROM上地址0xFFFF0處的內(nèi)容。

拓展可見:什么是計算機中的高速公路-總線?

加載MBR到內(nèi)存中

當(dāng)BIOS自檢完成,設(shè)置啟動順序后,利用 BIOS 的輸入功能將啟動磁盤的啟動扇區(qū)MBR(也叫第一扇區(qū),主引導(dǎo)記錄)的內(nèi)容原封不動地搬到內(nèi)存的0x7C00地址處,并設(shè)置CPU寄存器CS=0x07C0,IP=0x0000。到這一步,計算機的控制權(quán)將交到操作系統(tǒng)手中!

為什么是0x7C00這個地址?如何得出?別再問了,本文不再解釋了,具體看筆者的上一篇文章聊聊x86計算機啟動發(fā)生的事

對于Linux0.12來說,第一個程序Bootsect.S 編譯成二進制后,需要事先放到主引導(dǎo)記錄MBR中,MBR大小就是一個扇區(qū)的大小512字節(jié),如果這512字節(jié)的最后兩個字節(jié)是0x55AA,表明這個設(shè)備可以用于啟動。只有這樣我們BIOS才能識別它,才能把bootsect.S加載到內(nèi)存中。

如果不是0x55和0xAA,表明設(shè)備不能用于啟動,控制權(quán)于是被轉(zhuǎn)交給"啟動順序"中的下一個設(shè)備。如果到最后還是沒找到符合條件的,直接報出一個無啟動區(qū)的error。

下面我們看下操作系統(tǒng)編譯后,存放在儲存設(shè)備(硬盤)的模塊分布:


先簡單介紹一下,不必深究,后續(xù)文章會娓娓道來:

  1. bootsect.s的主要作用就是加載操作系統(tǒng),把操作系統(tǒng)從硬盤中,加載到內(nèi)存里去
  2. setup.s的主要作用:首先獲得光標(biāo),內(nèi)存,顯卡,磁盤等硬件參數(shù)存放在內(nèi)存空間中,方便后續(xù)程序使用;臨時建立gdt、idt表,并且從實模式進入到了保護模式
  3. 在linux0.12源碼,boot目錄下還有一個head.s,在上圖中被歸于system模塊,屬于操作系統(tǒng)主體文件,主要是進行進入保護模式之后的初始化工作
  4. system模塊:就是操作系統(tǒng)的主體,比如文件系統(tǒng),IO,進程等模塊。 Linux0.12 內(nèi)核 system 模塊大約占隨后的 260 個扇區(qū)。

更多精彩文章在公眾號「小牛呼嚕嚕」

bootsect.S具體干了什么?

bootsect的主要作用就是加載操作系統(tǒng),把操作系統(tǒng)從硬盤中,加載到內(nèi)存里去,我們下面結(jié)合bootsect.s的源碼一起來看看bootsect.S具體干了什么?

呼嚕嚕這里整個過程先匯成了圖,大家配合圖去閱讀下文,對照起來,更容易理解

設(shè)置段基址 & 內(nèi)存分段機制

要想bootsect啟動,需要讓BIOS將bootsect.s 從硬盤的MBR中搬到 內(nèi)存位置0x7c00處,大小512個字節(jié)。當(dāng)bootsect被BIOS加載到內(nèi)存后,計算機的控制權(quán)就到操作系統(tǒng)bootsect的手上了。

entry start        ! 告知鏈接程序,程序入口是從start 標(biāo)號開始執(zhí)行的
start:mov	ax,#BOOTSEG  !BOOTSEG=0x7c0 , 將 ds 段寄存器置為 0x7C0mov	ds,ax        !再將 ax 段寄存器里的值復(fù)制到 ds 段寄存器里mov	ax,#INITSEG  !SETUPSEG=0x9000,將 es 段寄存器置為 0x9000mov	es,ax        !再將 ax 段寄存器里的值復(fù)制到 es 段寄存器里mov	cx,#256sub	si,sisub	di,direpmovw     jmpi	go,INITSEG

我們可以看到CPU實際執(zhí)行第一句的代碼 mov ax,#BOOTSEG !BOOTSEG=0x7c0,這是匯編寫的,其實這里的0x7c0對應(yīng)的就是我們上文的地址0x7C00

0x7c0是段地址,0x7C00是其實際的物理地址,0x7c0左移四位就是0x7c00,這就是內(nèi)存尋址-分段機制

那么大家一定會有疑問內(nèi)存為什么分段?

計算機內(nèi)存究竟是什么?其實它就像數(shù)組一樣,咦有人不懂?dāng)?shù)組是什么,那么我們可以再頭腦風(fēng)暴一下,內(nèi)存其實就像紙帶一樣,我們來看下上古時期的計算機:

穿孔紙帶,圖片來源于網(wǎng)絡(luò)

紙帶上有一個個孔,這樣大家可能還看不明白,我們再來看一張圖:

這些孔排列組合其實就是二進制數(shù),紙帶其實就是儲存數(shù)據(jù)的介質(zhì),那么內(nèi)存就是足夠長的“紙帶”

在現(xiàn)代計算機中,內(nèi)存它使用的是DRAM芯片,也叫動態(tài)隨機存取存儲器,即只需給出地址,就能直接訪問指定地址的數(shù)據(jù),這一點特別像數(shù)組,所以許多材料都是用數(shù)組來畫內(nèi)存圖

那么CPU訪問內(nèi)存明明可以直接通過地址訪問內(nèi)存,為什么還要分段?其實這又是一個歷史因素導(dǎo)致的,讓我們回到"分段"首次出現(xiàn)的時候:"分段"是從Intel 8086芯片開始的,8086又是你…

由于8086那個時代CPU、內(nèi)存都很昂貴, CPU 和寄存器等寬度都是 16 位的,其可尋址2的16次方字節(jié),也就是64kb,然而8086有20根地址線,可尋址的最大內(nèi)存空間是1MB。CPU和寄存器的尋址能力遠遠不能滿足使用,于是機智的祖師爺們,采用了分段技術(shù)

分段,為解決這個問題,8086引入段寄存器,如CS、DS、ES、SS。通過段基址+段內(nèi)偏移地址的方式生成20位的地址,擴大尋址能力,從而實現(xiàn)對1MB內(nèi)存空間的尋址。由于這樣程序中指令了只用到16位地址,縮短了指令長度,也變相地提高了程序執(zhí)行速度。

  • CS:代碼段寄存器,存放代碼段的段基址
  • DS是數(shù)據(jù)段寄存器,存放數(shù)據(jù)段的段基址
  • ES是擴展段寄存器,存放當(dāng)前程序使用附加數(shù)據(jù)段的段基址,該段是串操作指令中目的串所在的段
  • SS是堆棧段寄存器,存放堆棧段的段基址
  • 80836還新增2個寄存器,FS標(biāo)志段寄存器、GS全局段寄存器。

使用段地址還有一個好處是 程序可以重定位,那個時候的計算機可沒有虛擬地址之說,只有物理地址訪問任何存儲單元都直接給出物理地址。這就帶來一個問題: 如果此時計算機多道程序并發(fā)運行,程序中的地址都是實際物理地址,這些程序編譯出來的程序運行地址是相同的,計算機只能運行一個程序。

重定向: 將程序中指令的地址改成另一個地址,但該地址處的內(nèi)容還是原內(nèi)存地址處的內(nèi)容。這樣程序指令雖然還是物理地址,但程序能夠并發(fā)運行了。

1982年處理器80286,首次提出保護模式概念,為了保持兼容性,所以同樣支持內(nèi)存分段管理,將8086這種稱為實模式,最大的區(qū)別是物理內(nèi)存地址不能直接被程序訪問,這塊非常重要,篇幅也較長,筆者先挖坑,后續(xù)系列文章再單獨出一篇。

咳咳,拓展的有點多了,趕緊讓我們回到bootsect源碼處

mov ds,ax 這句話代碼的意思就是:將 ax 段寄存器里的值復(fù)制到 ds 段寄存器里。ds在上文我們提到,8086特地為采用內(nèi)存分段機制,引入的段寄存器。ds具體表示 數(shù)據(jù)段寄存器存放數(shù)據(jù)段的段基址

換句話說,就是將段基址設(shè)為0x07c0,那么后續(xù)數(shù)據(jù)段程序中只需寫段內(nèi)偏移地址,就能訪問實際物理地址了。比如后續(xù)程序中出現(xiàn)mov ax,0x010x01其實是[ds:0x01],那么ax的實際物理地址= 0x07c0 <<4 + 0x01。將ds寄存器段基址設(shè)置好后,其實就是方便之后程序訪問內(nèi)存,訪問的數(shù)據(jù)的內(nèi)存地址都先默認(rèn)加上 0x7c00,然后再去內(nèi)存中尋址。

如果實際編程時,代碼段的起始地址一般放到 CS寄存器,雖然CPU沒有強制規(guī)定代碼段、數(shù)據(jù)段等分離。

mov ax,#INITSEGmov es,ax 將 ax 段寄存器里的值0x9000復(fù)制到 es 段寄存器里,和ds賦值同理,不再贅述。需要注意的是8086無法直接給段寄存器進行賦值,需要使用通用寄存器來當(dāng)中介(一般使用ax)

bootsect的"再次搬家"到0x90000

接著bootsect自己把自己從內(nèi)存位置0x7c00處,搬到0x90000處,這次可沒BIOS幫忙了,得自食其力

          
start:mov	ax,#BOOTSEG  mov	ds,ax        mov	ax,#INITSEG  mov	es,ax        mov	cx,#256       ! 設(shè)置移動計數(shù)值=256 字(512 字節(jié));sub	si,si         ! si寄存器 清零sub	di,di         ! di寄存器 清零rep               ! 重復(fù)執(zhí)行并遞減 cx 的值,直到 cx = 0 為止。movw              ! 即 movs 指令。從內(nèi)存[si]處移動 cx 個字到[di]處。//一次移動兩個字節(jié),256B*2=512B

mov cx,#256 將cx 寄存器的值賦值為 256,單位是字(Word), 1 word=2Byte

sub si,si 是si寄存器 清零操作,sub是匯編語言中的一種運算指令,它用來執(zhí)行減法運算,并將結(jié)果存儲到被減數(shù)(前者)上去。比如sub a,b就是a = a-b。再結(jié)合前面的ds,es,那么此時si的段地址ds:si = 0x07C0:0x0000,同理di的段地址es:di = 0x9000:0x0000

rep就是重復(fù)執(zhí)行后一條指令,movw就是復(fù)制的意思。rep movw 就是重復(fù)多次搬運

我們可以知道這段的總體意思就是:循環(huán)256次,反復(fù)將段地址0x07C0:0x0000的內(nèi)容一個字一個字的復(fù)制到段地址0x9000:0x0000處,直到寄存器cx為0。這樣就實現(xiàn)了bootsect的"自我搬運",把實際物理內(nèi)存地址0x7c00處512個字節(jié)的內(nèi)容全部復(fù)制到實際物理內(nèi)存地址0x90000處。

那為啥bootsect還要"多此一舉" 將自己從0x7c00,搬到0x90000處?

  • 操作系統(tǒng)system后續(xù)最終是要從物理內(nèi)存起始位置處 地址0開始存放,好處是讓system代碼中的地址對應(yīng)上實際的物理地址。
  • 一般要留512KB的內(nèi)存空間放操作系統(tǒng)system,會覆蓋0x7c00地址的內(nèi)容,所以需要把bootsect代碼搬到內(nèi)存更高處。

加載setup.s到內(nèi)存0x90200

當(dāng)上面bootsect完成自我搬運后,緊接著執(zhí)行jmpi go,INITSEG,jmpi有段間跳轉(zhuǎn)的作用。這里 INITSEG 指出跳轉(zhuǎn)到的段地址0x9000,標(biāo)號 go 是段內(nèi)偏移地址。

其實就是執(zhí)行完jmpi go,INITSEG后,CPU已經(jīng)移動到內(nèi)存0x90000+go位置處的代碼中 執(zhí)行。為啥要加go?其實此時bootsect編譯后的二進制內(nèi)容,已經(jīng)搬運到內(nèi)存0x90000處,但是我們不能再從頭執(zhí)行start: mov ax,#BOOTSEG操作,而是從go: mov ax,cs處代碼繼續(xù)執(zhí)行下去。

	jmpi	go,INITSEG  ! 段間跳轉(zhuǎn)。這里 INITSEG 指出跳轉(zhuǎn)到的段地址,標(biāo)號 go 是段內(nèi)偏移地址。go:	mov	ax,cs		mov	dx,#0xfef4	! arbitrary value >>512 - disk parm sizemov	ds,axmov	es,axpush	ax        ! 臨時保存段值(0x9000)mov	ss,ax		    ! put stack at 0x9ff00 - 12.mov	sp,dxpush	#0        ! 置段寄存器 fs = 0。pop	fs          ! fs:bx 指向存有軟驅(qū)參數(shù)表地址處(指針的指針)mov	bx,#0x78		! fs:bx is parameter table addressseg fslgs	si,(bx)			! gs:si is sourcemov	di,dx			! es:di is destinationmov	cx,#6			! copy 12 bytescldrep           ! 復(fù)制 12 字節(jié)的軟驅(qū)參數(shù)表到 0x9000:0xfef4 處。seg gsmovwmov	di,dxmovb	4(di),*18		! patch sector countseg fs         ! 讓中斷向量 0x1E 的值指向新表。mov	(bx),diseg fsmov	2(bx),espop	axmov	fs,axmov	gs,axxor	ah,ah			! reset FDC 讓中斷向量 0x1E 的值指向新表。xor	dl,dlint 	0x13	

上述主要是將 寄存器DS、ES 和SS 重新設(shè)置為CPU移動后,代碼所在的段處0×9000 ,設(shè)置SP棧寄存器0xfef4
棧指針要遠大于512字節(jié)偏移(即 0x90200 )處都可以,一般setup程序大概占用4個扇區(qū),這樣棧頂段地址ss:sp和現(xiàn)有的代碼足夠遠 ,防止后續(xù)棧操作覆蓋掉已有的代碼。

還有BIOS 設(shè)置的中斷 0x1e 的中斷向量值等操作。這邊和主干操作不太相干,簡略過一下,主要就是把這些寄存器重新設(shè)置好值,方便后續(xù)使用。

更多精彩文章在公眾號「小牛呼嚕嚕」

接下來緊接著將setup.s 加載到內(nèi)存0x90200

load_setup:xor	dx, dx			         ! 驅(qū)動器drive 0, 磁頭head 0mov	cx,#0x0002		    	 ! 扇區(qū)sector 2, 磁道號track 0,從第二個扇區(qū)開始讀mov	bx,#0x0200					 ! 偏移address = 512, in INITSEG ,表示讀到0x90200mov	ax,#0x0200+SETUPLEN	 ! service 2, nr of sectors ,SETUPLEN是 4個扇區(qū)int	0x13								 ! read itjnc	ok_load_setup				 ! ok,就跳到ok_load_setuppush	ax								 ! dump error codecall	print_nl           ! 屏幕光標(biāo)回車mov	bp, spcall	print_hex          ! 顯示十六進制值pop	ax	xor	dl, dl							 ! reset FDCxor	ah, ahint	0x13j	load_setup             ! j 即 jmp 指令,失敗就再跳轉(zhuǎn)到load_setup,重復(fù)執(zhí)行

那怎么簡單高效將磁盤里的內(nèi)容加載到內(nèi)存中呢?linus這里用的是bios的中斷程序,因為此時bios還在內(nèi)存中,可以為我們所用,0x13號中斷 在BIOS中是可以訪問軟盤、IDE、ROM、遠程磁盤服務(wù)的作用。

這里0x13 和C語言中的函數(shù)調(diào)用是很像的,不過需要注意的是它的參數(shù)只能通過寄存器去傳參,而C語言函數(shù)調(diào)用不僅可以寄存器傳參,還可以棧傳參。所以0x13的參數(shù)就是其前面的dx,cx,bx,ax寄存器的值,另外磁盤只認(rèn)磁頭磁道扇區(qū),如果給個地址,磁盤是不識別的,磁盤一副不太聰明的樣子。

另外xor對兩個操作數(shù)進行邏輯(按位)異或操作,并將結(jié)果存放在目標(biāo)操作數(shù),xor dx,dx也是一個置零操作,指定驅(qū)動和磁頭

那么我們連起來,這段主要是讓bios 0x13號中斷處理程序 從磁盤的第2扇區(qū)開始讀,接連讀4個扇區(qū)的內(nèi)容到內(nèi)存0x90200處中。成功就跳轉(zhuǎn)到ok_load_setup,沒成功就回到load_setup,重復(fù)執(zhí)行上述操作。

加載system到內(nèi)存0x10000

當(dāng)bootsect成功將setup.s搬到內(nèi)存0x90200處后,CPU從ok_load_setup處繼續(xù)執(zhí)行指令。接下來就是需要將整個操作系統(tǒng)system(head.s+其他文件,大約260個扇區(qū))的內(nèi)容加載到內(nèi)存0x10000處,下面我們就具體看下代碼是如何實現(xiàn)的:

ok_load_setup:! Get disk drive parameters, specifically nr of sectors/track  
!提示這面段代碼功能是:利用BIOSINT 0x13 中斷,來來取磁盤的一些參數(shù),比如是取每磁道扇區(qū)數(shù),并保存在
位置 sectors 處xor	dl,dlmov	ah,#0x08		! AH=8 is get drive parametersint	0x13xor	ch,chseg cs          !表示下一條語句的操作數(shù)在 cs 段寄存器所指的段中。它只影響其下一條語句mov	sectors,cxmov	ax,#INITSEGmov	es,ax       !取磁盤參數(shù)中斷改了es寄存器的值,這里重置es的值! Print some inane message 提示下面這段功能是:打印一些消息mov	ah,#0x03		  ! read cursor pos 讀取當(dāng)前光標(biāo)的地址xor	bh,bhint	0x10          ! bios 0x10中斷,其作用:在屏幕上顯示字符和字符串mov	cx,#9mov	bx,#0x0007		! page 0, attribute 7 (normal)mov	bp,#msg1      ! msg1的內(nèi)容是:  .byte 13,10(換行+回車)  .ascii "Loading"mov	ax,#0x1301		! write string, move cursorint	0x10! ok, we've written the message, now
! we want to load the system (at 0x10000)   加載system到內(nèi)存0x10000mov	ax,#SYSSEGmov	es,ax		     ! segment of 0x010000call	read_it    ! 讀磁盤上 system 模塊call	kill_motor ! 關(guān)閉驅(qū)動器馬達call	print_nl   ! 光標(biāo)回車換行... 省略非主干代碼...! after that (everyting loaded), we jump to
! the setup-routine loaded directly after
! the bootblock:jmpi	0,SETUPSEG   !bootsect程序到這里就結(jié)束了,跳轉(zhuǎn)到0x9020,同時setup獲得控制權(quán)

這里int 0x10號中斷,其作用是 在屏幕上顯示字符和字符串,由于操作系統(tǒng)比較大,加載需要時間,這時在屏幕上顯示提示信息"Loading"

這里將操作系統(tǒng)加載到內(nèi)存中,是通過子程序read_it來實現(xiàn)的,read_it就不具體展開了,比較復(fù)雜。我們需要知道由于操作系統(tǒng)比較大,一個磁道是遠遠放不下的,另外磁盤是不認(rèn)地址的,在搬運過程中,需要進行磁道、扇區(qū)和磁頭的計算,特別是一個段的大小是64k,如果放不下,需要更換段地址。如果不更換段地址,會從該段地址0字節(jié)開始重新寫,這樣會覆蓋之前的內(nèi)容。

那為什么一個段的大小是64KB呢?
我們知道在8086CPU中,其內(nèi)存地址是表示為段基址+段內(nèi)偏移地址,其中偏移地址使用一個16位的二進制數(shù)表示,表示范圍0000~FFFF,所以總共有2^16(2的16次方)=64K個不同的地址,一個內(nèi)存最小單元是字節(jié)Byte,所以一個段大小為64KB

jmpi 0,SETUPSEG,bootsect程序到這里就結(jié)束了,跳轉(zhuǎn)到內(nèi)存地址0x90200,同時setup獲得控制權(quán)

為了幫助大家理解,呼嚕嚕這里又把本篇文章全部串起來,大家可以根據(jù)下面這張圖重新回顧一下bootsect整個工作流程:

額外補充一下:

boot_flag: .word 0xAA55 最后2個字節(jié)是0xAA55,由于bootsect是采用AT&T匯編,小端顯示的,實際上就是0x55AA與前文MBR那邊前后呼應(yīng)

這也說明了操作系統(tǒng)在開始加載到內(nèi)存的程序中,得與內(nèi)存地址一一對應(yīng), 不能多一個字節(jié),也不能少一個字節(jié)!!!

尾語

本文主要講解了bootsect.S的主要工作流程,Linux0.12雖然和如今的Linux6.x內(nèi)核相比顯得過于簡陋,但麻雀雖小五臟俱全,它是我們打開操作系統(tǒng)大門的鑰匙,后面讓我們看看setup.s獲得計算機的控制權(quán)后,會發(fā)生什么?

最近實在太忙了,后面隨緣更新,留言可催更(bushi)~~


參考資料:

《Linux內(nèi)核完全注釋5.0》
《操作系統(tǒng)真象還原》
https://elixir.bootlin.com/linux/0.12/source/boot/bootsect.S
https://files.embeddedts.com//old/saved-downloads-manuals/EBIOS-UM.PDF


本篇文章到這里就結(jié)束啦,如果我的文章對你有所幫助的話,還請點個免費的,你的支持會激勵我輸出更高質(zhì)量的文章,感謝!

http://www.risenshineclean.com/news/27868.html

相關(guān)文章:

  • 網(wǎng)站開發(fā)的就業(yè)寧波網(wǎng)絡(luò)推廣軟件
  • 云南做網(wǎng)站多少錢市場調(diào)研方案怎么寫
  • 營銷技巧第三季在線觀看鄭州厲害的seo優(yōu)化顧問
  • 寫網(wǎng)站編程需要什么百度快照替代
  • 會計可以做網(wǎng)站么真實的網(wǎng)站制作
  • 新鄉(xiāng)網(wǎng)站推廣公司微信運營
  • 中國建設(shè)銀行行網(wǎng)站谷歌優(yōu)化的最佳方案
  • 做漁具最大的外貿(mào)網(wǎng)站營銷方案案例范文
  • 做教育網(wǎng)站多少錢淘寶推廣引流方法有哪些
  • 網(wǎng)站開發(fā)技術(shù)教程百度搜索指數(shù)是怎么計算的
  • 企業(yè)網(wǎng)站制作機構(gòu)排名怎樣進行關(guān)鍵詞推廣
  • 微信公眾平臺客服谷歌seo培訓(xùn)
  • 做商城網(wǎng)站需要什么資質(zhì)海南網(wǎng)站制作
  • 做網(wǎng)站和做推廣有什么區(qū)別站內(nèi)推廣
  • 新鄉(xiāng)網(wǎng)站建設(shè)哪家好seo包年服務(wù)
  • 網(wǎng)站備案要求北京seo薪資
  • 西安是哪個省屬于哪個省專業(yè)網(wǎng)站推廣優(yōu)化
  • 做網(wǎng)站的屬于什么重慶seo排名優(yōu)化
  • 個人可以做電影網(wǎng)站嗎seo診斷工具有哪些
  • 網(wǎng)站建設(shè)設(shè)計 飛沐中小企業(yè)網(wǎng)站制作
  • 牡丹江百度seo排名優(yōu)化公司推薦
  • 網(wǎng)站數(shù)據(jù)庫怎么做同步今日重要新聞
  • 輕松做網(wǎng)站江蘇seo平臺
  • 企業(yè)做網(wǎng)站營銷的四大途徑東莞推廣公司
  • 八喜網(wǎng)站建設(shè)微平臺推廣
  • 南京網(wǎng)站制作搭建app推廣怎么做
  • 網(wǎng)架加工廠家德州網(wǎng)站建設(shè)優(yōu)化
  • wordpress做論壇網(wǎng)站app推廣方法
  • ninaszjs wordpress電腦系統(tǒng)優(yōu)化軟件排行榜
  • 網(wǎng)站開發(fā)個人總結(jié)市場調(diào)研與分析