Linux中断处理过程分析 很久以来对于中断处理没有系统化理解和分析,总是有点好似明白感觉,现在进行从头整理一番。1.中断处理过程总体介绍中断处理过程,非常简单1).中断准备(计算中断向量,保存寄存器),2). 中断处理3). 中断处理完成返回代码如下: addl $-0x80,(%esp) SAVE_ALL call do_IR
Linux 预读代码分析 一. 预读算法触发条件预读触发也就是什么时候进行预读算法判别?下面代码2.6.32内核,分析代码可见预读算法触发条件为两种:页面缺失(页缓存没有找到)和读取含预读标志的页面。static void do_generic_file_read(struct file *filp, loff_t *ppos, read_descriptor_t *desc,
页面回收分析之二 函数分析-----page_check_references shrink_active_list mark_page_accessed首先看看页面扫描回收大概过程, 然后分析三个函数如何进行页面状态变换1.首先扫描非活跃链表中,然后当空闲页面不够时,扫描活动链表,并将相应页面状态变换。2.然后回收非活跃链表,没有设置页描述符的字段 flags位PG_referenced页。
Linux 内存页面回收 页面回收内容感觉非常复杂,主要原因在于分析者,把其复杂化。1.内存页面页面回收实际就是回收相应缓存, 因为系统为了性能有效,使用大量缓存。 这些缓存占用大量内存。 当系统内存短缺时,可以回收相应页面。如果不一致话,首先要把缓存内容,刷新到外部存储中。缓存页面可分为:可压缩的缓存(目录和inode节点占用内存页面), slab, 交换高速缓存(缓存交换分区的页面),页高速缓存(缓存文件内容的
Linux驱动----设备内存映射 1.什么是内存映射呢?如何理解?所谓映射是两个集合中的一种特殊的对应关系,通过这一关系把一个集合的内容投影到另一个集合中去。根据此定义可知存在这两个集合。内存映射这个概念中,只设计一个集合内存,另一个集合呢?根据另一个集合的类型可以分为匿名映射(anonymous)和文件映射(file_backed). 在Linux系统中, 文件有可分为普通文件和设备文件等。普通文件的内存映射系统已经
内核链表及应用 1.内核链表的定义1)上面是链表结构体定义,又定义可知为双向链表2)通过链表命名可知该链表没有头结节(链表头),没有头节点意味着每一也都是头节点。3)由于没有头节点,该链表又实现循环链表功能。struct list_head { struct list_head *next, *prev;};2.链表初始化链表使用首先要初始化,下面初始化代码。
cond_resched探讨和分析 下面有cond_resched注释和源代码1.顾名思义有条件的调度,条件是什么呢?2.注释解释/* * cond_resched() and cond_resched_lock(): latency reduction via * explicit rescheduling in places that are safe. The retur
Linux驱动----PCI 驱动开发实例 详细原理不介绍, 参照《Linux 设备驱动 Edition 3》中第16章块设备驱动,第12章 PCI 驱动开发,以及qemu-kvm虚拟化设备模拟,以及其他设备中断,端口读写等等, 涉及知识较多,应该是一个综合实例。多余不必叙述,可参考下面代码。由于该实例涉及知识较多,建议首先学习《Linux 设备驱动 Edition 3》中第16章块设备驱动,第12章 PCI 驱动开发,再尝试该实例。注
Linux驱动----块驱动开发实例 详细原理不介绍, 参照《Linux 设备驱动 Edition 3》中第16章块设备驱动. 本文把Linux设备驱动示例代码sbull移植到2.6.32版本,对应于发行版redhat6,centos6。由于对sbull比较复杂,便于理解,进行相应裁剪,去掉对功能没有影响代码,具体原因测试过程,可以不修改(你觉得无关紧要或者无法确定代码),看看会出现什么问题,这样会理解更深。注意:1.本人内核
Linux驱动----网络驱动开发实例 详细原理不介绍, 参照《Linux 设备驱动 Edition 3》中第17章网络驱动. 本文把Linux设备驱动示例代码snull移植到2.6.32版本,对应于发行版redhat6,centos6。为了提高高端 Linux 系统性能的方法, 目前网络子系统开发一般采用基于查询的接口,所以把snull代码中接收中断去掉了,只使用NAPI。由于对snull比较复杂,便于理解,进行相应裁剪,去掉对功
Linux驱动----TTY驱动开发实例 详细原理不介绍, 参照《Linux 设备驱动 Edition 3》中第18章TTY 驱动. 本文把Linux设备驱动示例代码tiny_tty移植到2.6.32版本,对应于发行版redhat6,centos6。对于修改原因,下面做了简单说明,具体原因测试过程,可以不修改(你觉得无关紧要或者无法确定代码),看看会出现什么问题,这样会理解更深。注意:1.本人内核版本:# uname -r
Linux内核线程,定时器,工作队列编程实例 Linux内核线程,定时器,工作队列编程实例:实例大概过程如下: 一.初始化1.创建一个工作队列test_wq2.创建一个定时器timer3.创建一个内核线程二.工作过程1.定时器每隔500ms调用do_htimer2.定时器触发工作队列调用do_work3.工作队列触发睡眠的内核线程(唤醒睡眠线程)三.结束1.停止内核线程2.取消定时器
qemu-kvm virtio 虚拟化-----Linux客户机 virtio设备初始化 Linux客户机 virtio设备初始化virtio设备物理上连接在pci物理总线上,逻辑上连接在virtio虚拟总线。做为pci设备便于资源分配与配置,逻辑设备模型中,便于管理与组织。1.qemu-kvm提供的virtio pci设备virtio-blk(硬盘),virtio-net(网络),virtio-balloon(气球)等pci设备,这些设备连接在pci总线上。代码位于qem
中断屏蔽的综合分析 中断过程: | | | | | | + 设备 +------>+ 中断控制器 +------->+ cpu + | | | | | |1.设备发送中断,如果中断控制器没有屏蔽,中断控制收到中断。2.中断控制器发送设备中断, 如果处理器没有屏蔽,c
qemu-kvm 设备虚拟化----I/O 端口和 I/O 内存 qemu-kvm 设备虚拟化----I/O 端口和 I/O 内存操作设备存在两种接口:I/O 端口和 I/O 内存,下面分析虚拟机如何截获和模拟这两种情况的。1.用户空间访问内核数据结构信息内存映射可被实现来提供用户程序对设备内存的直接存取,KVM 内核代表每个 VCPU 的 struct kvm_run 数据结构被 mmap用户空间,从而用户空间可以读取 struct kvm
qemu-kvm i/o虚拟化----设备注册和加载 /////////////////////////////////////////////1.注册映像,设备,机器相应数据结构block_init()device_init()machine_init()注意: 上述函数为构造函数__attribute__((constructor)),即在main()函数执行前,相关函数已执行。#define module_
qemu-kvm 内存虚拟化---影子页表 qemu-kvm 内存虚拟化---影子页表影子页表被载入到真正硬件MMU中,通过影子页表进行客户机虚拟地址到宿主机物理地址(gva--->hpa)的转换。由于影子页表项不存在或者访问权限不够,可能导致页故障,这页故障由物理硬件MMU产生的,这些故障被截获,并且进行处理和模拟。影子页表页故障处理流程:1.首先遍历客户机页表,获取页表的结构和内容,判断客户机页表的权限是否足够,
虚拟MMU---客户机页表遍历 客户机页表的遍历MMU的功能:虚拟机地址转换为物理地址,下面函数模拟此过程。1.数据结构 struct guest_walker { int level; gfn_t table_gfn[PT_MAX_FULL_LEVELS]; pt_element_t ptes[PT_MAX_FULL_LEVELS]; gp
影子页表页内存管理----分配与回收 影子页表页管理-----分配和回收影子页表页分配static struct kvm_mmu_page *kvm_mmu_alloc_page(struct kvm_vcpu *vcpu, u64 *parent_pte){ struct kvm_mmu_page *sp
影子页表虚拟化---INVLPG 影子页表虚拟化---INVLPG当客户机修改客户机页表的表项,客户机执行INVLPG敏感指令刷新TLB部分内容。正常流程为:VMM截获这一操作,并对影子页表项进行相应修改,设置不存在,刷新影子页表部分内容。代码分析:static void FNAME(invlpg)(struct kvm_vcpu *vcpu, gva_t gva){ struct kvm