linux kernel analysis
文章平均质量分 89
thewayma
这个作者很懒,什么都没留下…
展开
-
I2C总线协议学习笔记
1.I2C协议 2条双向串行线,一条数据线SDA,一条时钟线SCL。 SDA传输数据是大端传输,每次传输8bit,即一字节。 支持多主控(multimastering),任何时间点只能有一个主控。 总线上每个设备都有自己的一个addr,共7个bit,广播地址全0. 系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯片而定,看datasheet。1.1 I2C位传输 数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit; 若SDA发生转载 2011-05-23 09:52:00 · 922 阅读 · 0 评论 -
Linux slab 分配器剖析
良好的操作系统性能部分依赖于操作系统有效管理资源的能力。在过去,堆内存管理器是实际的规范,但是其性能会受到内存碎片和内存回收需求的影响。现在,Linux® 内核使用了源自于 Solaris的一种方法,但是这种方法在嵌入式系统中已经使用了很长时间了,它是将内存作为对象按照大小进行分配。本文将探索 slab分配器背后所采用的思想,并介绍这种方法提供的接口和用法。动态内存管理转载 2009-10-01 22:05:00 · 563 阅读 · 0 评论 -
linux2.6.29 启动过程详细分析
突然心血来潮,想自己写个模块,于是就把linux2.6.29的启动过程有分析了一下,整理出来和大家分享下。linux的启动大体上可以分几个步骤:第一部分 grub部分,内核的加载过程。这里总结一下别人的思想,因为自己没怎么看过grub的源码。1. Bios执行int 0x19,加载MBR至0x7c00并跳转执行,这个MBR在我们通常的系统中就是stage1.S(512B),转载 2009-09-25 20:08:00 · 771 阅读 · 0 评论 -
剖析Linux系统启动过程
容提要 本文以RedHat9.0和i386平台为例,剖析了从用户打开电源直到屏幕出现命令行提示符的整个Linux启动过程。并且介绍了启动中涉及到的各种文件。 阅读Linux源代码,无疑是深入学习Linux的最好方法。在本文对Linux启动过程的介绍中,我们也尝试从源代码的视角来更深入的剖析Linux的启动过程,所以其中也简单涉及到部分相关的Linux源代码,Linux启动这部分转载 2009-09-25 20:05:00 · 484 阅读 · 0 评论 -
深入理解linux启动过程
inux系统的启动过程是由很多步骤组成的,但是,无论你是启动一个标准的x86桌面计算机,还是一个嵌入式PowerPC的目标板,大多数的流程是惊人得相似的。这篇文章,探索了linux从最初的启动准备到用户空间中某个程序被开启之间的启动过程,跟随这个流程,你还能学到其他许多与启动有关的知识,例如,bootloaders,内核解压缩,初始化内存盘,以及其他一些linux启动的部分。在很早转载 2009-09-25 20:05:00 · 847 阅读 · 1 评论 -
GRUB 启动窥探
理解Linux的启动过程,对于解决Linux系统启动问题还是非常有帮助的,知道Linux系统在每个阶段做了哪些事,将会帮助你更快的找到问题出处,并解决这些问题。提示:在进行重要文件编辑之前,最好是先对文件进行备份。 首先,我们来看机器启动的第一步–自检(Power-On Self Test)在启动过程中的第一步,就是自检,自检是由电脑的BIOS(基本输入转载 2009-09-25 20:03:00 · 618 阅读 · 0 评论 -
[RedHat] (原创)Linux 操作系统启动流程以及trouble shooting思路
Linux系统启动的基本过程和步骤:最近在某个版块看到有人讨论GRUB的问题,这里是我个人的一些理解。我想大部分还是正确的,但肯定也有理解错误的地方,在这里抛砖引玉了!Linux系统启动过程大致按照如下步骤进行(这是一个简述):第一阶段:BIOS启动引导阶段; 在该过程中实现硬件的初始化以及查找启动介质;转载 2009-09-25 20:02:00 · 561 阅读 · 0 评论 -
Hacking initrd.img - 添加网卡驱动,网络安装 Linux
本文通过将网卡驱动加入到 initrd.img 中,使 Linux 内核在启动的过程中能正确识别并加载网卡驱动,从而使网络安装得以进行。 前言 网络安装 Linux 并不是一个新鲜的话题,其过程也不是一个轻松的体验。为了让机器能通过网络来安装 Linux,如果还需要配合kickstart转载 2009-09-24 13:30:00 · 2701 阅读 · 0 评论 -
Linux 初始 RAM 磁盘(initrd)概述 学习 initrd 的剖析、创建以及在 Linux 引导过程中的用法
什么是初始 RAM 磁盘?初始 RAM 磁盘(initrd)是在实际根文件系统可用之前挂载到系统中的一个初始根文件系统。initrd与内核绑定在一起,并作为内核引导过程的一部分进行加载。内核然后会将这个 initrd文件作为其两阶段引导过程的一部分来加载模块,这样才能稍后使用真正的文件系统,并挂载实际的根文件系统。initrd 中包含了实现这个目标所需要的目录和可执行程转载 2009-09-24 10:53:00 · 873 阅读 · 0 评论 -
Grub for dos bootloader 分析
概述一下:Grubfordos0.4.4的主题为三部分:MBR,bootloader,kernel1:MBR对应的文件为stage1目录下的stage1.S .S后缀为GAS汇编源文件Stage1:大小512字节,编译后的结构为DBR结构,这样的优点是,无论你将GRUB安装在MBR还是分区的DBR中,都能正常引导,如果安装在硬盘的MBR中,那么bios的int19号中断会MBR中转载 2009-09-28 22:32:00 · 1109 阅读 · 0 评论 -
Linux内核代码分析 slab.c
slab.c来自linux内核2.4.22版,本文件按照GNU协议发布。一、准备知识:slab的概念:提出的原因:由于操作系统在运行中会不断产生、使用、释放大量重复的对象,所以对这样的重复对象的生成进行改进可以大大提高效率 解决buddy system造成的内存浪费问题最早由sun的工程师提出(1994转载 2009-10-01 22:18:00 · 1296 阅读 · 0 评论 -
linux2.6 的 slab alloctor 结构分析
To solve the external fragementation, Linux just implemneted the Buddy Algorithm Allocator.But what if we want to allocate the small or tiny memory(file descriptor, struct inode, struct task_sturct,转载 2009-10-03 17:50:00 · 886 阅读 · 0 评论 -
linux内核内存管理的伙伴算法
1. Linux 内核对各个zone都有一个buddy system.2. 数据结构:mem_map:一个Struct page数组,对应系统中所有的物理内存页。而每一个zone结构里都有一个zone_mem_map域指向这个zone的第一个page 在mem_m转载 2009-10-01 19:14:00 · 2201 阅读 · 0 评论 -
I2C总线协议学习笔记
1.I2C协议 2条双向串行线,一条数据线SDA,一条时钟线SCL。 SDA传输数据是大端传输,每次传输8bit,即一字节。 支持多主控(multimastering),任何时间点只能有一个主控。 总线上每个设备都有自己的一个addr,共7个bit,广播地址全0. 系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯片而定,看datasheet。1.1 I2C位传输 数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit; 若SDA发生转载 2011-05-23 09:50:00 · 7413 阅读 · 2 评论 -
Linux 引导解析(使用bootsect.s+setup.s方式)
<br /><br />我详细解析了bootsect.s,同时阅读了setup.s。其中bootsect.s存放于磁盘的主引导扇区,bios-startup程序加载该程序(bootsect.s)到内存0x700处,并由此执行bootsect.s来引导Linuxkernel。在bootsect.s中加载setup.s至内存中,并在执行完它自身后,jump跳至刚刚已读入的setup部份,继续执行。 <br /> Linux Kernel Image 生成过程: 一.引导扇区汇编代码bo转载 2010-06-29 20:57:00 · 3421 阅读 · 0 评论 -
文件读写(2)
二、文件读过程我们先看标准的读过程。1、准备工作。通过VFS层,及一些初始化操作,为真正的读操作做准备。首先是用户进程通过read系统调用发出一个读请求:asmlinkage ssize_t sys_read(unsigned int fd, char __user * buf, size_t count){转载 2009-12-20 10:56:00 · 674 阅读 · 0 评论 -
2.4.18预读算法详解
琢磨ULK2时的一些个人理解。参考了WFG的这篇文章: http://os.51cto.com/art/200711/60574.htm 如果觉得有必要,以后会写写其他版本预读算法的实现分析及改进逻辑。 一 为什么需要预读 1 I/O合并 2 延迟隐藏 参见上述链接。 二 预读算法初步设计 设read系统调用的内核实现函数为do_gene转载 2009-12-18 11:01:00 · 587 阅读 · 0 评论 -
文件读写(3)
2、读入操作。完成了上面的准备工作,下一步就是执行读操作的核心函数do_generic_mapping_read,这是一个比较复杂的函数,里面有大量的goto跳转,但还是比较清晰的。 它工作过程可以描述如下:a. 如果所要读取的文件在页面缓存中,则跳转到步骤d。b. 文转载 2009-12-20 10:58:00 · 817 阅读 · 0 评论 -
文件读写(1)--页面缓冲(Page Cache)的管理
文件读写(1)--页面缓冲(Page Cache)的管理R.wen 一、本文分析文件的读写过程。当用户进程发出一个read()系统调用时,它首先通过VFS从disk cache中去查找相应的文件块有没有已经被缓存起来,如果有,则不需要再次从设备中去读,直接从CACHE中去拷贝给用户缓冲区就可以了,否则它就要先分配一个缓冲页面,转载 2009-12-20 10:55:00 · 916 阅读 · 0 评论 -
linux deadline I/O调度算法分析笔记
linux deadline I/O调度算法分析笔记deadline算法的核心就是在传统的电梯算法中加入了请求超时的机制,该机制主要体现在两点:(1)请求超时时,对超时请求的选择。(2)没有请求超时时,当扫描完电梯最后一个request后,准备返回时,对第一个request的选择。基于以上两点,平衡了系统i原创 2010-02-06 21:31:00 · 2456 阅读 · 0 评论 -
Linux Anticipatory I/O 调度算法分析笔记
Linux Anticipatory (预测)I/O 调度算法分析笔记as_add_reques是调度算法的入口。AS和Deadline比较类似,都是先把request加入sector排序的红黑树,然后再把requst加入fifo。只不过AS因为加入了预测,需要在加入requst时,调用as_update_转载 2010-02-06 21:32:00 · 1093 阅读 · 0 评论 -
剖析一个由sendfile引发的linux内核BUG
之前看了《新爆内核高危漏洞sock_sendpage的利用分析的讨论》这篇帖子,在九贱兄和诸位CUer的指引下,大致弄清了整个漏洞的始末。现与大家分享(引用自我的空间)。有什么不足之处还望多多指教~内核的BUG这个BUG首先得从sendfile系统调用说起。考虑将一个本地文件通过socket发送出去的问题。我们通常的做法是:打开文件fd和一个socket转载 2010-01-16 16:48:00 · 1054 阅读 · 1 评论 -
grub----Stage1.s源代码分析
Stage1.s源文件是用古老的at&t汇编编写而成,是大名鼎鼎的unix家族操作系统引导程序GRUB中的第一个文件。它编译后产生的二进制代码正好是512字节(故意的,也是必须的),刚好填充满硬盘初始的一个扇区,也即0柱面、0磁道、1扇区。人们称之为MBR——主引导记录。它的作用是载入stage2文件。 阅读本段代码,gemfield建议你首先具备以下能力:cpu寄存器转载 2009-09-28 22:00:00 · 3340 阅读 · 0 评论 -
Linux环境进程间通信(五): 共享内存(上)
2003 年 5 月 01 日共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。采用共享内存通信的一个显而易见的好处是效率高,因为进程转载 2009-08-20 11:08:00 · 515 阅读 · 0 评论 -
Linux I/O 模型---I/O复用:Select和Poll函数
Select和Poll函数在前一章中,我们遇到一个问题就是,客户端阻塞在了从标准输入中读取数据,与此同时,服务器由于某种原因要求关闭连接给客户端发送了一个FIN,而客户端只有从标准输入读到数据返回后才能知道连接已关闭。在这一章中介绍的I/O复用可以很好的解决这个问题。1.I/O模型a. Unix下共有五种I/O模型阻塞I/O非阻塞I/OI/O复用(sel转载 2009-07-28 14:27:00 · 3088 阅读 · 0 评论 -
linux wait queue
在Linux驱动程序中,可以使用等待队列(waitqueue)来实现阻塞进程的唤醒。waitqueue很早就作为一种基本的功能单位出现在Linux内核里了,它以队列位基础数据结构,与进程调度机制紧密结合,能够用于实现内核中异步事件通知机制。等待队列可以用来同步对系统资源的访问。(信号量在内核中也依赖等待队列来实现)。 Linux-2.6提供如下关于等待队列的操作:原创 2008-12-01 09:46:00 · 5095 阅读 · 0 评论 -
analysis of wake_up_interruptible()
#define wake_up_interruptible(x) __wake_up(x, TASK_INTERRUPTIBLE, 1, NULL)void fastcall __wake_up(wait_queue_head_t *q, unsigned int mo原创 2008-12-01 14:06:00 · 2600 阅读 · 1 评论 -
Linux内核wait_queue深入分析
前几天在看驱动的时候碰到了等待队列,上网去搜了一下,再结合代码看了一下,深有体会.在 kernel 里,wait_queue 的应用很广,举凡 device driver,semaphore 等方面都会使用到wait_queue 来 implement。所以,它算是 kernel 里蛮 基本的一个数据结构。首先,我们得明白,linux中的所有的进程都由task_struct这个结构管转载 2008-11-30 16:43:00 · 1172 阅读 · 0 评论 -
对container_of的理解
在学习Linux驱动的过程中,遇到一个很好玩的内核函数,准确的说是一个很好玩的宏,叫做container_of。该宏定义在include/linux/kernel.h中,首先来贴出它的代码:439/**440 * container_of - cast a member of a structure out to the containing structure441 * @ptr:原创 2008-11-26 15:07:00 · 1573 阅读 · 1 评论 -
深入理解Linux内存映射机制
创建时间:2008-08-31文章属性:原创文章提交:wzt (wzt_at_xsec.org)深入理解Linux内存映射机制 Author: wztEMail: wzt@xsec.orgSite: http://www.xsec.org & http://hi.baidu.com/wzt85Date: 2008-6-13 一. 绪 论二. X86的硬件寻址方法转载 2009-02-01 12:20:00 · 1373 阅读 · 0 评论 -
struct device结构体(2.6.23)
一、定义:linux/include/linux/device.h 407struct device { 408 struct klist klist_children; 409 struct klist_node knode_parent; /* node in sibling list */ 410转载 2008-11-22 13:27:00 · 683 阅读 · 0 评论 -
kobject.h源码详解(2.6.16)
1/* 2 * kobject.h - generic kernel object infrastructure. 3 * 4 * Copyright (c) 2002-2003 Patrick Mochel 5 * Copyright (c) 2002-2003 Open Source Development Labs 6 * 7 * This f原创 2008-11-22 13:24:00 · 865 阅读 · 0 评论 -
kobjects,ksets and subsystems
kobjects,ksets and subsystems(from linux device driver)内核通常用kobject 结构将各个对象连接起来组成一个分层的结构体系。 parent 是指向另外一个kobject 结构(分层结构中上一层的节点)的指针,主要用途是在 sysfs 层次中定位对象. 一个 kset 是嵌入到相同类型结构的 kobject 的集合。但 struct ko翻译 2008-11-22 13:22:00 · 950 阅读 · 0 评论 -
内核模块编译说明
一、编写hello.c文件利用vi编辑器,我们键入下面的代码,并保存为hello.c文件。/** * hello.c * ------Test for kernel module */ #i nclude #i nclude MODULE_LICENSE("MYGPL")转载 2008-11-20 11:11:00 · 4200 阅读 · 0 评论 -
Linux设备驱动编程之阻塞与非阻塞 1
阻塞操作是指,在执行设备操作时,若不能获得资源,则进程挂起直到满足可操作的条件再进行操作。非阻塞操作的进程在不能进行设备操作时,并不挂起。被挂起的进程进入sleep状态,被从调度器的运行队列移走,直到等待的条件被满足。 在Linux驱动程序中,我们可以使用等待队列(wait queue)来实现阻塞操作。waitqueue很早就作为一个基本的功能单位出现在Linux内核里了,它以队列为基础转载 2008-11-30 15:47:00 · 676 阅读 · 0 评论 -
analysis of wait_event_interruptible()
1 realted structures Linux-2.6提供如下关于等待队列的操作: (1) 定义"等待队列头", wait_queue_head_t my_queue;defined in linux/wait.h 50 struct __wait_queue_head { 51 spinlock_t lock; 52原创 2008-12-01 10:53:00 · 2727 阅读 · 2 评论 -
Linux内核的等待队列
Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在Linux2.4.21中,等待队列在源代码树include/linux/wait.h中,这是一个通过list_head连接的典型双循环链表,如下图所示。 在这个链表中,有两种数据结构:等待队列头(wait_queue_head_t)和等待队列项(wait_queue_t)转载 2008-11-30 16:39:00 · 1183 阅读 · 0 评论 -
tcp要点学习-基础概念
Author : Kevin Lynx TCP是TCP/IP协议簇中传输层上的一种网络协议,它是一种面向连接的、可靠的协议。为了提供这种可靠性,TCP实现了各种有效的机制、算法。为了从一种宏观的角度去了解这个协议,这里先大致地提一下与之相关的概念。 1. 什么是‘面向连接的’? 引用中的概念: 面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)转载 2009-07-22 15:00:00 · 623 阅读 · 0 评论 -
关于动态链接库占用内存的思考
我们在写程序时,为了方便会写很多的so文件,在主程序中调用。我们知道在调用动态链接库的时候,有两种方法,一种是在编译的时候,将动态链接库动态的编译进去;一种是在执行的时候使用dlopen的方式,调用动态连接库。那么两种会有什么区别呢? 1、在编译的时候,将动态链接库编译进去之后,在elf文件中为留下该动态链接库的依赖关系。在程序的启动的时候,linux也只是为其分配一段线性空间,但转载 2009-07-20 15:51:00 · 5950 阅读 · 0 评论 -
va_list可变参数传递
va_list(),va_start()是何意?(一)写一个简单的可变参数的C函数 下面我们来探讨如何写一个简单的可变参数的C函数.写可变参数的 C函数要在程序中用到以下这些宏: void va_start( va_list arg_ptr, prev_param ); type va_arg( va_list arg_ptr, type ); void v转载 2008-12-12 13:14:00 · 1353 阅读 · 0 评论