c如何編譯不用操作系統
Ⅰ 怎樣用C編寫一個操作系統,詳細的方法
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編譯器不依賴系統
所有的C編譯器都很少依賴系統,
只有這一點是依賴系統的:在可執行的程序格式上與系統規定一致。
真正依賴系統的只是庫函數。
只要你有本事,自己寫相關函數,以及啟動代碼,
你就可以天馬行空,自己寫操作系統吧,祝你成功。
補充:
在Vc裡面,你一般是不能編寫調用bios中斷的。即使可以,
那也是被虛擬的,並不能進行實際的硬體操作。這是
因為你的程序運行在非特權級,好多指令對你是屏蔽的。
只有運行在特權級的操作系統才能使用。
你的程序運行在NT核心的操作系統上就決定了這一切
Ⅲ 如何用c語言編寫簡單的操作系統
C語言當然是可以寫操作系統的,但是操作系統的編寫一般都不僅僅只是用C語言編寫的。
寫操作系統需要編程語言提供以下幾個特徵:
1、跨平台,不能是只在某個平台下編譯(VB就不行);
2、必須是編譯型語言(PHP就不行),或者有一個非常高效的解釋器;
3、必須有方便的操作硬體的功能,容易嵌入匯編(Java就不行);
4、兼容性要好,最好不同編譯器編譯的符號要基本相同,容易鏈接(C++不行,如果放棄Class的話C++基本可以);
5、編譯器本身最好是由該語言自己完成的(大部分語言的編譯器都是用C/C++寫的);
6、開發者可以很方便的擴展、改造、或者使用第三方的運行庫(大部分語言的庫都無法修改);
7、開發者眾多(小眾語言就不行);
8、該語言開發操作系統的資料要足夠完善。
所以總結下來,C語言是首選。
Ⅳ C的編譯與運行依賴操作系統嗎
這是當然的
C語言最編譯生成目的機器的
機器指令
代碼。
不同的機器有不同的指令集
IA-32,SPARC,POWER
PC
等的機器指令集都不相同的,如果一個
C程序
需要其它平台上運行,需要在該平台上重新編譯方可執行
Ⅳ C語言編譯操作系統的什麼部分,編譯一個系統都需要編譯什麼系統文件,讓系統能夠運行
C編譯器可以理解為開發工具,按照你說的,操作系統是C語言開發的,那用什麼開發它呢,用的就是C編譯器吧(不止編譯器,編譯器只是很少的一部分,這里用它代替開發環境),C編譯器要裝在電腦的操作系統上吧,然後你在裝有編譯器的操作系統下完成了另一個操作系統的開發,然後將你完成的這個操作系統安裝在另一台機器上,然後你的C開發的操作系統就運行了。所以說,C編譯器是運行在需要開發C程序的操作系統下的,這里你可以把你用C語言開發的操作系統認為是一個C程序。你在開發C程序而已,那這樣你就該知道你的C編譯器運行在什麼上面了吧。
Ⅵ 如何編寫不依賴操作系統的程序。就是裸機上可以運行的。匯編或c語言生成文件都是exe啊只能在win下
其實代碼都差不多。
平時做的程序,生產exe是因為在編譯的時候,鏈接了編譯器給的入口,然後代碼裡面以main作為起始運行。
而如果編譯的時候,不指定這個入口,而是採用其它的不依賴於操作系統的介面,那麼就可以裸機跑了。常見的,包括uboot, ecos,ucosII,eboot等等,這些都是有類似實現的。 感興趣可以看看uboot源碼,spl階段和uboot階段都是類似方式處理的。
Ⅶ c語言怎麼編寫脫離操作系統的軟體
這有點類似雞和蛋的關系。假定最開始有個匯編的編譯器,C語言之父用它開發了個最小的C語言編譯器,然後就可以用這最簡單的C語言開發復雜一點的C語言編譯器,這樣迭代開發。到了Linus的時候,GNU的創始人開發了gcc編譯器。已經是成熟的了。
Ⅷ 怎樣用c語言編譯
C編譯的整個過程很復雜,大致可以分為以下四個階段:
預處理階段在該階段主要完成對源代碼的預處理工作,主要包括對宏定義指令,頭文件包含指令,預定義指令和特殊字元的處理,如對宏定義的替換以及文件頭中所包含的文件中預定義代碼的替換等,總之這步主要完成一些替換工作,輸出是同源文件含義相同但內容不同的文件。
編譯、優化階段編譯就是將第一階段處理得到的文件通過詞法語法分析等轉換為匯編語言。優化包括對中間代碼的優化,如刪除公共表達式,循環優化等;和對目標代碼的生成進行的優化,如如何充分利用機器的寄存器存放有關變數的值,以減少內存訪問次數。
匯編階段將匯編語言翻譯成機器指令。
鏈接階段鏈接階段的主要工作是將有關的目標文件連接起來,即將在一個文件中引用的符號同該符號在另外一個文件中的定義連接起來,使得所有的目標文件成為一個能夠被操作系統裝入執行的統一整體。
Ⅸ windows如何編譯c文件
首先必須要在 Windows 操作系統上安裝一個 C/C++ 編譯器(例如:Microsoft Visual Studio C++),然後在這個集成環境中編寫 C 語言源程序(擴展名為 *.c),編寫完源程序之後,使用編譯器自帶的編譯、鏈接選項對源程序進行編譯、鏈接,若此時源程序沒有任何問題的話,即可以生成一個擴展名為 *.exe 的可執行文件。
Ⅹ 我聽說C語言可以編寫操作系統,但是編譯之後不是基於windows的程序嗎寫完後應該怎樣做呢
你想用C編寫windows操作系統?能不能別這么吊?!!!這是微軟的活兒,你想搶?
C當然可以寫操作系統,比如μC-cos操作系統,用C完全可以寫出來,具備多任務處理、任務掛起、任務調度等基本功能。
當然操作系統寫完之後僅僅是一個框架,你問接下來該怎樣做?這個問題應該問你自己,你寫操作系統的目的是什麼?難道純粹是為了寫操作系統?沒有目的之前,你為什麼要寫操作系統,或者我問你,你寫出來有什麼用呢?連你自己都不知道要干什麼。
具體的可以了解μC-cos,這是個最簡單的操作系統,可以基於8MHZ的51單片機運行,你可以先了解一下