一段下班班车上的思绪

今天下班在从东莞回深圳的班车上突然想到Linux系统中或者生活中到处充满着虚拟化。


先引用几段我比较喜欢的理论:


曾有一段时间程序员担心是否有可用的内存来存放自己的程序指令和数据,于是出现了虚拟内存,后来,为了更好地时分共享昂贵的大型机系统,出现了虚拟服务器。


虚拟化技术的实现形式是在系统中加入一个虚拟化层,虚拟化层将下层的资源抽象成另一种形式的资源,提供给上层使用。


通过空间上的分割,时间上的分时以及模拟,虚拟化将一份资源抽象成多份,反过来,虚拟化也可以将多份资源抽象成一份。


总的来说,虚拟化可以把一个纷繁复杂、无计划性的世界改造成一个似乎为人们的特定需求而量身打造的时间。

           出自《系统虚拟化:原理与实现》


下面说说我对关于linux系统中的kvm,以及老生常谈的虚拟化文件系统和mmap函数零拷贝的最简单直接第一印象的理解。


对于虚拟化文件系统就是在mount时为突破口,再根据不同的文件系统在struct super_block 、root inode上挂载不同的回调函数,有root然后有万物,最后read write不同的文件系统上的文件时,自然有不同的操作。


对于mmap, 

 fd = open(...);

char *addr = void *mmap(void *addr, 

             size_t length,

             int prot, int flags,

            int fd, off_t offset);

memcpy(addr, "jeff" , 4);

memcpy(buff, addr, 4);


open不同的文件或者设备,返回不同文件或设备的句柄,然后mmap时,通过fd找到对应的文件或者设备,最后返回一个起始地址,当在用户读写addr时,由于这个addr刚开始没有对应的物理内存,此时会page fault, 如果fd对应的是普通文件,内核就就会去读写磁盘,如果是一个io设备,内核就会去读写io mem, 或者fd对应的是一个虚拟设备,内核就会给它分配一块指定的内存空间去读写,所以不管这样,当发生page fault的时候,此时内核想怎么样玩就怎么玩,最后返回addr对应的page即可,page中包含任意指定的数据。


对于kvm虚拟化,当guest在访问特权指令或者访问io或者mmio时,被host截获到,host瞒着guest做任意想做的事从而实现内存或者io虚拟化。


无处不虚拟,比如我上次在微信公众号分享linux内核资料,告知回复一个字符串osdoc就能获取linux内核资料,当读者回复osdoc时,我能在不同的时间在后台改写回复内容。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章