日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

自己动手写操作系统 ----总计

發布時間:2023/12/10 windows 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自己动手写操作系统 ----总计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2021.1.23

開始寫操作系統

好奇心是動力的源泉,追究問題的本質是優秀黑客的必備素質,只有充分掌握了系統原理,才能在技術上游刃有余,才能有真正的創新和發展。中國需要更多真正的黑客,也希望更多的程序員能享受屬于黑客的創造樂趣。
創造·自由·開源

實踐–遇到問題–解決問題–再實踐


來自閑話Linux系統安全(一)——自主訪問控制(DAC),挺好的一段話
我們口中的操作系統,一般指的是:一個操作系統核心+各種擴展應用程序。但從專業的角度來講,操作系統就是那個核心(通常稱之為內核),就是將底層硬件進行抽象和虛擬化,并向使用者提供各種功能接口的軟件程序。這是一種非常特殊的軟件程序,它的特殊之處就在于:操作系統是使用者運行其他應用程序的底層軟件基礎,也是硬件功能被集中管理和調用的統一接口。它向上層隱藏了硬件結構的丑陋和不易操作,使得使用者在使用計算機時變得更加簡單;向下層屏蔽了底層硬件無法理解的使用者發出的復雜指令,將其翻譯成二進制序列,使得硬件可以更加快捷的予以執行。

Linux內核,從它誕生的那天開始,變表現出極強的生命力,源自于UNIX的很多的哲學思想被沿用在Linux中。一切皆文件!多么簡單但卻又復雜的一句話。說它簡單,是因為對于用戶來講,每一個系統的資源,包括各種硬件(磁盤、內存、網絡等)和軟件都是以一種可訪問甚至是可編輯可修改的文件的方式來展現,用戶不必再去思考底層的技術了;說它復雜,是因為這種抽象和虛擬是在大量的驅動程序和數以百計的接口函數的支撐下得以完成的。

在這樣的一套系統中,使用者可以用自己掌握的自然語言向計算機發號施令,而計算機也會非常忠誠地予以執行,無論成功與否。這種簡化給使用者帶來了極大的便利,但也同時會給計算機帶來很多的安全問題。比如說:誰能在什么時間對什么文件進行什么操作?結果如何,成功還是失敗?如果成功會有怎樣的影響?如果失敗,是否會予以記錄?……等等

