x01.os.13: 文件系统

停了两天电,忽然得空闲。找来破吉他,已然不成弦。

          丁丁当当敲,敲到电来到。为把时间捡,熬夜三四点。

从我的置顶随笔 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,进程间通信等诸多方面。在某种意义上讲,文件系统处于整个操作系统的核心。因为用户程序本身,也不过是个文件而已。搞清文件系统,一是看书,二是看代码,别无他途。

耗时多日,终于将文件系统运行成功,是为记。

时间: 2024-10-24 23:55:12

x01.os.13: 文件系统的相关文章

x01.os.14: 时间都去哪儿了

时间都去哪儿了 老帕的“花儿为什么这样红”,三分钟引起六次欢呼,却败给了张碧晨.试想一下,如果是人气更高的陈冰,即使唱得和张碧晨一模一样,可能仍然不敌老帕,为什么张碧晨就能取胜呢?有这么个笑话:一人弹琴无人听,但一老妇人听得却潸然泪下.原来她的亡夫是弹棉花的!这虽是个笑话,却一语道破玄机.歌声动人,除了唱功,还有感情因素在里面.假如老帕的”花儿为什么这样红“是 1 分, 那么,张碧晨的父女情为 1 分, ”时间都去哪儿了“为 1 分.2 : 1, 张碧晨胜出也就理所当然了. shell 的实现

x01.os.1: BIOS 中断

这只是一点准备工作.为了显示字符串,需要调用中断:int  0x10 (AH=0x13).具体参数设置,参考我的归纳整理如下: INT 10 (AH = 0) -----------------功能:设置显示方式调用参数:    AL = 00:40 * 25 黑白方式         01:40 * 25 彩色方式         02:80 * 25 黑白方式         03:80 * 25 彩色方式         04:320 * 200 彩色图形方式         05:320

x01.os.8: 加载内核

在 x01.os.7 中,借助 freedos,学习了保护模式.但操作系统必须完成引导:boot, 加载内核:loader,kernel,进而管理process,memory,file等. 引导比较简单,开机启动时,CPU 采取硬的方式,直接把 BIOS 载入内存某处运行.这就是电脑启动时按 DEL 键可以看到的画面.此时,无硬盘可以,无内存则不可以.BIOS 是一个只读芯片,但我认为它仍有可写的部分,否则,启动盘设置的保存,就说不通.BIOS 退出时,它会检测启动盘 0 扇区的最后两个字节,是

x01.os.9: 进程切换

进入内核后,当然不能无所事事.先创建三个进程,分别打印 A,B,C.虽然只是简单的打印,但却是一切扩展的基础,不可等闲视之. 进程切换,涉及一系列的寄存器需要保护,于是,就有了 ProcessStack 结构,代码如下: typedef struct { u32 gs; u32 fs; u32 es; u32 ds; u32 edi; u32 esi; u32 ebp; u32 KernelEsp; u32 ebx; u32 edx; u32 ecx; u32 eax; u32 RetAddr;

13.文件系统——组合不同级别的RAID、硬件RAID和软RAID

从RAID0到RAID6,不同级别的RAID在性能.冗余.价格等方面做了不同程度的折中.组合不同级别的RAID,目的是扬长避短,产生具有优势特性的混合RAID级别.常用的组合RAID主要有RAID10,RAID01,RAID50和RAID05. RAID10是先做1,再做0:而RAID01则是先做0,在做1,RAID50和RAID05同理. 一.RAID10和RAID01 RAID10结合RAID1和RAID0,先镜像,再条带化.比如现在有6块硬盘,其中每两块形成一组镜像--RAID1,然后将3

x01.os.7: 傻子一样的等

傻子一样的等 昨日出差,办完事后,下午 2:30,准备进长途汽车站买票回家,被一人拦住,说可以带我进去,车马上就要开了,买票来不及.我以为是汽车司机,就跟了进去.进去后,他打了个电话,说 3:30 车才到,让我先把票买了.我把钱给他,他拿了个代客车票的单子,写了几个字给我,说上车时再换票,然后就走了.人已走,车没来,我拿着写了字的纸,感觉像傻子一样的等.3:30,车来了,我凭那张纸,顺利的上了车.是为记. 保护模式 实模式采取 segemnt:offset 的方式,表示 20 位的内存地址.保护

x01.os.18: MBR

硬盘不同于软盘,它是要分区的.这时,mbr(master boot record)便不可少了.安装 os 硬盘的第一扇区,开始有一小段不多于 446 字节的程序,然后是分区表 512-446-2 字节,然后是引导标志 0xAA55 两字节.这一小段程序,便是 mbr 的主体.mbr 首先将其自身复制到 0x0600 处,代码如下: ; 0x7C00 => 0x0600 mov si, sp push si mov di, 0x0600 mov cx, 0x200 cld rep movsw 这是

x01.os.11: IPC 路线图

学习的最好方法就是看代码,所以我们不妨跟着 IPC 的调用路线图,来学习学习 IPC. 从 x01.Lab.Download 下载代码后,首先进入 main.c 文件,在 TestA 中,有这么一句:Print("<Ticks:%x>", GetTicksIPC()); 其中,GetTicksIPC 就是通过 IPC 获取时间 tick 数.进入 GetTicksIPC,会看到如下代码: 1 m.type = M_GetTicks; 2 _SendReceive(M_Bot

x01.os.12: 在 windows 中写 OS

在 windows 中写操作系统,需要一系列的辅助工具.在此,要感谢川谷秀实!所有工具,都在 z_tools 文件夹中.有了大师的帮助,不妨也来尝试在 windows 中写一把 OS. 源代码及工具可到 x01.Lab.Download 中下载.进入 src 文件夹,只有两个文件,一个是 run.bat, 一个是 boot.s.boot.s  都是大同小异的,skip!run.bat 内容如下: ..\z_tools\nask boot.s boot.bin boot.txt ..\z_tool