熟悉elf檔案格式,了解geekos系統如何將elf格式的可執行程式裝入到記憶體,建立核心程序並執行的實現技術。
1) 修改/geekos/elf.c檔案:在函式parse_elf_executable( )中新增**,分析elf格式的可執行檔案(包括分析得出elf檔案頭、程式頭,獲取可執行檔案長度,**段、資料段等資訊),並填充exe_format資料結構中的域值。
2) 在linux環境下編譯系統得到geekos映象檔案。
3) 編寫乙個相應的bochs配置檔案。
4) 在bochs中執行geekos系統顯示結果。
1) spawn_init_process函式的功能是呼叫start_kernel_thread(),它以spawner函式為程序體建立乙個核心級程序,並使之準備就緒。
2) start_kernel_thread函式通過呼叫create_thread函式、setup_kernel_thread、make_runnable_atomic來建立核心程序。
*create_thread函式主要功能為通過alloc_page函式為kernel_thread結構體和核心程序棧區分配記憶體空間,並通過init_thread函式初始化kernel_thread結構體。最後將該程序結構體通過add_to_back_of_all_thread_list函式加入程序佇列末尾。
*setup_kernel_thread函式主要是初始化程序棧區,包括引數位址、返回位址、入口位址、暫存器值等。
*make_runnable_atomic函式將該程序設定為就緒態,加入等待執行佇列。
3) spawner函式執行過程為:通過read_fully函式將elf可執行檔案讀入記憶體緩衝區;通過parse_elf_executable函式解析elf檔案, 並通過spawn_program函式執行elf檔案。最後通過free函式釋放記憶體緩衝區。
4) spawn_program函式根據exe_format中的exe_segment結構提供的使用者程式段資訊及使用者程序棧大小計算使用者程序所需的記憶體大小,分配對應的記憶體空間,並全部初始化為零;根據exe_segment中的segmentlist陣列,將資料段和**段從記憶體緩衝區複製到使用者記憶體空間;生成資料段和**段的段描述符、段選擇子;通過trampoline函式執行使用者程序。
函式spawn_program在/src/geekos/lprog.c檔案中已經實現。引數的資料結構exe_format和exe_segment的定義在elf.h中。如下:
struct exe_format;
struct exe_segment;
由於系統已經實現了核心的所有函式,本專案設計只需完成parse_elf_executable即可。parse_elf_excutable函式宣告為:
int parse_elf_executable(char *exefiledata, ulong_t exefilelength,struct exe_format *exeformat)
exefilelength——可執行檔案長度
exeformat——儲存分析得到的elf檔案資訊的結構體指標
根據elf檔案格式,使用者可以從exefiledata指向的內容中得到elf檔案頭,繼續分析可以得到程式頭,程式**段等資訊。
在專案1的./src/user目錄下有乙個a.c檔案,編譯geekos後(即make後)可以得到可執行程式a.exe,並寫進pfat檔案系統,路徑為c/a.exe。專案將此作為待裝入的可執行檔案,啟動bochs執行a.exe。
在a.c檔案中,既有全域性變數也有區域性變數,這裡還要注意一下區域性變數如何輸出。
1)編寫乙個相應的bochs配置檔案。
cd ~/geekos-0.3.0/src/project1/build/
gedit .bochsrc
megs: 8
boot: a
floppya: 1_44=fd.img, status=inserted
log: ./bochs.out
ata0-master: type=disk, path=diskc.img, mode=flat, cylinders=40, heads=8, spt=64
2)修改/project1/src/geekos/elf.c 檔案中的 parse_elf_executable()函式,實現對 elf 格式檔案的分析,並將分析結果儲存到 exe_format 結構體中,以便系統使用,實現**如下:int parse_elf_executable(char *exefiledata, ulong_t exefilelength,struct exe_format *exeformat)
return 0;
}
3)修改/project1/src/geekos/lprog.c 檔案中的 spawn_program()函式,將其中的 virtsize 區域性變數修改為靜態全域性變數,即在檔案頭部新增「static unsigned long virtsize;」一行**。
4)修改 lprog.c 檔案中的 printrap_handler()函式,將其改為如下內容:
static void printrap_handler( struct interrupt_state* state )
5) 進入「/project1/build/」目錄,在終端中執行「bochs」命令,啟動執行後得到如下結果:
如圖所示,執行後,螢幕顯示a.c檔案中的輸出內容以及spawner函式中的輸出內容,專案一設計完成。
課程設計表
create database drug 藥品表 create table drug did nvarchar 10 primary key,dname nvarchar 50 not null,dimage nvarchar 100 not null,dmodel nvarchar 10 chec...
課程設計總結
課程設計今天終於完了,答辯之後感悟挺多的,一方面,覺得自己的努力獲到了應有的成果,當然也有很多不足及未完成的地方 另一方面,看到很多其他同學好的設計及思想。覺得很多方面都值得自己學習,自己還有很多方面都很欠缺,本次課程設計我和兩個同學共三個人做了聊天程式,仿qq做的。聊天軟體,是我之前一直想完成的乙...
課程設計備份
include include include include define size 100 define increase 10 struct nodel 順序表 typedef struct tree btree,bnode 二叉樹struct stackt 棧int caidan int i...