最终目标是要通过xen下的Dom0中自己写的proc文件直接调用hypercall,实现gettimeofday的测试。
首先要先完成proc的实现。来自若木的proc fs系列写的非常详细,很有帮助,当然,位于内核源码
Documentation/Docbook中的例子procfs_example.c也很有参考性,因为我只要实现一个简单的proc例子,所以只要实现init、read的功能,以下是一个最最简单的proc例子,只要在/proc下生成一个readtest和gettimedir/gettime,不过,我因为gettimeofday中测试的时候竟然忘记kmalloc,调试了我半天~我脑残啦!!!
废话不多说,代码先贴出(xen-3.3.0/linux-2.6.18.8-xen):
需要注意的是,最后一行中是用__initcall()来调用初始化函数gettime_init,当然还有一些其他的调用如module_init,一下是它的用法,
The module_init() macro defines which function is to be called at module insertion time (if the file is compiled as a module), or at boot time: if the file is not compiled as a module the module_init() macro becomes equivalent to __initcall(), which through linker magic ensures that the function is called on boot.
当然还有subsys_initcall,它也是一个宏,我们可以把它理解为module_init,只不过因为这部分代码比较核心,开发者们把它看作一个子系统,而不仅仅是一个模块。
还有很多其他的,据说有7个,这里不再详细讨论,有兴趣的自己Google吧 ~
其他的都不难理解,比如说:proc_mkdir()是在/proc下创建一个目录,参数中NULL表示/proc主目录下,同样的,create_proc_entry()是创建一个文件,其中dir_pde表示父文件夹,create_proc_read_entry()是创建只读文件,之后就可以给他们的read_op赋值了。具体的原理可以参考若木的proc fs系列,这里有转载。
写一个简单的proc文件并不困难,但如果你想更深入的了解其中的原理,就需要更多地去看内核的源代码,当然,在这个例子中还涉及到了kernel态对hypercall的调用,我想这个会在后面的文章中更详细地讲吧~
第一次写这种文章,若有错误请多多指教@@