- 嗨!我是Fatz
- 此部落格的目的是希望在自己不斷學習的路上留下一些紀錄
x86電腦的開機流程
本文主要描述裝載x86 CPU的電腦從通電到開機中間經歷了哪些事情,以及各部分的解釋 開機的步驟: 通電 CPU直接從ROM裡面執行BIOS BIOS程式掃描所有硬碟的第一個Sector,找尋boot signature 0x55AA BIOS將bootlader載入記憶體位置0x7C00,並跳過去執行bootloader Bootloader載入kernel Kernel載入其他作業系統需要用到的片段 Bootloader Bootloader是一個小程式,負責將作業系統的kernel載入記憶體並且執行,作業系統的開發者會自己實作bootloader,如Linux的grub,而Windows也有自己的bootloader Bootloader的另一個重要用途 x86的CPU在開機的時候會進入real mode,由於real mode有很多限制,例如只能存取1MB的記憶體空間,且只能跑16位元的程式等等,而protected mode則能存取4GB的記憶體空間,且可以跑32位元的程式,因此bootloader也負責將CPU切換成protected mode BIOS BIOS會將自己從ROM載入到RAM,之後就再RAM裡面執行,初始化一些必要的周邊硬體,例如提供基本的硬碟驅動,以供後續讀取硬碟中的bootloader BIOS包含了一些routines以提供bootloader在載入kernel時使用 BIOS是16位元的程式,也只能執行16位元的程式 BIOS routines通常是標準化的,才能支援各種bootloader 載入bootloader的流程 BIOS會從所有的儲存裝置的第一個sector中的第511與512個byte找尋有標記為開機記號0x55AA的裝置,若找到了有標記的sector,就會將此sector載入到記憶體0x7C00位址,並且跳過去執行
Javascript中的Stack
最近買了一堂JS進階課程,會想要找這樣的課程,原因在於我去看了Rxjs的文件還有網路上的教學文章,發現我不太能了解他的設計巧思,尤其是提到functional programming的部分讓我不知道為什麼需要用它,然後我看到了有介紹到functional programming的課程,也包含了很多JS原理解釋,因此決定買起來,並且將內容有趣的部分記錄下來,希望在更了解javascript語言背後的機制之後,能夠寫出更有效率且漂亮的程式。 什麼是 “Stack”? stack是一個LIFO(Last In First Out)的資料結構,就像是只有一個開口的容器,把東西一個一個放進去,等到要拿出來的時候,必須先從最後一個放進去的東西開始拿,也就是說,最先放進去的東西會最後一個被拿出來。stack最基本的操作有push與pop push: 將一筆資料放到stack最上層 pop: 將stack最上層的資料移除 Call stack 當javascript engine在翻譯並且執行js files時,遇到一個function call,會產生一個execution context,將他push進call stack,並且開始執行這個context裡面的程式,call stack最上層的execution context永遠有最高得執行順序。 如果裡面又遇到另一個function call呢?這時候又會產生新的空間並且push進call stack,同樣的開始執行最上層空間內的程式,如此一直重複下去,直到最上層的function call完成了,就會被pop掉。 Stack overflow 當stack的容量滿了,稱為stack overflow,發生這種情況會造成程式crash,可以在chrome的developer console中用個簡單的無限遞迴來模擬 // in chrome console function a() { a(); } a(); // uncaught RangeError: Maximum call stack size exceeded