停了兩天電,忽然得空閑。找來破吉他,已然不成弦。
丁丁當當敲,敲到電來到。為把時間撿,熬夜三四點。
從我的置頂隨筆 x01.Lab.Download 中下載 x01.os.12.tar.gz, 解壓后由終端進入 os 目錄,輸入 bochs 命令即可見到如下界面:
注意下面的四行,分別是 open,write, read, unlink 文件。調用代碼如下:
1 void TestA() { 2 int fd, n; 3 char path[] = "/test"; 4 char bufw[] = "hello"; 5 const int Len = 3; 6 char bufr[Len]; 7 8 fd = open(path , O_CREAT | O_RDWR); 9 PRint("fd: %d/n", fd);10 11 n = write(fd, bufw, StrLength(bufw));12 Print("write ok!/n");13 14 close(fd);15 16 fd = open(path, O_RDWR);17 n = read(fd, bufr, Len);18 bufr[n] = 0;19 Print("read: %s/n", bufr);20 21 close(fd);22 23 if (unlink(path) == 0)24 Print("unlink file: %s", path);25 26 // Spin("TestA");27 while (1) {28 MilliDelay(2000);29 }30 }TestA
按 F2 后,可切換到 tty2, 分別輸入 hello 回車,this is a test 回車,可看到如下界面:
其調用代碼如下:
1 void TestB() { 2 char ttyName[] = "/dev_tty1"; 3 int stdin = open(ttyName, O_RDWR); 4 Assert(stdin == 0); 5 int stdout = open(ttyName, O_RDWR); 6 Assert(stdout == 1); 7 char buf[128]; 8 9 while (1) {10 write(stdout, "$ ", 2);11 // Spin("write");12 int r = read(stdin, buf, 70);13 buf[r] = 0;14 if ( StrCompare(buf, "hello") == 0 ) {15 write(stdout, "hello world!/n", 13);16 } else {17 if (buf[0]) {18 write(stdout, "{", 1);19 write(stdout, buf, r);20 write(stdout, "}/n", 2);21 }22 }23 }24 25 Assert(0);26 while (1) {27 MilliDelay(2000);28 }29 }TestB
兩向對照,不難看出,文件的打開,讀寫,刪除等功能已經具備,而 tty 也成功納入了文件系統。
文件系統,本身并不復雜,不過超級塊和索引節點兩個結構。但文件系統的實現,卻頗為繁難,不僅涉及到硬盤的操作,而且也涉及到 tty,進程間通信等諸多方面。在某種意義上講,文件系統處于整個操作系統的核心。因為用戶程序本身,也不過是個文件而已。搞清文件系統,一是看書,二是看代碼,別無他途。
耗時多日,終于將文件系統運行成功,是為記。
新聞熱點
疑難解答