发布时间:2014-08-06 20:00:50
Oops中的error code解释
1、如果第1位被清0,则异常是由一个不存在的页所引起的;否则是由无效的访问权限引起的。
2、如果第1位被清0,则异常由读访问或者执行访问所引起;否则异常由写访问引起。
3、如果第2位被清0,则异常发生在内核态;否则异常发生在用户态。......【阅读全文】
发布时间:2014-08-06 09:42:39
kernel 3.10内核源码分析--vmalloc(非连续内存页分配)
在分配内存时,总是希望能分配到连续的物理内存页,愿望是美好的,但系统中可能没有太多的连续内存可用(比如内存碎片严重时),此时就需要一种非连续内存的分配方式。于是乎,就产生了vmalloc,vmalloc用于分配不连续的物理内存页,但将其映射到内核虚拟地址空间中后,其虚拟地址是连续的
内核虚拟地址空间中,有一段专门的区间用于vmalloc,称之vmalloc区,位于线性映射区之后,准确的说是从892M+8M(VMALLOC_START)到VMALLOC_END之间,其中892M是线性映射区,用于线性映射低端内存,之后的8M是安全间隙,用于区间隔离,防止越界。
vmalloc区中包含一个个独立的子区域,每个子区域用于一次独立映射,各个子区域间通过一个内存页进行隔离,防止不正确的内存访问操作。......【阅读全文】
发布时间:2014-08-06 09:09:10
3.10 kernel内核源码分析--ioremap
1、为什么需要ioremap
问题:分配mmio(request_mem_region)后,得到的是物理地址,按理只需要将其转换为虚拟地址后(内核中,低端内存只是一个偏移而已),
应该就可以直接访问了吧?但是为什么还需要使用ioremap将其转换为线性地址后才能访问呢?
解答:分配的mmio的物理地址在内核中不一定能直接访问,比如:
1)x86 32位环境中,mmio的地址范围就在3G-4G之间,位于高端内存,内核中不能直接访问,需要进行映射。
2)一些体系架构中,IO内存根本就不能直接访问,必须建立相应的映射后才行,相应的映射工作由架构相关的ioremap完成......【阅读全文】
发布时间:2014-08-05 19:11:51
Entry point: main(vl.c) | kvm_init(qemu-kvm.c) -> machine->init(pc_init_pci in ./hw/pc.c)-> main_loop(vl.c) |  .........【阅读全文】
发布时间:2014-07-18 19:46:03
KVM的API是通过/dev/kvm设备访问的,/dev/kvm是一个标准的字符设备,可以使用常用的open、close、ioctl接口操作,但是kvm的实现中,没有提供read和write接口,所有对KVM的所有操作都是通过ioctl接口操作的。KVM提供给上层的API功能上分,可分为3中类型:
1、 system指令,针对虚拟化系统的全局性参数设置和控制。
2、 VM指令,针对VM虚拟机进行控制,如:内存设置、创建VCPU等。
3、 VCPU指令,针对具体的VCPU进行参数设置。如:相关寄存器的读写、中断控制等。
通常对于KVM的操作都是从open /dev/kvm设备文件开始的,open后,会获得相应的文件描述符(fd),然后通过ioctl系统指令对该fd进行进一步的操作,比如通过KVM_CREATE_VM指令,可以创建一个虚拟机并返回虚拟机对应的文件描述符,然后根据该描述符来进一步控制虚拟机的行为,比如通过KVM_CREATE_VCPU指令来为该虚拟机创建VCPU。......【阅读全文】
发布时间:2014-07-18 11:42:44
在bash脚本中执行后台命令(加&)时,需要执行wait命令回收后台子进程的资源,否则会内存泄露??
?最近遇到一个奇特的问题,在脚本中反复调用后台命令(后台命令执行后会退出),发现一段时间后,内存占用明显增加,有内存泄露的迹象。
经过深入分析,得出结论:
在脚本中,调用后台执行的命令,确实应该wait,不wait的话,确有内存泄露的情况。......【阅读全文】
发布时间:2014-07-17 19:23:47
Out Of Memory(OOM),即内存耗尽,当系统中内存耗尽时,如果不做处理,将处于崩溃的边缘,因为无内核资源可用,而系统运行时刻都可能需要申请内存。这时,内核需要采取一定的措施来防止系统崩溃,这就是我们熟知的OOM流程,其实就是要回收一些内存,而走到OOM流程,已经基本说明其它的回收内存的手段都已经尝试过了(比如回收cache),这里通常只能通过kill进程来回收内存了,而选择被kill进程的标准就比较简单直接了,总体就是:谁用的多,就kill谁。......【阅读全文】
发布时间:2014-07-17 08:48:18
信号在如下时机进行处理:
当从中断或异常(包括系统调用)返回用户态时。
?注意:这里是返回“用户态”,也就是说,当当前进程正在内核态执行时,是不能处理信号的,必须等到其返回用户态时才能处理信号。......【阅读全文】
发布时间:2014-07-16 20:52:30
Crash工具用于解析Vmcore文件,Vmcore文件为通过kdump等手段收集的操作系统core dump信息,在不采用压缩的情况下,其相当于整个物理内存的镜像,所以其中包括了最全面、最完整的信息,对于分析定位各种疑难问题有极大的帮助。配置kdump后,在内核panic后,会自动进入kump流程,搜集Vmcore。
crash工具即为专门用于分析vmcore文件的工具,其中提供了大量的实用分析命令,极大的提高了vmcore的分析效率。
再分析vmcore的过程中,常常需要解析内核某个流程中的关键变量的值,以便确认故障当时系统的状态,本文主要介绍变量的解析。......【阅读全文】
发布时间:2014-07-09 17:14:57
pci配置空间中有6个bar,表示mmio或端口在CPU域物理地址空间的分布情况。?
?在写驱动时,通常需要从配置空间中读取相关bar信息,然后使用request_mem_region之类的接口,申请资源,然后使用ioremap将相关的区域映射到内核地址空间中,然后即可使用。
?问题是:pci配置空间中的bar信息,即mmio或io端口的分布,到底是谁决定、谁填写的呢?是硬件自己 or BIOS or OS kernel
?答案:对于x86环境来说(其它硬件环境不确认),pci配置空间中的bar信息最初是由BIOS根据当前环境中的硬件分布信息,进行分配后填入的,32位环境,PCI设备的mmio基本分布于3.5G-4G范围中,基本能保证各设备分配的空间不冲突。在OS kernel启动硬件扫描和初始化时,会读取相应内容,如果有需要,会根据需要进行调整(通常不会)。......【阅读全文】
发布时间:2014-07-07 11:44:05
AutoNUMA NUMA hinting fault numa_balancing---
redhat提出的新的机制,用于平衡Numa节点间的内存访问,基本思想是:定期统计各进程的内存访问情况,
并unmapping pages,然后触发NUMA hinting fault,在page fault中重新均衡内存访问,目的是使运行
进程的CPU尽量访问本地节点上的内存,提升性能。......【阅读全文】
发布时间:2014-07-02 17:15:46
kernel 3.10内核源码分析--缺页异常(page fault)处理流程......【阅读全文】
发布时间:2014-07-02 09:39:24
page fault不能发生在内核态么?为什么?
这里有3个问题:
1、为什么会产生page fault?
?2、发生缺页的上下文是否可以位于内核态
3、发生缺页的地址是否可以位于内核态地址空间......【阅读全文】