相信這兩者差別,只要是做系統的人應該都會很了解。但對於我而言,卻相當模糊。記得有次在跟老外同學閒聊的時候,他問我這兩者的差別是在哪 ? 在當下我突然發現,要講給人懂是一件很困難的事,尤其是在對某個東西半理解狀態,更難解釋。所以這篇文章就來淺淺的探討有關這兩者間的區別。
在現今每個人幾乎都有智慧型手機,而且可以同時執行超多程式,像是你在玩遊戲的同時,能夠接收到朋友的訊息、郵件或其它通知訊息。就跟在用桌機或筆電一樣,可以同時開啟好幾個應用程式。簡單來說,Process 就是 Program,就是一個應用程式,像是在手機上的 App,電腦上的 MicroSoft Word;而 Thread 就是這個 Process 裡面的一個單位執行緒 ( Unit of execution) ,如果打開了 MicroSoft Word (Process),裡面的就有很多個Threads 在跑,像是 keyboard, print, save ...etc,就這是所謂的 Multiple-thread application。
Background
在談到Process和thread,或是說運行一個App,有三個非常重要的東西來負責管理:CPU, Memory (RAM), Memory controller。Memory controller 是一個介於CPU和RAM的界面,負責傳輸Data到CPU。當我們寫好一個程式,然後compile成binary code,這些binary code就會存放在RAM,接著透過 controller 把 data 傳到CPU。CPU內部有一個 queue line,也就是pipe line,依照FILO的原則放進這line當中來等待執行。
Multiple-thread application
那到底是如何實現multiple thread和multiple process ? 以Linux為例子,每一個process都會有PID, memory space, priority 和 schedule,依據priority和schedule來切換所有processes,這切換時間就叫 time slot,通常是在 1ms。
而一個process又有多個threads,這些threads 一般都是來靠 "鎖" (Lock) 來管理。如果這鎖沒管理好,很容易造成這個process當掉,更嚴重則是系統崩潰。像是我們常聽到 "死鎖" (Dead Lock) 就是因為 Thread 1 等待 Thread 2,而 Thread 2 又等待 Thread 1 釋放鎖而造成死循環。所以如何設計好這些threads 對於一個program or process 是非常重要的。
Showing posts with label Operation system. Show all posts
Showing posts with label Operation system. Show all posts
2/07/2017
1/24/2011
Compile Bochs with 10.4
之前在VitrualBox上安裝了ubuntu 9.10, compile和run都沒什麼太大問題.
但今天想在10.4重新安裝, 依照前一次的筆記照做, 發現在compile docbook時發生error :
Working on: /home/dicky/1Work/c-square/bochs-2.4.5/doc/docbook/./user/user.dbk
openjade:/home/dicky/1Work/c-square/bochs-2.4.5/doc/docbook/./user/user.dbk:3863:72:E: character "_" is not allowed in the value of attribute "LINKEND"
openjade:/home/dicky/1Work/c-square/bochs-2.4.5/doc/docbook/./user/user.dbk:3921:25:E: character "_" is not allowed in the value of attribute "ID"
openjade:/home/dicky/1Work/c-square/bochs-2.4.5/doc/docbook/./user/user.dbk:3960:25:E: character "_" is not allowed in the value of attribute "ID"
openjade:/home/dicky/1Work/c-square/bochs-2.4.5/doc/docbook/./user/user.dbk:3968:66:E: character "_" is not allowed in the value of attribute "LINKEND"
make[1]: *** [user/index.html] Error 8
滿明顯是"_"這個底線造成了錯誤, 可能是哪裡的文件沒定義該符號的使用
去官方網站查了一下, 才知道原來這是己知Bug, 但他們並不絕得是很大的問題所以並沒有在2.4.5 加入Fix.....(可能是覺得這是SGML的錯誤...跟他們沒關係= =)
Tracker:Bugs
上面有提供關於SGML的error & waring排除錯誤的網址, 其中有兩行解釋的很明白 :
value of attribute "LINKEND" must be a single token:
value of attribute "ID" must be a single token:
依照上面的解釋...把底線改成"-" or "~"就可以了 :)
但今天想在10.4重新安裝, 依照前一次的筆記照做, 發現在compile docbook時發生error :
Working on: /home/dicky/1Work/c-square/bochs-2.4.5/doc/docbook/./user/user.dbk
openjade:/home/dicky/1Work/c-square/bochs-2.4.5/doc/docbook/./user/user.dbk:3863:72:E: character "_" is not allowed in the value of attribute "LINKEND"
openjade:/home/dicky/1Work/c-square/bochs-2.4.5/doc/docbook/./user/user.dbk:3921:25:E: character "_" is not allowed in the value of attribute "ID"
openjade:/home/dicky/1Work/c-square/bochs-2.4.5/doc/docbook/./user/user.dbk:3960:25:E: character "_" is not allowed in the value of attribute "ID"
openjade:/home/dicky/1Work/c-square/bochs-2.4.5/doc/docbook/./user/user.dbk:3968:66:E: character "_" is not allowed in the value of attribute "LINKEND"
make[1]: *** [user/index.html] Error 8
滿明顯是"_"這個底線造成了錯誤, 可能是哪裡的文件沒定義該符號的使用
去官方網站查了一下, 才知道原來這是己知Bug, 但他們並不絕得是很大的問題所以並沒有在2.4.5 加入Fix.....(可能是覺得這是SGML的錯誤...跟他們沒關係= =)
Tracker:Bugs
上面有提供關於SGML的error & waring排除錯誤的網址, 其中有兩行解釋的很明白 :
the label you used for a section contains spaces. Change spaces to, say, underscores or dashes.
you used a cross-reference to a label that contains spaces. Do not change the cross-reference. Change the label: change spaces to, say, underscores or dashes.
依照上面的解釋...把底線改成"-" or "~"就可以了 :)
1/02/2011
Boot Sector
分析之前書上寫的Boot sector(引導扇區) , 加上一些不懂的 , 經過查找和看書...把一些理解原理記下來,有路過的PRO user..如有錯誤,請一定要指正小弟 ! 感激不盡 :D
先來看整個x86的開機啟動過程,這裡有分1st Bootload和2nd Bootload,大體可以這樣表示 :
1.電源開啟
2.CPU進行Reset工作
3.從BIOS的ROM中第FFF:0000位址開始執行General Bootloader
4.進行POST(開機自檢,Powe On Self Test)動作
5.讀取CMOS設定資料
6.讀取所選的磁碟機的CHS 0:0:1的磁區
7.從記憶體第0x7C00的位址開始執行2nd Bootload
註:CHS -- 指定磁區位置的方式,Cylinder: Head: Sector,0:0:1就代表第0個Cylinder(面)、第0個Head(磁軌)、第1個Sector(扇區)
其中3~7的動作就是1st Bootload,它是放在BIOS裡面的,我們沒辦法去對它做修改,因為這些是原廠出廠時就己經寫死了.
所以我們能自行撰寫2nd Bootload以及讓2nd Bootload跳轉至作業系統,但是有幾個規定要特別記住 :
1.這時只有單純CPU工作,作業系統完全沒被載入,所以我們僅能使用CPU指令,硬體I/O,BIOS中斷能使用而己,也就是說....想用C來寫2nd Bootload是不可能的 XD (除非有另外的函式庫....)
2.一個Sector的大小就是512Kbyte,據說是硬體規格(沒查證.....),也就是說....要寫出2nd Bootload,一定要把512Kbyte填滿 !
簡單來說,一旦BIOS發現了在0:0:1的開機磁區,就會把Sector(512Kbyte)的內容裝載到記憶體位址的0000:07C00處,然後再跳轉到0x7C00處將控制權全都交給這段(sector)開機程式碼,從這裡開始,電腦就不再由BIOS中固有的程式來控制,而變成作業系統的一部份來控制.
註:ROM BIOS的INT 19H(引導加載程序,相當於熱啟動系統) 固定裝入記憶體的0000:7C00H
所以,在2nd Bootload的程式碼開頭,一定要告訴CPU說,接下來的這些程式碼,是從0x7C00的地址開始的.
瞭解整個系統開機運作後,就可以來分析書上所提供的2nd Bootload程式碼 :
1 org 07c00h
2 mov ax, cs
3 mov ds, ax
4 mov es, ax
5 call DispStr
6 jmp $
7 DispStr:
8 mov ax, BootMessage
9 mov bp, ax
10 mov cx, 16
11 mov ax, 01301h
12 mov bx, 000ch
13 mov dl, 0
14 int 10h
15 ret
16 BootMessage: db "Hello, OS world!"
17 times 510-($-$$) db 0
18 dw 0xaa55
雖然書上的程式碼都有註解,但我還是一一分析...畢竟我組語完全不熟....T_T
註: 8086CPU一共有14個暫存器,先介紹等下會用到的暫存器
通用暫存器:AX、BX、CX、DX
(可獨立8位元使用 , AH和AL , 最大值僅能0~255)
段暫存器 : CS、SS、DS、ES、PSW
可間接定址暫存器:BP
1行 : 調整偏移量偽指令ORG,指定下面的指令從7c00h處開始,因為BIOS一旦發現引導扇區,就會將這512字節裝載到記憶體的0000:7c00處
2行:將CS(Code Seg,程式暫存器)內容放到AX(通用暫存器)
3~4行:同樣將DS,ES暫存器指向AX,這樣一來,CS,DS,ES將指向相同的segment
5行: call function "DispStr"
6行:call function完之後,將跳到相同的地址,也就是它會無窮迴圈. $代表當前所在的位址
8行:將BootMessage內容放進AX
9行:AX內容放進BP,亦即BP同樣指向BootMessage
10行:長度為16的字符串放進CX
11行:AH=13h,int 10h啟用視頻中斷13H號功能 , AL=01代表寫完字符串之後,更新光標位置
12行:BH=0H,頁號(視頻緩衝區是分頁的...恩...這我也不懂XD) , BL=0CH代表字符顯示屬性
13行:DH和DL寫字符串的光標位置,DH=行號,DL=列號 (不知道為啥DX就是寫字符串的暫存器...是定義就這樣子嗎?? 哎...要查查= =)
14行:啟用10h號中斷
15行:跟return一樣的道理...
16行:把BootMessage定義為Hello的字串,就如同#define一樣XD
17行:$是當前地址,$$是首地址,也就是說,從這樣開始一直到510處,全用0填充
18行:這滿重要的,其中的511和512地址是專門用來判斷是否為一個Boot Sector,0xAA55就是Boot Sector一個結束標誌
先來看整個x86的開機啟動過程,這裡有分1st Bootload和2nd Bootload,大體可以這樣表示 :
1.電源開啟
2.CPU進行Reset工作
3.從BIOS的ROM中第FFF:0000位址開始執行General Bootloader
4.進行POST(開機自檢,Powe On Self Test)動作
5.讀取CMOS設定資料
6.讀取所選的磁碟機的CHS 0:0:1的磁區
7.從記憶體第0x7C00的位址開始執行2nd Bootload
註:CHS -- 指定磁區位置的方式,Cylinder: Head: Sector,0:0:1就代表第0個Cylinder(面)、第0個Head(磁軌)、第1個Sector(扇區)
其中3~7的動作就是1st Bootload,它是放在BIOS裡面的,我們沒辦法去對它做修改,因為這些是原廠出廠時就己經寫死了.
所以我們能自行撰寫2nd Bootload以及讓2nd Bootload跳轉至作業系統,但是有幾個規定要特別記住 :
1.這時只有單純CPU工作,作業系統完全沒被載入,所以我們僅能使用CPU指令,硬體I/O,BIOS中斷能使用而己,也就是說....想用C來寫2nd Bootload是不可能的 XD (除非有另外的函式庫....)
2.一個Sector的大小就是512Kbyte,據說是硬體規格(沒查證.....),也就是說....要寫出2nd Bootload,一定要把512Kbyte填滿 !
簡單來說,一旦BIOS發現了在0:0:1的開機磁區,就會把Sector(512Kbyte)的內容裝載到記憶體位址的0000:07C00處,然後再跳轉到0x7C00處將控制權全都交給這段(sector)開機程式碼,從這裡開始,電腦就不再由BIOS中固有的程式來控制,而變成作業系統的一部份來控制.
註:ROM BIOS的INT 19H(引導加載程序,相當於熱啟動系統) 固定裝入記憶體的0000:7C00H
所以,在2nd Bootload的程式碼開頭,一定要告訴CPU說,接下來的這些程式碼,是從0x7C00的地址開始的.
瞭解整個系統開機運作後,就可以來分析書上所提供的2nd Bootload程式碼 :
1 org 07c00h
2 mov ax, cs
3 mov ds, ax
4 mov es, ax
5 call DispStr
6 jmp $
7 DispStr:
8 mov ax, BootMessage
9 mov bp, ax
10 mov cx, 16
11 mov ax, 01301h
12 mov bx, 000ch
13 mov dl, 0
14 int 10h
15 ret
16 BootMessage: db "Hello, OS world!"
17 times 510-($-$$) db 0
18 dw 0xaa55
雖然書上的程式碼都有註解,但我還是一一分析...畢竟我組語完全不熟....T_T
註: 8086CPU一共有14個暫存器,先介紹等下會用到的暫存器
通用暫存器:AX、BX、CX、DX
(可獨立8位元使用 , AH和AL , 最大值僅能0~255)
段暫存器 : CS、SS、DS、ES、PSW
可間接定址暫存器:BP
1行 : 調整偏移量偽指令ORG,指定下面的指令從7c00h處開始,因為BIOS一旦發現引導扇區,就會將這512字節裝載到記憶體的0000:7c00處
2行:將CS(Code Seg,程式暫存器)內容放到AX(通用暫存器)
3~4行:同樣將DS,ES暫存器指向AX,這樣一來,CS,DS,ES將指向相同的segment
5行: call function "DispStr"
6行:call function完之後,將跳到相同的地址,也就是它會無窮迴圈. $代表當前所在的位址
8行:將BootMessage內容放進AX
9行:AX內容放進BP,亦即BP同樣指向BootMessage
10行:長度為16的字符串放進CX
11行:AH=13h,int 10h啟用視頻中斷13H號功能 , AL=01代表寫完字符串之後,更新光標位置
12行:BH=0H,頁號(視頻緩衝區是分頁的...恩...這我也不懂XD) , BL=0CH代表字符顯示屬性
13行:DH和DL寫字符串的光標位置,DH=行號,DL=列號 (不知道為啥DX就是寫字符串的暫存器...是定義就這樣子嗎?? 哎...要查查= =)
14行:啟用10h號中斷
15行:跟return一樣的道理...
16行:把BootMessage定義為Hello的字串,就如同#define一樣XD
17行:$是當前地址,$$是首地址,也就是說,從這樣開始一直到510處,全用0填充
18行:這滿重要的,其中的511和512地址是專門用來判斷是否為一個Boot Sector,0xAA55就是Boot Sector一個結束標誌
1/01/2011
IA-32
書上一直提到IA32架構 , 心裡一直很納悶IA32是什麼東西...
去網卡search一下 , 發現有篇文早說的還不錯 , 也提到Protected mode(保護模式) 和 Real-Address mode (真實模式) , 特別轉來紀錄一下
去網卡search一下 , 發現有篇文早說的還不錯 , 也提到Protected mode(保護模式) 和 Real-Address mode (真實模式) , 特別轉來紀錄一下
12/29/2010
建立Bochs環境
最近心血來潮,加上公司沒什麼案子可以作....就想來好好瞭解一下如何實現作業系統
到誠品買了一本"Orang's 一個作業系統的實現"的書,好好的跟著書本上做了一些練習
首先先要來搭建Bochs的環境,它也是一個虛擬機,但跟一般的VMware和VirtualBox有所不同
詳細Bochs的介紹,可以到它的官網上看,而且裡面還有安裝說明 :
Bochs官網
下載最新版的bochs 2.4.5
解壓縮完之後,在configure之前,請先安裝如下的元件,以保證configure和make能順利通過.
#sudo apt-get install libc6-dev build-essential xorg-dev libgtk2.0-dev
安裝之後,就可以來configure了,這樣才能產生Makefile
#./configure --enable-debugger --enable-disasm
後面的參數是為了能使用測試功能,不然bochs通常一出現視窗運行會沒辦法輸入指令
#make
為了確保和書上的路徑一致,所以我到Mafile裡面更改安裝路徑 :
#prefix = /usr/local
prefix = /usr
更改完之後,就可以安裝bochs的binary
#sudo make install
其中可能會出現 install: 無法 stat 「./bochsdbg」: 沒有此一檔案或目錄 的訊息,把bochs複製更名即可
#cp bochs bochsdbg
參照書上的做法,寫一段程式碼來引導作業系統啟動並加上"Hello World"字樣(後面我再來細細的看這段程式...沒學過彙編語言呀>"<)
到誠品買了一本"Orang's 一個作業系統的實現"的書,好好的跟著書本上做了一些練習
首先先要來搭建Bochs的環境,它也是一個虛擬機,但跟一般的VMware和VirtualBox有所不同
詳細Bochs的介紹,可以到它的官網上看,而且裡面還有安裝說明 :
Bochs官網
下載最新版的bochs 2.4.5
解壓縮完之後,在configure之前,請先安裝如下的元件,以保證configure和make能順利通過.
#sudo apt-get install libc6-dev build-essential xorg-dev libgtk2.0-dev
安裝之後,就可以來configure了,這樣才能產生Makefile
#./configure --enable-debugger --enable-disasm
後面的參數是為了能使用測試功能,不然bochs通常一出現視窗運行會沒辦法輸入指令
#make
為了確保和書上的路徑一致,所以我到Mafile裡面更改安裝路徑 :
#prefix = /usr/local
prefix = /usr
更改完之後,就可以安裝bochs的binary
#sudo make install
其中可能會出現 install: 無法 stat 「./bochsdbg」: 沒有此一檔案或目錄 的訊息,把bochs複製更名即可
#cp bochs bochsdbg
參照書上的做法,寫一段程式碼來引導作業系統啟動並加上"Hello World"字樣(後面我再來細細的看這段程式...沒學過彙編語言呀>"<)
![]() |
緊接著用NASM來編譯它,如果沒有NASM,可以利用apt-get來安裝(我是用source code來安裝...但基本上沒差別...)
#sudo apt-get install nasm
#nasm boot.asm -o boot.bin
編譯好了之後,接下來就要利用bximage來製作虛擬軟碟(也叫磁片映射)
#bximage
========================================================================
bximage
Disk Image Creation Tool for Bochs
$Id: bximage.c,v 1.34 2009/04/14 09:45:22 sshwarts Exp $
========================================================================
Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd] fd
Choose the size of floppy disk image to create, in megabytes.
Please type 0.16, 0.18, 0.32, 0.36, 0.72, 1.2, 1.44, 1.68, 1.72, or 2.88.
[1.44] <---直接按Enter
I will create a floppy image with
cyl=80
heads=2
sectors per track=18
total sectors=2880
total bytes=1474560
What should I name the image?
[a.img] <-----同上
Writing: [] Done.
I wrote 1474560 bytes to a.img.
The following line should appear in your bochsrc:
floppya: image="a.img", status=inserted
現在可以在bochs目錄下看到a.img了 ! 不過先把boot.bin拷貝進來,要把開機磁區寫進軟碟裡
#cp boot.bin bochs-2.4.5/
#dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
conv=notrunc代表磁區不要被系統給truncated,因為boot.bin比a.img還小,其實真正的軟碟是不會被truncated,現在是因為運行在bochs這台virtual machine所以才需要加入這個參數.
在真正開始Run bochs之前,要先對bochs配置一下,官方有非常詳細的說明,而bochs預設是會吃目錄下的.bochsrc , 不過先按照書上對它做個簡短的配置
Note : 在自行寫配置時, 一定要先參考.bochs預設的文件, 因為每個Bochs版本的配置寫法會有所修改.
OK,萬事俱備,馬上運行bochs來看看結果 !
OK,萬事俱備,馬上運行bochs來看看結果 !
#sudo bochs -f bochsrc
-f的參數後面是要接你自身配置的bochs,打-help可以看到其它命令,運行結果如下 :
會看到很多log...如果不想被這些log干擾,可以去配置bochsrc讓它輸出到一個文件就好.
剛開始我非常納悶,為何他媽的bochsrc就給我停在這,跟書本顯示不一樣,我一直以為是我的display沒有配好,所以我不斷的看官方文件,重配,重起,然後再看.......就這樣我卡了4個小時= =
最後受不了了,把最後顯示的指令往google上一貼 ! 還真他媽的讓我找到答案了 ....
原來...因為是測試模式,所以bochs一運行,會停在第一個指令等待用戶輸入命令...Fuck !!
(0) [0xfffffff0] f000:fff0 (unk. ctxt): jmp far f000:e05b ; ea5be000f0 <------ bochs 停在第 1 條指令處
也就是說,當使用調試運行時,bochs 會停在第 1 條指令, jmp far f000:e05b 是 bios 的第 1 條指令,然後等待用戶輸入命令.....
可能作者沒想到有更白痴的人會不瞭解...所以書上也沒解釋...T_T
然後我查了一下bochs底下的指令...結果順利完成第一個任務~~~感動的Hello World !!
Subscribe to:
Posts (Atom)