存档

文章标签 ‘内核’

利用vm/kvm启动ghost镜像

2012年5月12日 没有评论 11,457 次浏览

目前,kvm还不能直接启动ghost镜像,因为qemu支持的磁盘格式里还没有包含ghost,不过可以看到qemu已经支持vmdk,而利用symantec... [阅读更多]

利用KVM调试内核

2012年5月12日 1 条评论 9,201 次浏览

虽然kvm运行的虚拟机也是host的一个进程,但是却不能像UML那样直接gdb attach到对应的进程进行调试,毕竟kvm和uml完全不同,如果那样做的话,你会发现你attach的只是qemu-system-x86进程: (gdb)... [阅读更多]

应用程序与物理内存之间的关系

2012年4月3日 没有评论 8,187 次浏览

应用程序与物理内存本没有直接关系,因为应用程序看到的都是虚拟内存,至于这块虚拟内存到底映射哪块物理内存,应用程序并不关心,也没有能力关心。不过既然文章标题叫做“应用程序与物理内存之间的关系”就说明应用程序与物理内存之间虽然没有直接关系,但有间接关系;我们知道应用程序能够在运行时主动申请、释放的内存主要有Heap(malloc/free/…)、Mapping(mmap/munmap/…),这里就以Heap为例(因为前面曾详细分析过应用程序里的堆内存管理),看它们之间有如何微妙的间接关系。 当应用程序malloc一块内存时,如果应用程序自己管理的堆内存还有缓冲(这个不难理解,对于应用程序的内存申请,内核都比较大方,即使应用程序只申请4字节的内存,内核也会给它4KB,假设内存页大小为4KB),那么就直接使用了,无需再向内核讨要;否则的话,只有调用sbrk()或mmap()向内核讨要新的内存了,dlmalloc解析连载完整word文档里已经描述过,应用程序优先调用sbrk()以扩展当前Heap的连续空间,如果无法扩展(比如此时,前面待延伸的内存地址空间恰好被某个文件映射占用了),那就只有mmap()申请另外的一段地址空间。 以sbrk()为例,syscall到内核里对应的是do_brk()函数,带有两个参数,第一个为内存地址addr,第二个为增减的长度len,可正(比如:malloc)可负(比如:free),这个函数所做的工作只有一个,那就是根据进程请求情况进行判断并调整进程的vma(或增大或减小或拆分或合并等)并返回给进程对应的地址空间,当然这是成功的情况,如果vma判断调整失败,那就直接返回ENOMEM或其它错误码。 既然应用程序进行内存申请时没和物理内存扯上关系,那么当应用程序实际进行内存访问时,总该和物理内存扯上关系了吧?的确也是如此。当应用程序访问(读写)一个并没有对应物理地址的逻辑地址时,CPU就会产生一个中断号为14的中断,该中断将被内核捕获。查看源码的话,在这里: /*... [阅读更多]

Linux X86-64 进程内存空间布局(续)

2012年4月3日 没有评论 7,352 次浏览

在很久很久以前,我曾详细的分析过应用程序里的内存管理,也就是应用程序里的内存分配与释放过程,具体可以参考:dlmalloc解析连载完整word文档,这是站在应用程序角度来看的内存管理视图,更具体点说只是应用程序对自己所用到的堆空间内存的管理视图。 在不久之前,我又提到过Linux... [阅读更多]