全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com)
前面已经分析了如何实现一个系统调用,这个过程的梳理也已经整理成了一份学习笔记。这一次看一下,如何让OS的系统中增加这样的一个可执行的文件。还是以date这个命令为例。
系统启动之后,多了一个date文件,这个跟我们的命令是对应的。那么,有一个奇怪的地方就需要注意了。
Makefile之中,这个命令其实是带有一个下划线作为前缀的。那么,这样的一个冲突是如何解决的呢?
即使是查看编译链接之后的结果,其实也是可以看到这个前缀的。那么,这样的冲突在整个构建过程中是通过什么方式来处理掉的呢?是xv6本身具备这样的功能吗?其实不然!分析一下xv6的构建环境会发现,其实这个功能的实现是基于unix系统中的C语言来实现的。整个处理机制是C语言写的,编译成了可执行文件之后处理实现了这样的转换过程。而这部分C语言并不是xv6的一部分。
Makefile的内容再多看一点吧,那就是这一系列的可执行文件的生成规则。其实,从.c到.o的转换是非常简单的。而这里增加了一个依赖处理规则,实现了带有下划线的这部分可执行程序的构建。
可执行文件可以进入到OS中让OS识别到,其实是打包到了同一个文件镜像中。也就是上面makefile中划出来的这部分所实现的功能。而这里的mkfs其实是一个可执行文件。
而这个mkfs,其实是通过编译链接生成的。具体的处理规则,也是在makefile中定义出来的。由此,这个处理的方式其实是就需要看C语言中的具体实现了。
Mkfs.c中,其他的地方可以先不去研究们可以注意到这里这一段代码。代码前面也写了非常有用的注释可以让我们知道,在处理文件到文件系统的时候,这个前面的前缀是被处理掉了的。
直接通过C语言设计工具在makefile中调用,这不是第一次看到了,另一次是在看FUZIX代码的时候看到的。的确是非常巧妙,也足以让我去好好反思一下,为什么类似的处理在我的工作中就很难联想到。换句话说,如果是我做类似功能的处理,大概率我会想到脚本语言而不是C。看得出来,C的扩展库的掌握,我的确是需要增补一下。