『壹』 如何從零開始寫一個簡單的操作系統
(一)OS說明
今後,我就要開始折騰操作系統,有了一點小小干勁。
我的計劃是,先看過一份用於教育目的的系統源碼,再去翻找相應的資料(我手頭已有綠寶書),在翻資料的同時開始寫代碼,然後做好移植真機的工作,DONE!
我也明白,理性很豐滿,現實很骨感,這過程不會如同我計劃中這般簡單和輕松。但是,見難而退可不是我的風格(那樣我會被紅葉二小姐調戲的),不管如何,我都會,怎麼說呢,盡力吧。
出於課程需求,斯坦福那些人親自寫了一個名為「pintos」的系統。pintos的結構比較簡單,分為進程管理、文件系統、用戶程序、虛擬內存等幾個部分,也正是因為這個原因,我選擇pintos作為我的參考藍本,現在在讀它的源碼。
在接下來的幾個月時間里,不出意外的話,我會不斷的在博客上更新我的進度。
(三)交叉編譯環境
倘若我們要在ubuntu上編譯另外一個完整的OS,交叉編譯環境是必不可少的玩意,維基網路有雲:
交叉編譯器(英語:Cross compiler)是指一個在某個系統平台下可以產生另一個系統平台的可執行文件的編譯器。
(想起以前,我為了給路由器編譯OPENWRT,下載大量源碼,愣是編譯了幾天幾夜。那時候的我,真是「可愛」。)
為了配置好交叉編譯環境,我廢了好大力氣,最後勉強找到了組織。
編譯環境大致分為2部分,binutils和gcc。我先裝好gcc-4.9.1,之後下載gcc-4.9.1和binutils-2.25的源代碼,似乎gcc版本與binutils版本要對應來著…
開始編譯之前,需要准備全局變數(在命令行中敲入以下命令):
export PREFIX=」$HOME/opt/cross」
export TARGET=i686-elf
export PATH=」$PREFIX/bin:$PATH」
編譯Binutils
cd $HOME/binutils-2.25
mkdir build-binutils
cd build-binutils
#注意是在源碼目錄下面新建一個文件夾,然後cd到該文件夾里,然後才配置configure,不這么做的話,嘿嘿..
../binutils-x.y.z/configure –target=$TARGET –prefix=」$PREFIX」 –with-sysroot –disable-nls –disable-werror
make
make install
–disable-nls 告訴binutils,不要添加本地語言支持
–with-sysroot 告訴binutils,在交叉編譯器中允許sysroot
編譯GCC
cd $HOME/gcc-4.9.1
mkdir build-gcc
cd build-gcc
#注意是在源碼目錄下面新建一個文件夾,然後cd到該文件夾里,然後才配置configure,不這么做的話,嘿嘿..
../gcc-x.y.z/configure –target=$TARGET –prefix=」$PREFIX」 –disable-nls –enable-languages=c,c++ –without-headers
make all-gcc
make all-target-libgcc
make install-gcc
make install-target-libgcc
–disable-nls 告訴GCC,不要添加本地語言支持。
–without-headers 告訴GCC,不要依賴任何本地庫,我們必須在自己的OS中實現庫。
–enable-languages 告訴GCC,不要支持除了C、C++之外的語言。
提醒
不同機器配置不同,編譯速度也不同。
編譯這兩個軟體,我花了近3個鍾,機器配置之低自不必說,說了都是淚。
如果任何人的任何編譯過程出了任何問題,請仔細地、認真地、用心地再看看上面的命令,在你沒有弄懂它的原理之前,請不要擅自做任何「改進」(血淋淋、赤裸裸的教訓呀)。
(五)OS模糊框架
翻完了手頭的綠寶書,我才曉得,人都是被逼出來的。
操作系統的概念都差不多已經知道,接下來,該由「理論態」切換到「實踐態」了喔(書還是不能看太多,會中毒的–)。
對了,從別人推薦的地方弄來了一個框架(曾在android平台寫了幾萬代碼,我深深體會到框架的作用),輕松開工吧。
『貳』 怎麼編寫操作系統
WINDOWS,LINUX/UNIX系統都是用C語言編寫的.
可以說90%以上的代碼都是C語言寫成,只有少量的核心代碼是用匯編完成的.
這在計算機行業來說,已經是通用的知識.稍微懂一點系統的人都知道.
操作系統和驅動程序是用C語言編寫的.
或者我有個"自己動手寫操作系統完全版"的電子書,加我,我傳給你~~在邪八下的。
『叄』 自己動手寫一個操作系統
難度哦~看看這本書吧《自己動手寫操作系統》,看完可不是只寫個「hello world」那麼簡單~~
『肆』 怎麼編寫電腦系統
1. 建立開發環境
這一步非常的簡單。
將masm613和vc15的壓縮包分別解壓到e:masm615和e:msvc15目錄下。你也可以放到其他目錄下,根據自己的情況而定,但是下面用到的編譯命令需要作相應的修改。也不需要添加或修改任何的環境變數。
2. IBM PC的啟動及當時的內存使用情況
這一部分內容已經是老生常談了,但又不能不說。我們只說從硬碟引導的情況。
當BIOS經過POST(Power On Test Self)後,將硬碟MBR讀到內存0x0000:0x7C00的位置,然後從這里開始執行。一般的情況,MBR將選擇活動分區進行操作系統的啟動。在MBR開始執行時,內存使用的情況如下圖所示,地址數據用16進製表示:
這已經是老掉牙的內容了,但是,在20年前卻十分流行。如果想更詳細的了解這方面的內容,找本講解DOS的書看看吧。
我們自己的操作系統將被載入到0x1000:0x0100。這不是必需或者必然的,是人為選擇的,你也可以將其放在0x4321:1234等其他地方。但是,上圖中註明有其他用途的內存區域,應該保留,否則,你會後悔的。
3. 開發操作系統
我們自己的操作系統運行在實模式環境下(如果您不知道什麼是實模式,也請看看20年前出版的當時非常流行的書,或者直接請教當時的前輩高手)。即使你的電腦是P4的CPU,剛啟動時,也只相當於主頻較高的8086而已。但是,沒有關系。
首先,使用匯編語言寫一個框架,文件名是entry.asm:
;
; entry.asm
; Copyright (C) 2004, Tian XiangYuan
;
.MODEL TINY,C
.386p
option expr32
option casemap:none
cmain PROTO NEAR C
.CODE
ORG 0100h ;偏移地址
_start:
jmp begin
nop
DB 'TianXiangYuan',0 ;the magic of my os
begin:
cli
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0FFFFh
sti
call cmain ;調用C語言寫的主函數
mov ax,4c00h ;調用DOS的功能(為了調試),與我們自己的操作系統無關
int 21h
這段代碼非常簡單,應該沒有什麼問題。
已經說了,操作系統將從0x1000:0x0100載入,說是無心,實則有意。我們知道,TINY模式的程序,在DOS下運行時,其起始地址就是0x0100,前面的256Byte是參數部分。如果直接將操作系統在系統啟動時載入到0x1000:0x0100,調試時非常麻煩。我們將其起始地址設為0x0100,使其可以在DOS下運行(這也是在程序的最後包含int 21h指令的原因),確認正確無誤後,再進行下一步的開發。
下面再看C語言的代碼,文件名是main.c:
……
static void InitShell()
{
}
void cmain()
{
InitShell();
TermShell();
}
顧名思義,其中實現了一個簡單的shell。因為該程序本身是操作系統的一部分,所以,平時經常使用的一些C庫函數,在這里就不能使用了。總之,一切都要自己動手實現。幸好,在實模式下,幾乎所有的設備的驅動都包含在BIOS中了,我們可以直接使用。否則,連從鍵盤讀一個鍵值這樣的事都需要自己寫鍵盤的驅動程序,實在太難了。也是這個原因,我們自己的操作系統沒有將CPU轉到保護模式下,有心之人可以試試。
下面的事情幾乎都可以使用C語言實現了。
第一,初始化顯示模式。系統啟動時,顯卡已經被初始化成3模式了,就是80X25的彩色模式(除非你的顯示器是單色顯示器),我們不需要再做什麼了。當然,你也可以將顯卡設成VGA甚至SVGA模式,只要你的BIOS和顯卡支持。
第二,實現一個具有簡單交互功能的shell。代碼不全,請自己補齊,或參看附件。
/*
*從鍵盤讀一個字元,如果沒有輸入,則等待;返回值的低位元組為asii碼,高位元組為鍵盤掃描碼
*/
static int getch()
{
int chr=0;
__asm
{
mov ah,00h
int 16h
mov chr,ax
}
return chr;
}
/*
*使用TTY模式向屏幕輸出一個字元
*/
static void putch(unsigned char key)
{
__asm
{
mov bh,0
mov al,key
mov ah,0Eh
int 10h
}
}
#define KEY_BACKSPACE 0x08
#define KEY_ENTER 0x0D
#define KEY_NEWLINE 0x0A
#define KEY_ESCAPE 0x1B
static int printk(const char* str,...)
{
…… //給大家一點空間,自己實現吧
}
static void endline()
{
putch(KEY_NEWLINE); //Line Feed (LF)
putch(KEY_ENTER); //Enter (CR)
}
static char msg_prompt[]="CMD:";
static void deal_cmd(char* cmd_line,int cmd_len)
{
…… //也請大家自己實現吧,例如,可以實現help,dir,cls,halt等命令
…… //其實,就是字元串比較的過程
}
static void TermShell()
{
char cmd_line[80]={0,};
int cmd_len=0;
endline();
printk(msg_prompt,sizeof(msg_prompt));
for (;;)
{
cmd_line[cmd_len]=getch();
switch(cmd_line[cmd_len])
{
case KEY_ENTER:
if (cmd_len>1)
deal_cmd(cmd_line,cmd_len);
//break;
case KEY_ESCAPE:
cmd_len=0;
endline();
printk(msg_prompt,sizeof(msg_prompt));
break;
case KEY_BACKSPACE:
if (cmd_len>0)
{
putch(0x08);
putch(' ');
putch(0x08);
cmd_len--;
}
break;
default:
putch(cmd_line[cmd_len]);
cmd_len++;
}
}
}
更復雜、功能更強大的方法請參考BIOS的相關文檔。也請大家發揮想像力,不斷的擴展功能。說心裡話,這個「操作系統」比dos還原始!但畢竟是自己的操作系統。
『伍』 怎樣自己寫一個簡單的操作系統
只要你學過匯編和C,只滿足於寫個「簡單的操作系統",一兩天就能搞定。
隨便把你寫過的小程序,用直接寫硬碟軟體(或者自己編一個,調用winapi的WriteFile函數就可以),寫進硬碟/U盤引導區。記住,起始地址是7c00。
這就好了。注意,引導區只有440個位元組給你用,程序不能太大,所以這部分基本要用匯編寫。440位元組後面是硬碟/U盤分區信息,不可以亂動。亂動以後bios可能沒法識別硬碟/U盤。
引導區最後兩個位元組必須是55AA,不過一般你不用管,硬碟/U盤格式化的時候都已經給你寫好了。
這樣你的程序就在開機的時候直接運行了。
想調用大程序也沒問題,你需要寫個不超過440位元組的程序,負責把第二個扇區的內容載入內存並執行,由第二個扇區的代碼負責把所有代碼載入內存。後面的部分用C寫或者別的高級語言寫都沒什麼問題了。
『陸』 學習什麼可以自己寫電腦系統
電腦操作系統包含很多方面,不是幾個人就能開發出來的。就不用說你一個人學什麼了。你可以先從一些簡單的系統開始學習。先寫單片機,再做Linux嵌入式,然後做安卓和IOS,再接觸Windows,一步一步來。
『柒』 怎麼寫電腦系統
最簡單--你要會電腦編程語言。(編程跟數學,化學公式一樣,是一個科目)
『捌』 怎樣編寫像Windows這樣的操作系統
90%的C語言+10%的匯編語言
windows系統都主要是用C語言編寫的
我們在用windows平台上編程的時候,要調用系統API(應用程序介面),這些介面封裝在系統的.dll(動態鏈接庫)裡面,所有的API函數都是32位平台上的C函數,從windows3.0一直windows95,到現在的win2003,都是基於C函數庫的程序集,所以用C函數編出的系統程序系統執行效率最高,當然在底層的一些調用,不排除有些是用匯編編的,但內核大多是用C做的。
另:MFC只是windows系統上API函數的封裝,基於面向對象原理,服務於GUI程序設計,MFC從AFX發展而來,已有十多年的歷史,最新的MFC6.0,那是設計基於windows系統程序的,而不是用來編寫操作系統本身,但也不能完全這樣說,系統上有些服務(可以說很多,比如時間)是用MFC做的。
『玖』 怎麼寫操作系統
編寫操作系統是一個很復雜的系統工程,需要對系統硬體有一定的了解,需涉及到很多的知識面,非一日一人之功;
但是,如只實現操作系統的簡單功能,如任務調度、同步機制、中斷管理等,還是比較簡單的,尤其是一些針對嵌入式領域的操作系統還是比較短小精悍的,可以作為參考,如ucOS便是一個源碼開放的操作系統,可參考之;另,《自己動手寫操作系統》一書很不錯,可作為參考。
『拾』 操作系統是怎麼寫入電腦硬體的
計算機開機通電後,就開始執行運算,其中就包含基礎的主板bios檢測,檢測各項硬體是否正常。然後bios開始訪問硬碟,硬碟里有系統引導程序,開始開機載入系統,系統其實是寫入到硬碟的,而開機是從主板檢測開始的主板本身帶有bios程序,通電就開始執行,硬體中的bios。