操作系統啟動的過程

来源: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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...