小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

自制操作系統(tǒng)學(xué)習(xí)2 加載C語言程序

 書房1974 2020-08-30
自制操作系統(tǒng)學(xué)習(xí)2 加載C語言程序

一、準(zhǔn)備工具

  • bochs
  • Virtual Machine
  • nasm
  • gcc
  • ld

等。更多需要的工具已經(jīng)放在碼云開源倉庫。

二、操作步驟

1. 實(shí)現(xiàn)步驟

  1. 完成引導(dǎo)程序開發(fā)
  2. 使用匯編語言兩段子程序
  3. 使用C語言開發(fā)調(diào)用匯編子程序
  4. 編譯程序,制作軟盤鏡像
  5. BIOS加載并運(yùn)行匯編語言的引導(dǎo)程序
  6. 匯編語言程序從軟盤讀取10扇區(qū),當(dāng)中包含C語言程序
  7. 程序跳轉(zhuǎn)到C語言的程序
  8. C調(diào)用匯編,實(shí)現(xiàn)清屏操作。

2. 重點(diǎn)

(1) 匯編語言子程序?qū)崿F(xiàn)

[BITS 16]global io_hltglobal clear_screenclear_screen: ; 清屏 mov ax, 03h int 10h ;pop ecx ; jmp cxRETio_hlt:HLTRET

這段子程序?qū)崿F(xiàn)了清屏、空循環(huán)功能。

為方便C的調(diào)用,再寫一個頭文件:

#ifndef __UTILITIES_H_#define __UTILITIES_H_// 此處只提供函數(shù)聲明// 函數(shù)實(shí)現(xiàn)在utilities.svoid io_hlt(void);void clear_screen(void);#endif

(2) 在C中調(diào)用匯編的方法

#include 'utilities.h'void main(void){ clear_screen(); // clear screen fin: io_hlt(); /* call io_hlt */ goto fin;}

三、編譯的重點(diǎn)

TOOLPATH = ./tools/TARGET      = ./target/SRC    = ./src/LD=./env/bin/i686-elf-ld.exeCC=./env/bin/i686-elf-gcc.exeNASM=$(TOOLPATH)nasm.exeDD=$(TOOLPATH)dd.exeBOCHSPATH=$(TOOLPATH)bochs/MAKE     =$(TOOLPATH)make.exe -rCOPY = copyDEL      = del# LD編譯選項(xiàng)LDFLAGS=-m elf_i386# GCC編譯選項(xiàng)CCFLAGS=-march=i386 -m16 -mpreferred-stack-boundary=2 -ffreestandingASFLAGS=# 默認(rèn)動作default :  kernel.bin  loader.bin kernel.o utilities.o loader.o# 匯編的函數(shù) 用來給C調(diào)用utilities.o: $(SRC)kernel/utilities.s$(NASM) $(ASFLAGS) -f elf32 -o $(TARGET)$@ $^kernel.o : $(SRC)kernel/kernel.c $(SRC)kernel/utilities.h$(CC) $(CCFLAGS) -o $(TARGET)kernel.o -c $(SRC)kernel/kernel.ckernel.bin : kernel.o utilities.o$(LD) $(LDFLAGS) -Ttext 0xC200 --oformat binary -o $(TARGET)$@ $(TARGET)kernel.o $(TARGET)utilities.oloader.o: $(SRC)boot/loader.s$(NASM) $(ASFLAGS) -f elf32 -o $(TARGET)$@ $^loader.bin : loader.o$(LD) $(LDFLAGS) -Ttext 0x7c00 --oformat binary -o $(TARGET)$@ $(TARGET)$^install :$(DD) if=$(TARGET)kernel.bin of=$(TARGET)os.img conv=notrunc bs=512 seek=1$(DD) if=$(TARGET)loader.bin of=$(TARGET)os.img conv=notrunc  run : Makefilecd $(TOOLPATH) && bochs.bat && cd ..debug:cd $(TOOLPATH) && bochsdebug.bat && cd ..clean :cd $(TARGET) && del -f *

匯編編譯器nasm生成 .o 文件,
C編譯器 gcc也生成 .o 文件,
通過LD進(jìn)行鏈接,生成二進(jìn)制文件。

3. 編譯運(yùn)行

makemake install

這里還有點(diǎn)問題,生成的kernel.bin后進(jìn)行下面操作:

  • 使用Virtual Box 加載 os.img 軟盤鏡像
  • 把kernel.bin 拷貝到os.img
  • 彈出虛擬軟盤
make run

可以看到最后屏幕被清屏了。

也可以使用 make debug 調(diào)試,看一下內(nèi)存情況:
在0xc200處設(shè)置斷點(diǎn):

b 0xc200c

下圖可以看到程序在0xc205處調(diào)用了 0xc220,
然后在0xc20b處進(jìn)入空循環(huán)。

自制操作系統(tǒng)學(xué)習(xí)2 加載C語言程序


清屏效果:

自制操作系統(tǒng)學(xué)習(xí)2 加載C語言程序

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多