2021.2.3

  • 操作系統是從加電自檢時,確定內核態的核心地位的
  • Nothing replaces your hardworking
  • diskpart命令創建vhd虛擬磁盤文件
  • .asm文件是匯編程序源文件,可以通過debug工具匯編成.obj文件,然后用link工具連接成.exe 文件
  • 基本輸入輸出系統BIOS是個人電腦啟動時加載的第一個軟件
  • 2021.2.17

  • windows的代碼有幾千萬行,而我們所學的是它的kernel(內核),如何控制和管理系統的資源
  • 數據+運算:改變寄存器的狀態,從而改變cpu的運算規則,內存是存儲數據的
  • 8086有8個16位通用寄存器:AX,BX,CX,DX,SI,DI,BP,SP
  • x類型的寄存器可以拆成兩個8位的寄存器來用AH,AL,BH,BL,CH,CL,DH,DL
  • 代碼段和數據段存儲在內存中,代碼段中存放運算的指令,數據段存放運算的數據,CS存儲代碼段的開始地址,用DS指向數據段的開始位置
  • 2021.2.26

  • cs寄存器指向所要運行的程序段開始的位置
  • ds寄存器指向所要運行的數據段開始的位置
  • 這樣可以讓程序順序執行,段+偏移可以靈活的加載多道程序(類似計算機網絡 網段號+主機號的索引思想)
  • POST(Power On Self Test),加電自檢,在操作系統運行之前 ,是固化在主板的BIOS在管理計算機,BIOS是被硬件強制加載的,加載的位置和內容是約定的
  • 將非易失性介質內的程序讀入內存
  • cpu指向要運行的程序
  • 人為賦予二進制數字意義,依靠軟硬件進行功能實現,代碼段和數據段都是邏輯上的,本質存儲的都是二進制代碼
  • bios中的可用區很小,程序運行采用 引導+內核
  • 顯存區的8位為KRGBIRGB分別表示前景色和背景色
  • BIOS在內存中是有布局的,必須在使用時進行保護,不能破壞
  • CS代碼段寄存器
    DS數據段寄存器
    SS棧段寄存器
    ES附加寄存器
    FS附加寄存器
    GS附加寄存器
  • IP寄存器不可改變,進行自加操作
  • 通用寄存器:AX BX CX DX SI BI BP SP
  • 慣用法:
    • cx用作循環次數的控制
    • bx用來存儲起始位置
    • si 寄存器作為復制指令的源地址
  • 尋址方式
  • 立即數尋址(立即數不能直接賦值給段寄存器)
    mov ax,0x18
    mov ds,ax
  • 內存尋址
    mov ax,[fs:0x1234]
  • 基址尋址:在操作數中,用bx寄存器作為地址的開始
  • 磁盤引導
  • 先選擇通道,往該通道上的sector count寄存器,寫入待操作的扇區數
  • 往該通道的3個LBA寄存器吸入扇區的起始地址
  • 往device寄存器寫入LBA的24-27位,設為LBA,設置dev,表明是從盤還是主盤
  • 往commad寄存器寫命令
  • 檢查status寄存器·
  • 讀入數據
  • 2021.3.1

  • nasm.exe命令不能單獨使用必須放在安裝目錄下進行使用
  • vhd寫入失敗bug
  • 寫入成功的樣子
  • p16視頻有錯誤,應該使用dd命令把mdr.bin寫入vhd文件,而不是loader文件
  • 視頻p16完成,撒花!!!
  • 計算機運行過程
    • 加電自檢
    • BIOS引導
    • 與BIOS交互
    • 進行硬盤讀取
  • 計算機保護模式:16位的寄存器被擴展成32位

  • 改變寄存器的狀態實際就是改變cpu的動作

  • 向下兼容,原來的段+偏移的尋址機制,inter使用GDT全局描述符表這種數據結構來描述,并使用一個叫做GDTR的寄存器去指向

  • 將一個對數據的訪問分為三個部分,然后由cpu將其拼起來,這個過程叫保護模式下的尋址

  • 實模式

    • CPU復位(reset)或加電(power on)的時候以實模式啟動,處理器以實模式工作。
    • 在實模式下,內存尋址方式,由16位段寄存器的內容乘以16(10H)當做段基地址,加上16位偏移地址形成20位的物理地址,最大尋址空間1MB,最大分段64KB。
    • 在實模式下,所有的段都是可以讀、寫和可執行的。
  • 16位實模式下,物理地址和邏輯地址相同
  • 32位保護模式,特指cpu可以使用32位的保護模式下的尋址方式,讓每一個應用程序都邏輯上(感覺上)擁有獨立的4G空間。1.使用硬件MMU映射到物理地址進行地址轉換2.編址的概念
  • 將16位實模式下的段基址加偏移的直接訪問物理內存的方式,改為通過硬件進行保護,只有段選擇子和段描述符結合才能真正的訪問內存,隔離內存的級別和cpu的工作狀態,并且使用數據結構GDT(全局描述符)進行管理,硬件上使用GDTR(全局描述符寄存器進行管理)
  • 保護模式是80386的一個革命性的尋址變化
  • 2021.4.6

  • 實模式下可以任意訪問內存,訪問的邏輯地址就是物理地址,做不到應用程序和系統程序的內存隔離
  • 段的問題:16位實模式下物理地址=邏輯地址
  • 邏輯地址向線性地址轉換的平坦模型
    在保護模式下,32位環境下用一個段就對0到4G內存的線性訪問,能直接訪問內存空間,不用再進行段基址的來回切換。溝壑成坦途,在程序分段的基礎上由操作系統統籌管理,解放生產力。
  • 保護模式下要對平坦模型的尋址進行限定,在定義程序的段和段界限中要附加段的特權和類型,防止出現對內存的誤操作
  • 操作系統程序必須常駐在物理內存中,但是實模式可能出現對內存操作系統程序的破壞,所以保護模式進行了機制的修改。cs和ds所謂的16位實模式下的段寄存器不再是段基址的概念,而變成了段選擇子但是不能直接訪問物理地址只有和段描述符組合才能真正訪問物理地址,這是硬件提供的保護機制,并且使用一個GDT(全局描述符表,使用GDTR全局描述寄存器控制 )的數據結構進行管理
  • 操作系統可以控制和管理系統中的所有軟硬件資源,但是應用程序只能訪問自己的數據和代碼段
  • PUSH指令,每次壓棧一個字(16位),堆棧指針sp減2(指針上移2個單元)
  • 若OS是一個多用戶和多任務的操作系統,在實模式下不設防的內存訪問有可能造成程序崩潰,保護模式下每個段必須進行注冊,并具有段的描述字,記錄在全局描述符表Global Descriptor Table,為整個軟硬件服務,并且必須在進入保護模式前進行定義,所以保護模式下可以使用GDT約束應用程序訪問內存的權限

  • DPL表示CPU工作在特權級還是用戶級(0-3)
    S字節中0表示系統段,1表示代碼段或數據段
    G字節中0表示以字節為單位,1表示以4kb為單位
    L是一個64位的代碼段標志
    TYPE表示描述符的子類型:4位組合表示代碼段或數據段的可讀、可寫或可執行

  • 進行內存訪問前,必須先在GDT中進行描述符定義,并且它是由OS根據程序結構在加載時自己建立的,并且用戶程序無法建立和修改GDT
  • 2021.4.7

  • xor進行異或清零
  • EQU偽操作是將將后面的表達式賦值給前面的標號,EQU的引入提高了程序的可讀性,也使其容易修改。
  • 每個進程可能有相同的邏輯地址,但是會被映射到不同的物理地址上
  • org address 告訴匯編器,把所有對內存的地址引用全都加上address ,提前規劃運行的內存起始地址
  • 實模式切換到保護模式
    初始化GDT
    通過lgdt進行加載
    關閉A20地址線
    打開CR0寄存器
    進入保護模式
  • 2021.4.8

  • GDT必須按手冊的規定位進行賦值,這樣才能讓硬件識別,從而運行

  • 保護模式下的段寄存器 由 16位的選擇器 與 64位的段描述符寄存器 構成

  • 在整個系統中,全局描述符表GDT只有一張(一個處理器對應一個GDT),GDT可以被放在內存的任何位置,但CPU必須知道GDT的入口,設計者使用GDTR存放GDT的入口地址

  • 局部描述符表LDT(Local Descriptor Table)局部描述符表可以有若干張,每個任務可以有一張。

  • LDT和GDT從本質上說是相同的,只是LDT嵌套在GDT之中

  • .SECTION用于定義內存的段

  • ALIGN將下一個變量對齊到規定的邊界

  • BITS指令指定NASM產生的代碼是被設計運行在16位模式的處理器上還是運行在32位模式的處理器上

  • LLDT 加載局部描述符

  • DPL表示段的特權級,當前代碼段區檢查對應的真實地址時,DPL會檢查程序間的允許級別是否一致,DPL較小的段有更高的訪問權限,如果低權限去訪問高權限則會崩潰

  • 當內核代碼段寫入內存后,后續的用戶程序代碼段的DPL肯定比內核代碼段的大,從而防止內核被覆蓋導致系統崩潰,實現內存隔離

  • TSS Task Stack Segment(任務狀態段)要維護棧的結構,有三個(從ring0到ring4)權限狀態轉化堆棧,是cpu硬件原生的系統級別的數據結構

  • TSS、LDT和GDT是受到硬件支持的系統級數據結構

  • 程序員寫的只是用戶態下面的半成品的程序,加載運行由操作系統的內核提供

  • TSS使用TR寄存器進行維護,這種硬件級別的數據結構,由軟件進行填寫,最后使用硬件實現

  • CPL:Current Privilege Level
    DPL:Descriptor Privilege Level
    RPL:Request Privilege Level

  • 應用程序的可信級別低,操作系統的可信級別高,當較低權限的任務需要使用高權限才能進行處理時,則需要操作系統提升該任務的權限

  • 用戶程序調用內核功能:
    1.設計兩個相互跳轉的段
    2.將這兩個段注冊到GDT中
    3.設計一個門描述符
    4.把門描述符寫到GDT中(門描述符反映了兩個段的跳轉關系)

  • 操作系統主要做的就是三件事:造表,填表,查表

  • IDTR中斷描述符表寄存器

  • win系統有任務門、陷阱門、調用門、中斷門

  • 2021.4.9

  • 設備對于CPU是透明的,CPU只去管理中斷芯片8259A
  • 中斷存儲通常需要在最后加一個時延,保證數據的傳輸完成
  • $ 表示當前行被匯編后的地址
    $$ 表示一個節的開始處被匯編后的地址
  • 操作系統中使用GDT、LDT和IDT進行內存的規劃,然后進行造表、填表和查表進行操作
  • 使用C的語法結構進行內核的編寫,并且也沒有C庫可以使用,但是相比于匯編仍然可以提高開發效率
  • 2021.4.12

  • 搭建ubuntu系統

  • MBR只有512個字節,不夠運行操作系統,那么將MBR的引導權交予loader,讓loader可以讀取硬盤中的多個扇區,突破512字節的內存限制,從而將操作系統內核加載到內存中

  • Loader的作用:加載內核,打開保護模式,為系統啟動準備好軟硬件環境

  • 用c進行內核的編寫,不是使用c庫,而是使用c的語法結構

  • 不使用c庫打印helloworld,表明c庫在操作系統之上

  • 內核加載過程

  • 內核中前512個字節是MBR,是硬件自動加載的

  • 2021.4.15

  • 在C語言和匯編語言下的聯合編程
  • 操作系統的內核實踐就是一個死循環,不停的接收外圍請求
  • ld命令是二進制工具集GNU Binutils的一員,是GNU鏈接器,用于將目標文件與庫鏈接為可執行程序或庫文件
  • 2021.4.16

  • Boot進行家加電自檢,mbr接管BIOS,然后loader進行kernel加載的準備
  • asm程序是基于BIOS的中斷調用,進行BIOS的IO控制,并封裝后向c程序提供函數
  • PUSHA通常用于中斷的保存現場(寄存器的狀態)
  • 2021.4.17

  • dd命令中起始地址seek=blocks:從輸出文件開頭跳過blocks個塊后再開始復制
  • dd命令中占用塊數count=blocks:僅拷貝blocks個塊,塊大小等于ibs指定的字節數
  • dd命令中bs=bytes:同時設置讀入/輸出的塊大小為bytes個字節
  • 視頻28運行不出來,這個bug我一度懷疑是bochs版本的問題,最后找到了2.6.1(與視頻一樣的版本),發現實質是磁盤寫入命令的錯誤,視頻可能刪去debug的片段,以打印出OKMBR的那個虛機vhd為基礎,再使用以下兩個命令寫入
    dd if=mbr.bin of=dingst.vhd bs=512 count=1d
    dd if=Loader.bin of=dingst.vhd bs=512 count=1 seek=2(視頻中的count=2不行,括號內的不寫入命令行)
    dd if=kernel.bin of=dingst.vhd bs=512 count=1 seek=9
  • 完成從MBR到Loader再加載kernel的基本過程
  • 每次vhd磁盤都要從MBR到Loader和kernel進行寫入
  • 2021.4.19

  • INT 16H是鍵盤I/O中斷有0,1,2三個功能號,并存儲在AH中
  • 0號功能調用
    格式:

    • MOV AH, 0
    • INT 16H

    功能:執行時,一旦捕獲鍵盤輸入,字符的ASCII碼放入AL中。若AL=0,則AH為輸入的擴展碼。


    1號功能調用
    格式:

    • MOV AH, 01H
    • INT 16H

    功能:用來查詢鍵盤緩沖區并設置ZF標志。ZF=1表示無鍵按下;ZF=0表示有鍵按下,且AX=鍵值代碼(同AH=0功能)


    2號功能調用
    格式:

    • MOV AH, 02H
    • INT 16H

    功能:檢查鍵盤上各特殊功能鍵的狀態。AL從高位到低位依次為Ins、Caps Lock、Num Lock、Scroll Lock、Alt、Ctrl、左Shift、右Shift各鍵的按下標志位,按下時,相應位為1。

    2021.4.20

  • 操作系統內建的程序,是寫在操作系統內核里面的程序
  • 閱讀《操作系統 真象還原》
  • 2021.4.21

  • 沒寫滿的扇區會用0進行填充
  • 跳入保護模式,并將保護模式的二進制代碼直接加載到0x9000處并執行
  • 之前一直無法將kernel的內容打出,原來是Loader的跳轉扇區沒改,所以一直打印的是OKMBR
  • 成功打印一個操作系統內核,之前是因為Loader的跳轉扇區和頁面錯誤
  • 結語
  • OS is a complex system; putting a programming layer ontop of the APl doesn’t eliminate the complexity——it merelyhides it. Sooner or later that complexity is going to jumpout and bite you in the leg. So ….….

  • 后續測試中出現兩個bug,1. help后兩個enter出現cpu段溢出 2. drawpic進入后無法正常退出
  • 2021.4.24

  • 兩種虛擬機: Virtual box,Bochs.
  • Bochs可以用來方便的調試操作系統,你可以用它看看一臺計算機從加電開始,都執行了哪些指令,各種寄存器的值怎么改變的,例如你懷疑自己的內核有問題,那么可以在內核的入口處設置一個斷點,虛擬的計算機啟動后,到內核的入口用就停住,你可以看看各個值是否正確。
  • 兩種編譯工具: nasm,gcc nasm是開源的匯編語言編譯器, windows和linux下都有相應的版本,gcc就不用說了,linux下經典的編譯工具,對這兩種編譯工具,整個過程也只使用了它們最基本的功能。
  • 若干個小工具: dosbox、notepad、vim等等
  • 2021.5.5

  • CS存放的是代碼段的段基址,復位后代碼段的起始地址是FFFFH
  • BIOS(基本輸入輸出系統),BIOS是直接與硬件打交道的底層代碼,它為操作系統提供了控制硬件設備的基本功能
  • 0~FFFFFH的低端1MB內存非常特殊,因為最初的8086處理器能夠訪問的內存最大只有1MB,這1MB的低端640KB被稱為基本內存,而A0000H~BFFFFH要保留給顯示卡的顯存使用···
  • 計算機啟動過程
  • 加電自檢POST(Power-on self test),主要負責檢測系統外圍關鍵設備(如:CPU、內存、顯卡、I/O、鍵盤鼠標等)是否正常。例如,最常見的是內存松動的情況,BIOS自檢階段會報錯,系統就無法啟動起來;
  • 加電自檢成功后,BIOS會讀取硬盤驅動器的第一個扇區(MBR,512字節)到內存中,然后執行里面的代碼(此時計算機系統的控制權轉交給MBR)
  • MBR會初始化段寄存器,然后加載硬盤第二個扇區的內核加載程序Loader到內存中,之后跳轉到該扇區的內核加載程序Loader進行執行
  • 將指定扇區的操作系統內核程序Loader從硬盤加載到內存中,并跳轉到內核代碼區域,將計算機的控制權交給操作系統內核
    5.操作系統內核程序監視I/O設備緩沖區的輸入,通過鍵入相關的指令可以進行相關程序的運行
    • 按下電源開關時,計算機主板和其他設備供電,BIOS的控制芯片組會向CPU發出并保持一個RESET(重置)信號,重置CPU內部狀態,直到芯片組檢測到電源已經開始穩定供電后,便撤去RESET信號

    • CPU馬上就從地址FFFF0H處(BIOS在16位實模式下執行,最大尋址范圍是1MB)開始執行指令,這個地址存放一條跳轉指令,跳到系統BIOS中真正的啟動代碼處

    • CPU讀取ROM的BIOS代碼,運行bootblock, 由于ROM的執行速度遠比RAM要低,所以將BIOS代碼 shadow覆蓋到memory內存中去,這樣可以減縮POST加電自檢的時間

    • boot block 是CPU在BIOS上固化的最小指令集代碼,用戶無法對其修改和刪除。這段代碼在CPU復位后首先被運行,其功能主要是判斷運行哪個存儲器上的程序、檢查用戶代碼是否有效、判斷芯片是否被加密、芯片的在應用以及在系統編程功能

    • Boot,意思為“引導”,是計算機系統加電復位后CPU的第一個機器動作

    • Load,意思為“加載”,是從低速非易失性存儲器ROM中“搬運”一些數據到高速易失性存儲器RAM中

    • Shadow RAM也稱為"影子內存",是為了提高計算機系統效率而采用的一種專門技術,所使用的物理芯片仍然是CMOS DRAM(動態隨機存取存儲器,參閱本書后面的內容)芯片。Shadow RAM占據了系統主存的一部分地址空間。其編址范圍為C0000~FFFFF,即為1MB主存中的768KB~1024KB區域。這個區域通常也稱為內存保留區,用戶程序不能直接訪問。Shadow RAM的功能就是是用來存放各種ROM BIOS的內容。也就是復制的ROM BIOS內容,因而又它稱為ROM Shadow,這與Shadow RAM的意思一樣,指得是ROM BIOS的"影子"。現在的計算機系統,只要一加電開機,BIOS信息就會被裝載到Shadow RAM中的指定區域里。由于Shadow RAM的物理編址與對應的ROM相同,所以當需要訪問BIOS時,只需訪問Shadow RAM而不必再訪問ROM,這就能大大加快計算機系統的運算時間。通常訪問ROM的時間在200ns左右,訪問DRAM的時間小于100ns、60ns,甚至更短。

    2021.5.7

  • LBA(Logical Block Addressing)邏輯塊尋址模式,指計算機在與硬盤通信的一種模式,可以將管理的硬盤空間 從512kb擴充到8.4GB
  • 多任務的保護模式的實現
  • 2022.1.20

  • 完成《操作系統 真相還原》的MBR制作
  • 參考資料

    [1] 自己動手寫操作系統
    [2]《ORANGE’S:一個操作系統的實現》
    [3] 平坦模型和分段模型
    [4] Linux dd 命令
    [5] Bios 是怎樣被載入內存的?
    [6] 《操作系統 真相還原》
    [5] 計算機啟動過程

    總結

    以上是生活随笔為你收集整理的自己动手写操作系统 ----总计的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。