linux2.6.xx内核代码分析
文章平均质量分 81
刘军卫
linux爱好者,主要致力于虚拟化云计算方面的研究,尤其专注于openstack,kvm,linux kernel等源码和架构的研究
微博:Marshal-Liu
展开
-
workqueue原理和源码分析
<br />workqueue,中文称其为工作队列,是一个用于创建内核线程的接口,通过它创建的内核线程来执行内核其他模块排列到队列里的工作,创建的内核线程被称为工作者线程。要理解工作队列的实现,重点在于理解相关的三个数据结构的含义及关系。 1 表示工作队列类型的数据结构:struct workqueue_struct/*<br /> * The externally visible workqueue abstraction is an array of * per-CPU workqueues: */原创 2011-04-29 09:56:00 · 4596 阅读 · 0 评论 -
linux 中断相关的几个问题
intel 提供了三种类型的中断描述符:任务门,中断门,陷阱门。linux稍有不同,根据intel的定义,实现了一下几类门。1 中断门用户态的进程不能访问的一个intel中断门,DPL = 0。2 系统门用户态的进程可以访问的一个intel陷阱门,DPL = 3, 通过系统门可以激活linux下的三个异常:4,5,128(即0x80)。3 系统中断门用户态的进程可以访问的一个intel中断门,DPL = 3,中断异常就属于系统中断门,int 0x03。4 陷阱门用户态的进程不能够访问的intel陷阱门,DP原创 2010-08-29 14:17:00 · 2197 阅读 · 0 评论 -
slub 分析
<br /> 从linux-2.6.23开内,SLUB取代了SLAB作为默认的内存分配机制,那么,SLUB究竟有哪些有点呢?一 SLAB被SLUB替代的原因 SLAB 分配器多年以来一直位于 Linux 内核的内存管理部分的核心地带,内核黑客们一般不愿意主动去更改它的代码,因为它实在是非常复杂,而且在大多数情况下,它的工作完成的相当不错。但是,随着大规模多处理器系统和 NUMA系统的广泛应用,SLAB 分配器逐渐暴露出自身的严重不足:较多复杂的队列管理。在 SLAB 分配器中存在众多的队列,例如针对处原创 2010-08-26 21:52:00 · 2081 阅读 · 0 评论 -
linux 启动过程临时页表到底映射了多大内存?
从linux-2.4内核开始,在建立临时页表的时候,一般的教科书都说是映射了8M的物理内存,但是为什么是映射8M呢?当时网上有资料说,8M足够了,但为什么就足够了,一直没有彻底搞清楚,今天又重新分析这部分的代码(linux-2.6.24)。 先看下面内存布局图:在建立临时页表时到底映射多大的内存取决于以下几个方面:(1)保护模式下内核的尺寸: 毫无疑问内核代码必须被映射(2)临时页表所占的空间尺寸: 假设临时页表映射整个4G的线性地址空间,那么: 页面个数 = 4G/4k = 1M个页面 每个页面对应一个页原创 2010-08-12 22:43:00 · 2334 阅读 · 1 评论 -
x86 几个特权级别(CPL,RPL,DPL)
<br />在阅读linux内核的时候,在linux内核的权限保护机制部分,经常会讨论几个特权级别:CPL,RPL,DPL。下面简单讲一下我自己的理解。背景知识:<br />1 x86体系结构的几个段寄存器:cs,ds,es,ss.fs.gs它们无论在实模式下还是保护模式下,都是16位的寄存器,只是功能不而已。实模式下: 用做段寄存器,用来将逻辑地址转换到线性地址保护模式下:段选择子,用来作为索引在GDT表或LDT表等中选择段描述符。主要内容:1 段选择子基本结构: index TI原创 2010-08-04 18:59:00 · 4088 阅读 · 0 评论 -
grub内存布局
linux启动分析 -- 从grub到linux内核原创 2010-08-04 18:58:00 · 2282 阅读 · 0 评论 -
linux 启动分析 -- 从grub到linux内核
原创 2010-08-01 23:11:00 · 1509 阅读 · 0 评论 -
KVM虚拟机和QEMU(命令行选项)
KVM安装RHEL/Fedora/CentOSyum install bridge-utils kvmbridge-utils是网卡桥接工具,示例1:Redhat系统KVM创建磁盘# qemu-img create -f qcow2 turbo-10.5.5-rc2.img 20GFormatting turbo-10.5.5-rc2.img原创 2010-03-16 15:36:00 · 33997 阅读 · 1 评论 -
lguest 三步曲之三 (源码分析)
lguest上的guest os启动的过程 根据linux启动流程的分析,在执行到jmp *0xc0100000时,系统将会根据是压缩内核还是未压缩的内核来决定跳转的方向: (1)如果是未压缩的内核,就直接跳到/kernel/head_32.S的入口开始执行 (2)如果是压缩的内核,就要先解压,整个解压的过程在/boot/compressed/head_32.S原创 2009-12-20 13:18:00 · 4779 阅读 · 2 评论 -
linux 内存管理 概括
1 名词解释: (1)页框:物理内存的描述,必须牢牢记住,页框就是物理内存(2)页描述符:描述每一个页框的状态信息,所有的也描述符都保存在mem_map[ ]数组中,每个描述符32个字节(3)节点:系统物理内存被划分为多个节点,每个节点内cpu访问页面的时间是相同的,对应的数据结构:节点描述符(4)管理区:每个节点又分为多个管理区原创 2009-12-20 13:16:00 · 1897 阅读 · 0 评论 -
Linux内核中Kprobes调试技术的实现
内核开发者一直在试图寻找一种快捷高效的内核调试手段,用于内核开发之中。高效的调试技术有利于提高内核开发效率,缩短内核开发周期。 本文研究了一种新型的内核调试技术―Kprobes, Kprobes是一个轻量级的内核调试工具,利用Kprobes技术可以在运行的内核中动态的插入探测点,在探测点处执行用户预定义的操作。本文首先根据Kprobes在Linux内核中的源码实现,针对L转载 2009-12-15 13:16:00 · 3124 阅读 · 0 评论 -
linux内核模块管理命令
1. lsmod 列出已经加载的内核模块lsmod 是列出目前系统中已加载的模块的名称及大小等;另外我们还可以查看 /proc/modules ,我们一样可以知道系统已经加载的模块。 2.modinfo 查看模块信息modinfo 可以查看模块的信息,通过查看模块信息来判定这个模块的用途。 3.modprobe 挂载新模块以及新模块相依赖的模块原创 2009-12-16 14:23:00 · 1481 阅读 · 0 评论 -
Understanding Caching(深入理解cache)
Since the earliest days of microprocessors, system designers have been plagued by a problem in which the speed of the CPUs operation exceeded the bandwidth of the memory subsystem t转载 2009-12-06 10:57:00 · 3208 阅读 · 0 评论 -
linux 内存寻址总结
1 三种不同的地址逻辑地址:每个逻辑地址由一个段和偏移量组成线性地址:是个32位的无符号数,即4G的地址空间物理地址:微处理器的引脚发送到内存总线上的电信号形成的地址,一般由32或36位的无符号数组成具体可以参见这篇文章:http://linux.chinaunix.net/bbs/thread-919019-1-1.html逻辑地址到物理地址的转换过程:逻辑地址经过内存控制单元(MMU)原创 2009-12-06 10:54:00 · 1092 阅读 · 0 评论 -
linux内核中常用的汇编
AT&T汇编语言的相关知识 在Linux源代码中,以.S为扩展名的文件是“纯”汇编语言的文件。这里,我们结合具体的例子再介绍一些AT&T汇编语言的相关知识。 1.GNU汇编程序GAS(GNU Assembly和连接程序当你编写了一个程序后,就需要对其进行汇编(assembly)和连接。在原创 2009-11-29 22:08:00 · 1514 阅读 · 0 评论 -
grub-0.97源码分析(1)
#include #define ABS(x) (x-_start+0x7c00) //计算物理地址,不依赖编译器 /* Print message string */#define MSG(x) movw $ABS(x), %si; call message /* XXX: binutils-2.9.1.0.x doesnt produce a原创 2009-11-29 22:09:00 · 2518 阅读 · 0 评论 -
linux2.6.x的配置文件kconfig语法
在配置数据库的配置选项是以树的形式组织的: +- Code maturity level options | +- Prompt for development and/or incomplete code/drivers +- General setup | +- Networking support | +- System V IPC |原创 2009-11-29 22:06:00 · 1164 阅读 · 0 评论 -
Linux 多核下绑定硬件中断到不同 CPU(IRQ Affinity)
<br /><br />硬件中断发生频繁,是件很消耗 CPU 资源的事情,在多核 CPU 条件下如果有办法把大量硬件中断分配给不同的 CPU (core) 处理显然能很好的平衡性能。现在的服务器上动不动就是多 CPU 多核、多网卡、多硬盘,如果能让网卡中断独占1个 CPU (core)、磁盘 IO 中断独占1个 CPU 的话将会大大减轻单一 CPU 的负担、提高整体处理效率。VPSee 前天收到一位网友的邮件提到了 SMP IRQ Affinity,引发了今天的话题:D,以下操作在 SUN FIre X21转载 2010-11-27 09:53:00 · 3335 阅读 · 3 评论 -
Linux内核网络系统结构图(TCP/IP)和源代码的布局
<br /><br />上面的代码在内核中经常使用到,其中“__attribute__”、“__section__”等就是GCC编译器的关键字。 上面这段程序提供了一种初始化模块的方法:<br />1、如果一个内核模块需要在系统启动的时候初始化,只需在模块的源程序中调用“module_init( function )”这样的代码,GCC编译器在编译代码时,就会将这个函数的指针放到一个特定的代码段中(“.initcall.init”代码段);<br />2、Linux启动时,在生成第一个内核线程后,转载 2010-12-01 17:12:00 · 3259 阅读 · 0 评论 -
等待队列的原理与源码分析
等待队列(wait queue)用于使进程带等待某一特定的事件发生,而无需频繁的轮询操作,进程在等待时间内睡眠,在等待的事件发生时由内核自动唤醒。 一、 等待队列相关数据结构 每一个等待队列都由两部分组成:等待队列头(struct wait_queue_head_t)和等待队列成员(struct wait_queue)。struct __wait_queue_head {<br /> spinlock_t lock; /*因为等待队列可以在中断时随时修改,因此设置一个自旋锁原创 2011-04-29 09:55:00 · 3058 阅读 · 0 评论 -
kthread_create和kernel_thread的区别和总结
在看linux驱动代码的时候,经常惠会碰到kthread_create这个函数,google一下,发现很多人在讲二者的区别,但是都在讲源码的区别而已,总结不够,感觉没有说出二者之间的本质区别,自己总结下。 一. 源码分析(linux-2.6.39)1. kthread_create源码分析#define kthread_create(threadfn, data,原创 2011-06-15 16:14:00 · 7983 阅读 · 0 评论 -
tasklet原理和源码分析
<br /> 在文章《softirq原理和源码分析》中对中断的下半部机制softirq进行了简单分析,在Linux内核中比较有名的中断下半部机制还有tasklet和workqueue等,本文重点围绕tasklet的原理和源码进行了详细的分析。 一 tasklet基本概念 tasklet是建立在softirq基础上的一种中断的下半部机制,在本质上与softirq基本相同,但却有简单的编程接口和宽松的锁规则。 tasklet是通过两种softirq来实现的,即HI_SOFTIRQ和TASKLET_S原创 2011-04-24 15:50:00 · 3285 阅读 · 2 评论 -
Linux网络驱动源码分析(一)
<br /> 网络驱动是一种典型的PCI设备驱动,无论在嵌入式平台还是在PC领域,网络相关的项目开发有着比较广阔的前景,因此,分析当前Linux内核中网络设备的驱动,不但能了解网络相关的基本原理,而且可以借鉴Linux内核的先进的技术,将其应用到嵌入式或其他领域。本文以Linux内核中的rtl8139网络驱动为例,对网络驱动的源码进行了简单分析,并对其中涉及的相关概念和技术进行了简单的介绍。<br />一、PCI设备驱动模型<br /> rtl8139是典型的PCI设备,Linux内核的PCI原创 2011-04-17 16:17:00 · 7216 阅读 · 0 评论 -
softirq原理以及源码分析
<br /> Linux 的softirq机制是与SMP紧密不可分的。为此,整个softirq机制的设计与实现中自始自终都贯彻了一个思想:“谁触发,谁执行”(Who marks,Who runs),也即触发软中断的那个CPU负责执行它所触发的软中断,而且每个CPU都由它自己的软中断触发与控制机制。这个设计思想也使得softirq 机制充分利用了SMP系统的性能和特点。 多个softirq可以并行执行,甚至同一个softirq可以在多个processor上同时执行。 一、softirq的实现 每个s原创 2011-04-19 17:06:00 · 7074 阅读 · 3 评论 -
Linux网络驱动源码分析(二)
上次讲到如何从pci核心驱动一步一步的进入了rtl8139网络驱动,并且调用的第一个函数是驱动的probe函数,即rtl8139_init_one,本文就从这里入手,简单的介绍rtl8139网络驱动的相关原理和源码分析。1 rtl8139_init_one 上文讲到当实现了驱动和设备的匹配后,需要设备和驱动做一些相应的工作,如正常使用前的初始化操作等,rtl8139_init_one就实现了一些初始化操作,原则上probe函数应该尽可能的短,尽量避免执行耗时的操作。rtl8139_原创 2011-04-17 20:27:00 · 7993 阅读 · 1 评论 -
Linux热插拔处理机制
一、 udev在2.6内核里,使用了udev来取代hotplug。据udev的作者Greg K.H说,之所以废弃了hotplug原因是sysfs的出现,这个东西会产生非常多的hotplug事件,远远超过了2.4的内核(只要实现了了kobject模型的设备驱动都回产生该事件)。所以hotplug变得复杂,而且因为hotplug都是bash所写,所以开始变得没有效率。于是出现了一个名叫hotplug-ng的项目,就是为了解决这个过于复杂以及缺乏效率的问题,ng应该是next generation的意思。但这个项原创 2011-04-08 16:01:00 · 2702 阅读 · 0 评论 -
usb驱动程序分析
<br />usb驱动是linux内核中比较复杂的驱动之一,因此,大多数usb教程建议从usb-skeleton开始学习usb驱动。个人认为这是相当正确的,usb-sekelton提供了一个usb驱动开发的模板,而且代码量较少,很适合初学者的学习。 记住,对于c语言的程序设计说,数据结构是整个程序的灵魂。因此,分析别人编写的代码的简洁的入口点就是高清代码中主要数据结构之间的关系。分析以usb-skeleton为例的完整的usb驱动框架,我们就从主要的几个数据结构入手。 一、usb驱动框架的主要数据结构原创 2011-03-30 19:47:00 · 6361 阅读 · 1 评论 -
Request_irq和setup_irq的区别
<br /><br />Linux 内核提供了两个注册中断处理函数的接口:setup_irq和request_irq。这两个函数都定义在kernel/irq/manage.c里。<br /> <br /><br />/*<br /> * Internal function to register an irqaction - typically used to<br /> * allocate special interrupts that are part of the architecture.原创 2011-02-28 14:20:00 · 2735 阅读 · 0 评论 -
Linux中的工作队列
<br /><br />工作队列(work queue)是Linux kernel中将工作推后执行的一种机制。这种机制和BH或Tasklets不同之处在于工作队列是把推后的工作交由一个内核线程去执行,因此工作队列的优势就在于它允许重新调度甚至睡眠。<br />工作队列是2.6内核开始引入的机制,在2.6.20之后,工作队列的数据结构发生了一些变化,因此本文分成两个部分对2.6.20之前和之后的版本分别做介绍。<br /><br />I、2.6.0~2.6.19<br />数据结构:view sourcepr原创 2011-02-28 13:49:00 · 1274 阅读 · 0 评论 -
内核定时器 timer_list 分析
<br />struct timer_list<br />|-----------------------------------|<br />|struct list_head entry |<br />|unsigned long expires |<br />|void (*function)(unsigned long)|<br />|unsigned long data |<br />|struct tvec转载 2011-01-09 13:11:00 · 2106 阅读 · 0 评论 -
网络性能优化(NAPI)
<br /><br />发送路径上的优化<br />TSO (TCP Segmentation Offload)<br /> TSO (TCP Segmentation Offload) 是一种利用网卡分割大数据包,减小 CPU 负荷的一种技术,也被叫做 LSO (Large segment offload) ,如果数据包的类型只能是 TCP,则被称之为 TSO,如果硬件支持 TSO 功能的话,也需要同时支持硬件的 TCP 校验计算和分散 - 聚集 (Scatter Gather) 功能。<br />原创 2011-01-04 20:33:00 · 5932 阅读 · 0 评论 -
NAPI机制分析
<br /><br />NAPI 的核心在于:在一个繁忙网络,每次有网络数据包到达时,不需要都引发中断,因为高频率的中断可能会影响系统的整体效率,假象一个场景,我们此时使用标准的 100M 网卡,可能实际达到的接收速率为 80MBits/s,而此时数据包平均长度为 1500Bytes,则每秒产生的中断数目为:<br />80M bits/s / (8 Bits/Byte * 1500 Byte) = 6667 个中断 /s<br /> 每秒 6667 个中断,对于系统是个很大的压力,此时其实可以转为使用轮转载 2011-01-04 20:32:00 · 13531 阅读 · 1 评论 -
linux内核调试: qemu + eclipse 组合
<br />一 linux内核源码阅读工具<br /> windows下当然首选source insight, 但是linux下就没有source insight这么优秀的工具了,但是也有不少的替代品,但觉绝对部分人会选择vim+ctags+cscope的组合,还有部分人或选择wine中的source insight或选择navigatror,当然对于代码阅读来说vim+ctags+cscope的组合还是比较好的一个选择方案,但是,当我使用了eclipse之后,个人感觉用eclipse作为linu原创 2010-11-06 11:11:00 · 12252 阅读 · 3 评论 -
initrd镜像文件的作用
<br />1、什么是initrdinitrd 的英文含义是 boot loader initialized RAM disk,即由引导程序初始化的RAM磁盘。initrd是在实际根文件系统可用之前挂载到系统中的一个初始根文件系统。initrd与内核绑定在一起, 并作为内核引导过程的一部分进行加载。内核然后会将这个initrd文件作为其阶段引导过程的一部分来加载模块,这样才能在以后的引导过程中使用真正的文 件系统,并挂载实际的根文件系统。根文件系统可以存储在包括IDE、SCSI、USB在内的多种转载 2010-11-06 11:13:00 · 6100 阅读 · 0 评论 -
Udev 内核机制(kobject_uevent) 性能优化
<br />前言<br />这两天遇到一些 udev 的问题, 顺便阅读了一下文档(见参考文档), 基本了解了 udev 的机制。 嵌入式系统性能很重要,于是对内核这一块进行了性能方面的研究。<br />内核大概20多处会调用了 kobject_uevent 函数发送 KOBJ_ADD / KOBJ_REMOVE 等事件。其中我们最关心的就是在device_add/device_del 中向用户空间发送设备的添加、删除信息。<br />kobject_uevent 直接调用 kobject_uevent_e转载 2010-12-02 15:26:00 · 1963 阅读 · 0 评论 -
error while loading shared libraries: libgnutls.so
在安装一些软件或执行某些命令时,如qemu-system-ppc等时,可能会出现/usr/local/bin/liferea-bin: error while loading shared libraries: libgnutls.so.13: cannot open shared object file: No such file or directory出现这个错误的原因是.自ub原创 2009-09-05 21:34:00 · 6499 阅读 · 0 评论 -
X86-64上的Linux VM管理系统
1 前言X86 指令集是IT业内久经考验并获得最广泛支持的指令集。但传统的32位x86系列产品限制了可用的物理内存总量以及单个进程的地址空间,虽然可用 PAE(page address extension)机制进行扩展,但这只是一种补救措施,并不是一个完美的方案。AMD率先推出的64位x86处理器系列可以支持需要占用较大物理及虚拟存储地址的应用方案,如高性能服务器、数据库管理系统及计算机辅转载 2009-07-04 14:37:00 · 1714 阅读 · 0 评论 -
linux 中断 异常详细分析 --- 基于linux 2.6.28
v一 基础背景知识1 中断(广义)会改变处理器执行指令的顺序,通常与CPU芯片内部或外部硬件电路产生的电信号相对应 Ø中断——异步的:由硬件随机产生,在程序执行的任何时候可能出现 Ø异常——同步的:在(特殊的或出错的)指令执行时由CPU控制单元产生 我们用“中断信号”来通称这两种类型的中断2 中断上下文不同于进程上下文 Ø中断或异常处理程序执行的代原创 2009-04-15 12:42:00 · 2603 阅读 · 0 评论 -
swtich_to宏分析 ------ 内联汇编翻译成标准汇编
内敛汇编版本的switch_to#define switch_to(prev, next, last) /do { / /* / * Context-switching clobbers(彻底击败) all registers, so we clobber / * them explicitly, via unused output variables原创 2009-04-11 12:52:00 · 1837 阅读 · 1 评论 -
A20 - a pain from the past
Everybody hates the CapsLock key, but keyboard manufacturers continue producing keyboards with CapsLock - it could be that someone wants it. With A20 it is similar but worse. Really nobody wants it,转载 2009-03-28 13:24:00 · 1666 阅读 · 0 评论