操作系統啟動的過程

来源:https://www.cnblogs.com/Elysiaiii/p/18272106
-Advertisement-
Play Games

目錄操作系統,啟動!大致過程重要程式bootsect.ssetup.shead.s 操作系統,啟動! 大致過程 ​ 電腦的工作方式是取指執行,而執行其的前提是記憶體中有代碼。操作系統剛開始並不是在記憶體中,而是在磁碟上,因此第一步需要將其以一定的方式從磁碟讀入記憶體。 (1)x86PC剛開機時CPU處於 ...


目錄

操作系統,啟動!

大致過程

​ 電腦的工作方式是取指執行,而執行其的前提是記憶體中有代碼。操作系統剛開始並不是在記憶體中,而是在磁碟上,因此第一步需要將其以一定的方式從磁碟讀入記憶體。

(1)x86PC剛開機時CPU處於實模式(和保護模式對應),定址方式為CS左移四位+IP

(2)開機時,CS = 0xFFFF;IP = 0X0000

(3)定址0xFFFF0(ROM BIOS映射區)

開機時記憶體中唯一有代碼的地方

(4)檢查RAM,鍵盤,顯示器,軟硬磁碟

(5)將磁碟0磁軌0扇區(引導扇區,操作系統的第一段代碼bootsect.s)讀入0x7c00處

一個扇區512位元組

.s 彙編代碼

(6)設置cs = 0x7c0,ip = 0x0000

以下摘自《Linux內核完全註釋》

​ 這裡先總的說明一下 Linux 操作系統啟動部分的主要執行流程。當 PC 的電源打開後,80x86 結構的 CPU 將自動進入實模式,並從地址 0xFFFF0 開始自動執行程式代碼,這個地址通常是 ROM-BIOS 中的 地址。PC 機的 BIOS 將執行某些系統的檢測,併在物理地址 0 處開始初始化中斷向量。此後,它將可啟 動設備的第一個扇區(磁碟引導扇區,512 位元組)讀入記憶體絕對地址 0x7C00 處,並跳轉到這個地方。啟 動設備通常是軟碟機或是硬碟。這裡的敘述是非常簡單的,但這已經足夠理解內核初始化的工作過程了。
​ Linux 的最最前面部分是用 8086 彙編語言編寫的(boot/bootsect.s),它將由 BIOS 讀入到記憶體絕對地 址 0x7C00(31KB)處,當它被執行時就會把自己移到絕對地址 0x90000(576KB)處,並把啟動設備中後 2kB 位元組代碼(boot/setup.s)讀入到記憶體 0x90200 處,而內核的其它部分(system 模塊)則被讀入到從地址 0x10000 開始處,因為當時 system 模塊的長度不會超過 0x80000 位元組大小(即 512KB),所以它不會覆 蓋在 0x90000 處開始的 bootsect 和 setup 模塊。後面 setup 程式將會把 system 模塊移動到記憶體起始處,這 樣 system 模塊中代碼的地址也即等於實際的物理地址,便於對內核代碼和數據的操作。圖 3-1 清晰地顯 示出 Linux 系統啟動時這幾個程式或模塊在記憶體中的動態位置。其中,每一豎條框代表某一時刻記憶體中各程式的映像位置圖。在系統載入期間將顯示信息"Loading..."。然後控制權將傳遞給 boot/setup.s 中的代 碼,這是另一個實模式彙編語言程式。

重要程式

bootsect.s

.globl begtext,begdata,begbss,endtext,enddata,endbss
.text	//文本段
begtext:
.data	//數據段
begdata:
.bss	//未初始化數據段
begbss:
entry start	//關鍵字entry告知鏈接器,程式從start標號開始執行
start:
	mov ax, #BOOTSEG	//將ds段寄存器置為0x07c0
	mov ds, ax
	mov ax, #INITSEG	//將es段寄存器置為0x9000
	mov es, ax
	mov cx, #256		//移動計數值=256字
	sub si, si			//源地址	ds:di = 0x07c0:0x0000
	sub di, di			//目標地址	es:si = 0x9000:0x0000
	rep
	movw
	jmpi go, INITSEG	//間接跳轉,cs=0x9000,ip=go
	
