【操作系統系列】Tinix
前言
最近找到一個做得很不錯很不錯的操作系統源碼,原文在[原創]自己實現的一個基於x86的操作系統-『編程技術』-看雪安全論壇,作者源碼tinixdev - / - Taocode。原代碼編譯有問題,我加工了下,在bajdcc/tinix,一個命令行敲下去就能編譯運行了。
關於tinix的介紹在作者文章中有,鏈接在https://github.com/bajdcc/tinix/raw/master/%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0.doc。
介紹
tinix比我做的minios長得漂亮多了,代碼非常清晰,注釋非常齊全!
它實現了:
- 內存管理
- 文件管理(fat12,只讀)
- 控制台管理(多控制台切換,著色)
- 時鐘中斷
- 多任務調度
- 虛擬文件系統(如cat /sys/cpuinfo)
- 系統調用(exec等)
系統調用:
#definet_NR_sys_opent0t//s32 sys_open(u8 *);n#definet_NR_sys_close t1t//s32 sys_close(s32);n#definet_NR_sys_writet2t//s32 sys_write(s32 , u8* , u32 );n#definet_NR_sys_readt3t//s32 sys_read(s32 , u8* , u32 );n#definet_NR_sys_seekt4t//s32 sys_seek(s32 , s32 , u32 );n#definet_NR_sys_waitt5t//s32 sys_wait(u32);n#definet_NR_sys_exitt6t//s32 sys_exit();n#definet_NR_sys_exect7t//s32 sys_exec(u8 *);n#definet_NR_sys_killt8t//s32 sys_kill(u32);n#definet_NR_sys_getpidt9t//s32 sys_getpid(u32);n#definet_NR_sys_getticks10t//s32 sys_getticks();n#definet_NR_sys_pstatt11t//s32 sys_pstat(u32, void *, u32);n#definet_NR_sys_opendirt12t//s32 sys_opendir(u8 *);n#define _NR_sys_readdirt13t//s32 sys_readdir(s32, void *, u32);n#definet_NR_sys_getdatet14t//s32 sys_getdate(void *, u32);n#definet_NR_sys_reboott15t//s32 sys_reboot(u32);n#define _NR_sys_sleep t16t//s32 sys_sleep(u32);n
原本以作者的代碼,如果要編譯生成img並運行的話,比較繁瑣,所以我寫了點腳本,直接用mount去修改鏡像。
但是有個bug,經過兩天研究,我發現作者的user中生成的程序,它的段不是以4096對齊的,這就導致exec載入代碼的時候出現page fault(假設段從0x80005120開始,長度2個頁面大小,那麼實際上經過計算,只是載入了從0x80005000-0x80006FFFF的虛頁,那麼我要訪問0x80007000就gg了,這個問題比較坑人,經過我調試才發現)。解決方案是在ld命令行中指定「-Tdata的地址」。
總之,非常推薦用作者的代碼來學習。
PS:32位Ubuntu 14.04 LTS編譯通過。用64位編譯會有問題,問題在於有些彙編指令不兼容。目前qemu的調試不能用,想調試的話,裝好vmware和ida,參照[翻譯]使用VMWare GDB和IDA調試Windows內核。
推薦閱讀:
※如何將C語言發揮到極致?
※Windows 之後,什麼操作系統可能會佔據主流?
※Amiga電腦傳奇(四)
※一個進程能不能在多個核上跑?
※中斷向量為什麼叫中斷向量?