Linux 内核
文章平均质量分 68
zhuriyuxiao
这个作者很懒,什么都没留下…
展开
-
Linux 内核模块的详细编写步骤
1.确定内核开发包存在以及存在位置1)rpm -qa | grep kernel-develkernel-devel-2.6.32-71.el6.x86_642)rpm -ql kernel-devel-2.6.32-71.el6.x86_64 | more/usr/src/kernels/usr/src/kernels/2.6.32-71.el6.x86_642.确定原创 2012-05-30 16:05:00 · 950 阅读 · 0 评论 -
Linux内核线程,定时器,工作队列编程实例
Linux内核线程,定时器,工作队列编程实例:实例大概过程如下: 一.初始化1.创建一个工作队列test_wq2.创建一个定时器timer3.创建一个内核线程二.工作过程1.定时器每隔500ms调用do_htimer2.定时器触发工作队列调用do_work3.工作队列触发睡眠的内核线程(唤醒睡眠线程)三.结束1.停止内核线程2.取消定时器原创 2013-08-09 10:45:37 · 758 阅读 · 0 评论 -
Linux驱动----PCI 驱动开发实例
详细原理不介绍, 参照《Linux 设备驱动 Edition 3》中第16章块设备驱动,第12章 PCI 驱动开发,以及qemu-kvm虚拟化设备模拟,以及其他设备中断,端口读写等等, 涉及知识较多,应该是一个综合实例。多余不必叙述,可参考下面代码。由于该实例涉及知识较多,建议首先学习《Linux 设备驱动 Edition 3》中第16章块设备驱动,第12章 PCI 驱动开发,再尝试该实例。注原创 2013-08-30 10:50:56 · 1203 阅读 · 0 评论 -
Linux page cache, block buffer ,swap cache, disk cache
buffer 与 cache 是作为磁盘文件缓存(磁盘高速缓存disk cache)来使用,主要目的提高文件系统系性能。具体工作过程参见上一篇blog Linux 内核read工作过程.不同点是buffer以块为大小操作,所以称块缓存,cache是以页为大小操作,所以称为页缓存(page cache)。什么情况块为单位操作磁盘呢?1.读写inode节点和超级块等操作2.读写文件在磁原创 2012-05-18 15:07:54 · 922 阅读 · 0 评论 -
cond_resched探讨和分析
下面有cond_resched注释和源代码1.顾名思义有条件的调度,条件是什么呢?2.注释解释/* * cond_resched() and cond_resched_lock(): latency reduction via * explicit rescheduling in places that are safe. The retur原创 2013-12-30 17:10:19 · 1336 阅读 · 0 评论 -
内核链表及应用
1.内核链表的定义1)上面是链表结构体定义,又定义可知为双向链表2)通过链表命名可知该链表没有头结节(链表头),没有头节点意味着每一也都是头节点。3)由于没有头节点,该链表又实现循环链表功能。struct list_head { struct list_head *next, *prev;};2.链表初始化链表使用首先要初始化,下面初始化代码。原创 2013-12-31 11:46:15 · 284 阅读 · 0 评论 -
Linux 内存页面回收
页面回收内容感觉非常复杂,主要原因在于分析者,把其复杂化。1.内存页面页面回收实际就是回收相应缓存, 因为系统为了性能有效,使用大量缓存。 这些缓存占用大量内存。 当系统内存短缺时,可以回收相应页面。如果不一致话,首先要把缓存内容,刷新到外部存储中。缓存页面可分为:可压缩的缓存(目录和inode节点占用内存页面), slab, 交换高速缓存(缓存交换分区的页面),页高速缓存(缓存文件内容的原创 2014-02-27 15:06:31 · 502 阅读 · 0 评论 -
页面回收分析之二
函数分析-----page_check_references shrink_active_list mark_page_accessed首先看看页面扫描回收大概过程, 然后分析三个函数如何进行页面状态变换1.首先扫描非活跃链表中,然后当空闲页面不够时,扫描活动链表,并将相应页面状态变换。2.然后回收非活跃链表,没有设置页描述符的字段 flags位PG_referenced页。原创 2014-03-06 14:35:45 · 841 阅读 · 1 评论 -
Linux 预读代码分析
一. 预读算法触发条件预读触发也就是什么时候进行预读算法判别?下面代码2.6.32内核,分析代码可见预读算法触发条件为两种:页面缺失(页缓存没有找到)和读取含预读标志的页面。static void do_generic_file_read(struct file *filp, loff_t *ppos, read_descriptor_t *desc,原创 2014-03-06 14:54:02 · 824 阅读 · 0 评论 -
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原创 2013-07-17 16:58:06 · 2404 阅读 · 0 评论 -
中断屏蔽的综合分析
中断过程: | | | | | | + 设备 +------>+ 中断控制器 +------->+ cpu + | | | | | |1.设备发送中断,如果中断控制器没有屏蔽,中断控制收到中断。2.中断控制器发送设备中断, 如果处理器没有屏蔽,c原创 2013-07-10 11:01:26 · 515 阅读 · 0 评论 -
Linux 内核read工作过程
普通文件读过程(1)当应用程序调用库函数read(),触发对系统资源使用,所以就触发了系统调用sys_read()。为了本身支持多种文件系统,Linux开发统一抽象虚拟文件系统接口---虚拟文件系统(VFS)。所以理所当然调用该层的vfs_read()函数。(2)为了改进系统系能,所以引入缓存(磁盘高速缓存disk cache)---众所周知内存与硬盘读写速度差距是非常大,并且内存原创 2012-05-14 15:24:01 · 913 阅读 · 0 评论 -
Linux 自旋锁
1.什么是自旋锁自旋锁顾名思义首先是一把锁,另外使用这把锁的线程需要反复自我循环(loop)检测这把锁是否可用。注意与信号量区别,信号量也是一把锁,但是使用这把锁的线程检测锁不可用时,选择去睡眠,而不是自我循环。自旋锁与信号量相同点是两者都是锁,都具备锁定特性,实现临界区代码块的同步与互斥访问。2.自旋锁实现(摘自http://en.wikipedia.org/wiki/Spi原创 2012-06-07 13:30:30 · 3329 阅读 · 0 评论 -
Linux 睡眠与唤醒
现实中,很容易理解睡眠与唤醒的意思。这一概念如何应用到操作系统中的呢?首先明白睡眠与唤醒的“主体”是进程,也就是说进程睡眠与唤醒。其次需要了解什么”条件“导致其睡眠与唤醒。1.Linux中进程睡眠含义与实现睡眠的说法有很多,例如挂起,阻塞等,其实本质就是主体(进程)所处的一种状态,可以通过状态描述 TASK_INTERRUPTIBLE, TASK_UNINTERRUPTIBLE。 具体实现原创 2012-06-08 11:40:27 · 3345 阅读 · 0 评论 -
Linux内核查找文件-dcahe,icache,pagecache
1. 要查找文件,首先查找文件所在目录。例如查找/usr/bin/ls文件,那么首先知道bin目录“信息”, 查询bin目录,首先知道usr目录“信息”,这样形成一个递归过程。但是递归过程必需一个终结条件,否则会存在鸡生蛋还是蛋生鸡问题。其实终结条件是“/”根“信息”,必须默认知道。下面讨论一下,具体文件系统ext2(3,4)。上面所指”信息“,其实就是磁盘文件系统中inode节点,记住原创 2012-06-15 11:07:07 · 728 阅读 · 0 评论 -
应用程序和内核 core dump
应用程序core dumpcore dump, memory dump, storage dump 三者表达同一意思内存转存。什么情况发生转存?那些内存?转存到哪里?内存转存作用是什么?如何使用呢?1)什么情况发生转存?当程序异常崩溃时,另外系统打开对core文件大小资源控制。系统默认core文件大小查询:#ulimit -c0设置core文件大小:#uli原创 2012-06-15 11:21:34 · 1180 阅读 · 0 评论 -
Linux下半部分机制---工作队列
当我们编写设备中断,必须要编写中断处理程序。中断处理程序有些特点:1.关闭中断情况下执行,这样当负载很重时,影响系统性能。2.中断处理程序中,不能进行睡眠。对于中断处理程序限制,造就必须解决问题。解决方案把中断处理分为两部分上半部分和下半部分。上半部分就是执行中断处理程序。下半部分就是突破上述限制。目前下半部分实现机制有如下几种: 软中断,tasklet,工作队列,首先分析工作队列原创 2012-06-18 17:06:14 · 398 阅读 · 0 评论 -
PTR_ERR , ERR_PTR 和 IS_ERR
#define EPERM 1 /* Operation not permitted */#define ENOENT 2 /* No such file or directory */#define ESRCH 3 /* No such process */#define EINTR原创 2012-06-21 14:14:21 · 318 阅读 · 0 评论 -
影子页表虚拟化-----反向映射
反向映射 mmu维护一个反向映射, 因此映射这个页的所有页表项,由gfn(客户机页框号)找到映射此页的影子页表项spte。这些情况下:当客户机的宿主机物理页面被交换到硬盘上或者被回收,这是有用的。为什么有用呢?如果客户机的宿主机物理页面被交换到硬盘,影子页表肯定要知道,并且要更新影子页表,设置不存在。下一次客户机访问被交换出去页面,查询影子页表被截获,进行处理。如何更新影子页表呢?原创 2013-06-05 16:39:55 · 856 阅读 · 0 评论 -
Linux中断处理过程分析
很久以来对于中断处理没有系统化理解和分析,总是有点好似明白感觉,现在进行从头整理一番。1.中断处理过程总体介绍中断处理过程,非常简单1).中断准备(计算中断向量,保存寄存器),2). 中断处理3). 中断处理完成返回代码如下: addl $-0x80,(%esp) SAVE_ALL call do_IR原创 2014-08-12 16:26:07 · 286 阅读 · 0 评论