go:	mov ax, cs			//cs=0x9000
	mov ds, ax
	mov es, ax
	mov ss, ax
	mov sp, #0xFF00		//由於代碼移動過了,所以要重新設置堆棧段的位置。sp只要指向遠大於512偏移(即地址0x90200)處都可以。因為從0x90200地址開始處還要放置setup程式,而此時setup程式大約為4個扇區,因此sp要指向大於(0x200+0x200*4+堆棧大小)處
	
load_setup:
	mov dx, #0x0000
	mov cx, #0x0002
	mov bx, #0x0200
	mov ax, #0x0200+SETUPLEN
	int 0x13			//利用BIOS中斷INT 0x13將setup模塊從磁碟第二個扇區開始讀到0X90200處,共讀4個扇區。如果讀出錯,則複位驅動器,並重試
	jnc ok_load_setup
	mov dx, #0x0000
	mov ax, #0x0000	//複位
	int 0x13
	j load_setup	//重讀
	
ok_load_setup:
	mov dl, #0x00
	mov ax, #0x0800
	int 0x13
	mov ch, #0x00
	seg cs
	mov sectors, cx
	mov ah, #0x03		//顯示一些信息('Loading system...'共24個字元)
	xor bh, bh		//讀游標位置
	int 0x10
	mov cx, #24		//共24個字元
	mov bx, #0x0007	//顯示屬性
	mov bp, #msg1	//指向要顯示的字元串
	mov ax, #0x1301
	int 0x10		//顯示字元
	mov ax, #STSSEG		//0x1000
	mov es, ax
	call read_it		//讀入system模塊
	jmpi 0, SETUPSEG	//跳轉到0x9020:0000(setup.s程式的開始處)

setup.s

head.s


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ​ 在之前的文章:《QEMU/KVM啟動物理分區的Windows並調優》中筆者使用mdadm創建線性陣列,使VM啟動物理硬碟分區上的Windows系統。這個做法思路清晰且具有實操性,但根據這個issue,Linux內核上游已將CONFIG_MD_LINEAR編譯參數棄置了,這意味著在6.8及以後的內 ...
  • sed命令是用於對文本文件做內容操作的神器,常見的增刪改都可以,熟練運用可提高shell腳本編寫能力和在terminal下的工作效率。 ...
  • 簡要:Win安裝WSL(Windows Subsystem for Linux)主要是在win系統可以運行linux系統,下麵詳解介紹如何安裝WSL和Ubuntu以及Ubuntu一些簡單配置 一、安裝WSL 可以參考官網內容->WSL相關介紹 1、使用圖像界面 打開控制面板(win+r輸入contr ...
  • 基於ESP8266網路天氣時鐘的OLED顯示 註意修改 WiFi 名稱和密碼 需要申請【心知天氣】API私鑰 心知天氣URL:https://www.seniverse.com /* 參考: https://blog.csdn.net/weixin_44668788/article/details/ ...
  • 寄存器,本質上就是單片機內部的RAM存儲器,用來暫時存放參與運算的數據和運算結果。一個寄存器由若幹個鎖存器或者觸發器組成。比如STM32的一個寄存器有32位,則由32個觸發器組成。 STM32的寄存器包括通用寄存器、控制寄存器以及外設寄存器,每種寄存器都有其特定的功能和用途。而且在技術手冊占了非常多 ...
  • 今天我在安裝qview並運行時時,遇到了這個問題。 我在網上查找了許多解決方案,但它們大多都說是某些dll缺失或錯誤引起的。 這些說法應該是正確的,但我用了dll修複工具後,一點用都沒有。 後來搗鼓半天後,我發現很可能是visual c++出了問題。後來的事實證明,確實是這樣。 我在微軟官網下載了最 ...
  • 目錄TTL、RS232、RS485三種協議介紹TTL(Transistor-Transistor Logic)串口通信協議工作原理:TTL電平標準:特點:優勢:缺點:TTL協議混淆點澄清:擴展學習:COMS技術CMOS技術的工作方式:主要特點:CMOS技術的局限性:RS232協議工作原理:特點:優勢 ...
  • 設備採用晶元:STM32F407ZET6 4個LED燈,網路標號分別為LED0 ,LED1,FSMC D10,FSMC D11。對應的引腳號分別為PF9,PF10,PE12,PE13。 GPIO外設基本概念 General-Purpose Input Output,通用型輸入輸出的,也簡稱I/O口, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...