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

歡迎訪問 生活随笔!

生活随笔

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

windows

操作系统的实现(0)

發布時間:2024/4/15 windows 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统的实现(0) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

一直想著要多了解一下操作系統但是由于各種原因一直拖, 來英國這段時間發生了很多事, 眨眼半年過去了, 博客也沒更新幾篇, 之前看現在也沒什么心思看了. 這幾天一直在看操作系統, 想想看操作系統這一塊一直都是自己比較好奇但又不是很了解的一塊, 想著這里概念也挺多的, 就準備搞出這一系列, 也算是做做筆記, 方便以后復習整理.

計算機的啟動過程

關于這個部分我個人也是參考了這個計算機是如何啟動的這篇文章, 然后結合一些書籍談一下個人理解吧. 這一塊首先是寫在ROM芯片里面的程序BIOS(Basic Input/Output System), 正常情況下按下電源鍵之后, BIOS程序啟動, 他的任務按照執行順序主要是下面幾個 :

  • POST (Power-On Self-Test) : 主要是檢查各種計算機硬件, 此時如果一切正常屏幕上打印CPU, 硬盤, 內存等各種硬件信息, 否則計算機蜂鳴并停止啟動.
  • 接下來BIOS會主動尋找下一階段的啟動程序, 該啟動程序可能存在于CD/DVD等存儲設備, BIOS會依次檢查, 具體設備檢查的先后可以在BIOS中進行設置. 判斷方式也比較簡單, 如果該設備的第一個扇區(512bytes)的最后兩個字節是0x55和0xAA, 表明這個設備可以用于啟動, 這也就是我們通常所說的引導扇區, 否則繼續檢查下一個設備.
  • 然后被找到的引導扇區將被加載到內存中的0000:7c00處(現在還是實模式).
  • 然后控制權限交給了被加載的引導扇區中的代碼, 這512字節也被稱之為MBR(master boot record). MBR也分三部分 :

  • 第1-446字節:調用操作系統的機器碼 .
  • 第447-510字節:分區表(Partition table) .
  • 第511-512字節:主引導記錄簽名(0x55和0xAA) .
  • 分區表什么的這里不提, 具體可以看上面提到的那篇文章. 這一部分暫時只需要提這么多就足夠了. 那么如果要編寫操作系統, 就必須從引導扇區開始寫, 這一塊當時是用匯編代碼, 市面上大多數將編寫操作系統的書籍都無一例外地使用的匯編器nasm, 它所支持的匯編格式是Intel格式的匯編, 和AT&T匯編(gcc那一套)有一定的區別, 具體可以看我之前寫過的文章程序機器級表示(0), 另外這里還需要掌握一些nasm的基本語法, 這個我主要是參考Intel匯編-NASM這篇文章, 講的還是比較詳細的.

    下面我從書中截取了一個引導扇區的源代碼, 可以感受一下 :

    org 07c00h ; 告訴編譯器程序加載到7c00處;@接下來的三行用來初始化段寄存器mov ax, csmov ds, axmov es, axcall DispStr ; 調用顯示字符串例程jmp $ ; 無限循環;@該函數主要用于負責打印, 當前階段看不懂可以忽略. DispStr:mov ax, BootMessagemov bp, ax ; ES:BP = 串地址mov cx, 16 ; CX = 串長度mov ax, 01301h ; AH = 13, AL = 01hmov bx, 000ch ; 頁號為0(BH = 0) 黑底紅字(BL = 0Ch,高亮)mov dl, 0int 10h ; 10h 號中斷ret BootMessage: db "Hello, OS world!";@這里我感覺應該是 510 - ($ - $$ + 1) 才對 times 510-($-$$) db 0 ; 填充剩下的空間,使生成的二進制代碼恰好為512字節 dw 0xaa55 ; 結束標志

    所有前面加過@的注釋都是我寫的.

    那么來講一下如何把這段代碼運行起來 :

    工具很簡單 :

  • nasm 匯編器, 主要用于把匯編語言編譯成elf格式的可執行文件.
  • linux指令dd, 主要用于將編譯完成的可執行文件轉移到虛擬軟盤中.
  • qemu 虛擬機, 主要用于模擬計算機的運行, 可以執行我們制作的軟盤鏡像.
  • 這里只需要即可, 需要注意的是第二行中制作出來的img格式的虛擬光盤之中并沒有文件系統, 所以不能直接被mount到linux上. 所以想使用mount掛載到linux上在進行復制是行不通的.

    nasm xxx.asm -o boot dd if=boot of=fred.img bs=512 count=1 qemu fred.img

    一些疑問

    從上述過程中了解到, MBR被加載到07C00位置是作為一種BIOS的默認行為, 既然這樣的話為什么我們需要顯示地聲明org 07c00h呢? 我嘗試著做了如下工作 :

  • 修改上述代碼, 只留下最后兩行, 也就是只是指定最后兩個字節為0xAA55, 這樣事實上仍然能夠被操作系統識別為引導扇區.
  • 修改上述代碼, 除掉/更改 第一行, 能夠別識別為引導扇區但是輸出異常.
  • 除去所有代碼, 無法識別.
  • 這里可以肯定的是, 決定是否是引導扇區完全了07C00無關, 只要扇區末尾是0Xaa55即可. 那么為什么不加org 07coo就不行呢? 最終看完這篇文章org 0x7c00解疑我才算理解, 就是說這一行的作用在于表明所有數據的偏移量, 因為正常的操作系統中, 由于虛擬內存的存在(而不是物理內存), 每個程序看到的其實內存地址都是0, 所以編譯器并不需要為代碼中每個地址添加偏移量. 而這里是BIOS強行將這段代碼添加到了物理內存的07C00, 這時候如果不添加第一行, 編譯器并不知道這一點, 所以會出現輸出異常, 為了驗證我的理解, 我將07C00改成了07C01, 輸出果然變成了ello, OS world! ".

    轉載于:https://www.cnblogs.com/nzhl/p/6108053.html

    總結

    以上是生活随笔為你收集整理的操作系统的实现(0)的全部內容,希望文章能夠幫你解決所遇到的問題。

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