【操作系統系列】Tinix

前言

最近找到一個做得很不錯很不錯的操作系統源碼,原文在[原創]自己實現的一個基於x86的操作系統-『編程技術』-看雪安全論壇,作者源碼tinixdev - / - Taocode。原代碼編譯有問題,我加工了下,在bajdcc/tinix,一個命令行敲下去就能編譯運行了。

關於tinix的介紹在作者文章中有,鏈接在github.com/bajdcc/tinix

介紹

tinix比我做的minios長得漂亮多了,代碼非常清晰,注釋非常齊全!

它實現了:

  1. 內存管理
  2. 文件管理(fat12,只讀)
  3. 控制台管理(多控制台切換,著色)
  4. 時鐘中斷
  5. 多任務調度
  6. 虛擬文件系統(如cat /sys/cpuinfo)
  7. 系統調用(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電腦傳奇(四)
一個進程能不能在多個核上跑?
中斷向量為什麼叫中斷向量?

TAG:操作系统 | C编程语言 | 编程学习 |