linux 内核
文章平均质量分 79
比不了就不比
这个作者很懒,什么都没留下…
展开
-
linux内核中的位运算
在linux内核中有很多位运算函数,如:set_bit,clear_bit,clear_bit,test_and_set_bit等等。1. set_bit [cpp] view plaincopyprint?"font-size: 16px;">static __always_inline void set_bit(unsigned int nr, volatil转载 2013-11-17 16:19:58 · 1139 阅读 · 0 评论 -
copy_to_user和copy_from_user两个函数的分析
在内核的学习中会遇到很多挺有意思的函数,而且能沿着一个函数扯出来很多个相关的函数。copy_to_user和copy_from_user就是在进行驱动相关程序设计的时候,要经常遇到的两个函数。由于用户空间与内核空间的内存不能直接互访,因此借助函数copy_to_user()完成内核空间到用户空间的复制,函数copy_from_user()完成用户空间到内核空间的复制。下面我们来仔细的理一下这两个函转载 2013-11-11 22:25:20 · 971 阅读 · 0 评论 -
块设备驱动实战基础篇一 (170行代码构建一个逻辑块设备驱动)
1 内核块设备驱动基础学习与实战1.1 设备驱动IO架构初探 操作系统是如何将数据读到缓冲区的,发生了什么?我们带着这样的问题,粗略走一下read调用系统过程,希望这个初探,可以唤起大家研究操作系统内核的好奇心和兴趣,并以此为例,让我们先初步对请求在过滤块设备驱动中的处理过程有个大概印象和了解。 块设备在整个Linux中应用的总体结构图如下: 从上图可以看出,块转载 2014-01-03 22:54:34 · 1482 阅读 · 1 评论 -
浅谈切入内核学习的方法 - 从块设备驱动入手
接着“内核修炼一”我们开始真正的内核技术实战学习,个人觉得内核学习从实战入手,直接参与内核代码开发,实战是最好的,否则会长期停留在理论学习的抽象边界上,最近也持续思考,并与北邮的部分学生进行交流,根据这么多年积累的项目经验总结了一下,我们从块设备驱动入手进行内核学习,这里我们从此会反复强调IO的概念,这也是存储技术的核心概念。 我们再看一下操作系统应用层/内核层的架构图转载 2014-01-03 22:45:58 · 867 阅读 · 0 评论 -
Linux 2.6内核软RAID
于是有了另外一种更高性能组织模式RAID-0。RAID-0就是将两块硬盘并行管理,简单的说,可能并不准确,就是将总的磁盘编址空间均匀的分布在两个盘上(也就是所谓的条纹化striping),那么如果应用程序要集中读写某个文件,由于这个文件散布在两个盘上,那么两个能同时工作以提高整体的吞吐率。 然而,RAID-0不能保证数据的可靠性,因为不管哪一块盘坏了,数据就永久丢失了。提高可靠性的最转载 2013-11-12 10:09:20 · 1955 阅读 · 0 评论 -
块设备驱动实战基础篇二 (继续完善170行过滤驱动代码至200行)
1.3块设备驱动关键数据结构及函数API详细剖析经过上节四个步骤我们已经熟悉并实战了一个最基本的过滤块设备驱动的设计技巧,我们这一节先不继续实战,我们本节把上节170行代码中接触到的块设备核心数据结构和API接口剖析一下,把这部分掌握和理解一下。 我们把上节涉及的六个数据结构和相关API接口罗列一下: 块设备核心数据结构gendisk块设备仓库转载 2014-01-06 16:24:19 · 1695 阅读 · 0 评论 -
块设备驱动实战基础篇三 (BIO请求回调机制)
1.5 块设备请求返回处理回调机制 本节我们继续完善1.4节中的代码,在上节我们完成了请求的过滤转发,那么请求被磁盘处理完成后返回回来的路径处理是怎样的,本节我们继续带着这样的问题再一次完善我们的驱动程序,通过本节的学习,我们能够真正掌握请求处理,转发过滤,请求完成后回调处理机制的完整学习。 先给出完善后的IO架构图,我们对比一下1.4节最后给出的图有何区别:相比1.4节,在f转载 2014-01-06 20:22:36 · 1141 阅读 · 0 评论 -
块设备驱动实战基础篇四 (逐渐成型,加入ioctl通信机制)
1.6介绍一种内核与用户空间通信的方法-misc设备ioctl机制块设备驱动开发中往往需要配合用户态的管理程序工具,管理我们的块设备,此时我们需要涉及用户空间程序与块设备通信的方法,ioctl机制就是接下来需要学习和实战的,通过ioctl机制,用户态负责发送各种命令给内核驱动;内核态接收用户态发送的命令,并根据命令执行相应的动作,如下图所示。 ioctl提供用户态程序使用内核态函数转载 2014-01-06 20:40:50 · 1995 阅读 · 0 评论 -
buffer_head和bio
一、page和buffer_head的关系 1、页中的块在磁盘上连续如果page中的块在磁盘上连续,那么page的PG_private不会被置位,private字段也不会指向buffer_head的链表。 但是page还是得用到buffer_head结构,因为它需要通过get_block()函数来获得磁盘上的逻辑块号。虽然ext2_getblock()函数的代码我暂时还没有转载 2014-03-10 11:31:05 · 1823 阅读 · 0 评论 -
buffer_head bio
bio是一个io的基本单位,一个bio里面包含n个bio_vec,而每个bio_vec(page,offset,len)里面包含一个segment,而每个segment里面包含连续的几个buffer。而buffer_head就是用来保存对物理内存和磁盘块之间映射关系的结构,也就是buffer_head对应于一个buffer简言之,buffer_head是用来管理buffer的,bio是用来传输转载 2014-03-10 10:15:31 · 3193 阅读 · 0 评论 -
Linux 2.6 下内核模块的Makefile
Linux 2.6 下内核模块的Makefile转载 2014-04-21 11:23:45 · 496 阅读 · 0 评论 -
Linux 开机启动过程分析
开机过程指的是从打开计算机电源直到LINUX显示用户登录画面的全过程。分析LINUX开机过程也是深入了解LINUX核心工作原理的一个很好的途径。启动第一步--加载BIOS当 你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关 信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP转载 2014-04-23 18:08:31 · 576 阅读 · 0 评论 -
linux启动程序
启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了。启动第二步--读取MBR众所周知,硬盘上第0磁道第一个扇区被称为MBR,也原创 2014-09-17 09:55:22 · 560 阅读 · 0 评论 -
关于构造IOCTL命令的学习心得-----_IO, _IOR, _IOW, _IOWR
在编写ioctl代码之前,需要选择对应不同命令的编号。为了防止对错误的设备使用正确的命令,命令号应该在系统范围内唯一,这种错误匹配并不是不会发生,程序可能发现自己正在试图对FIFO和audio等这类非串行设备输入流修改波特率,如果每一个ioctl命令都是唯一的,应用程序进行这种操作时就会得到一个EINVAL错误,而不是无意间成功地完成了意想不到的操作。 在驱动程序里, ioc转载 2013-11-11 20:26:23 · 1166 阅读 · 0 评论 -
Linux 2.6内核MD机制
那么MD要如何看起?这个问题在我脑中也没有特别清晰的脉络,因为MD中的代码很杂,并没有很清晰的层次或类别关系,所以我打算想到哪里就写到哪里。但不管怎么说先建立一个对MD的总体印象是很有帮助的。首先,创建了一个MD设备,我们可以通过mdadm –E来查看MD中各设备的情况(E -examine),或者通过mdadm –D来直接查看MD的状态(D –detail)。那么这些信息是从哪里来的呢?这就转载 2013-11-12 10:08:06 · 3416 阅读 · 1 评论 -
Linux内核简介
Linux 内核简介现在让我们从一个比较高的高度来审视一下 GNU/Linux 操作系统的体系结构。您可以从两个层次上来考虑操作系统,如图 2 所示。图 2. GNU/Linux 操作系统的基本体系结构 系统调用接口(SCI)的方法实际上,体系结构可能并不像图 2 所示的一样清晰。例如,处理系统调用(从用户空间切换到内核空间)的机转载 2013-11-06 18:47:00 · 712 阅读 · 0 评论 -
MD模块之处理读写过程分析-3
这节我们来分析神奇而又NB的handle_stripe,2.6.21版本的处理raid5和raid6分别用handle_stripe5和handle_stripe6这两个函数,我们这里主要说handle_stripe5,handle_stripe6和handle_stripe5其实差不多,只要你理解raid6的原理并理解了handle_stripe5,那么handle_stripe6自然便明白了。转载 2013-11-07 08:44:45 · 950 阅读 · 0 评论 -
MD模块之处理读写过程分析-2
这一节讲述raid5模块中处理读写流程。这个过程很复杂,最关键的函数就是handle_stripe,处理一次读或写都会多次调用这个函数才能完成。当然,这个函数也是raid5模块的一个核心函数,他还负责同步,重建,以及扩展的实现。在分析之前,我们需要准备一些预备知识:一、条带:我们知道,raid5是以条带为基本单位来存取数据的。如下图所示:raid5还有其它中数据分布方式,这里只列出一种转载 2013-11-07 08:48:45 · 1159 阅读 · 0 评论 -
MD模块之处理读写过程分析-4
MD在处理读写错误时是不一样的。写数据发生错误时处理较简单,读发生错误时会比较麻烦,它会把读不出来的数据通过计算出来,然后在重新写回磁盘上。首先先看看如何处理写错误的。1、写数据时发生错误 如果写发生错误,那么回调函数raid5_end_write_request()中bio的BIO_UPTODATE位无效,调用md_error函数将相应的rdev置为Faulty,清除掉In_sy转载 2013-11-07 08:49:38 · 840 阅读 · 0 评论 -
vmlinux的构建过程
3.2.3 vmlinux的构建过程(1)所有的体系结构都需要构建vmlinux,所以vmlinux的构建规则在顶层的Makefile中。linux-3.7.4/Makefile: cmd_link-vmlinux = $(CONFIG_SHELL) $ $(LD) $(LDFLAGS) \ $(LDFLAGS_vmlinux) vmlin转载 2013-11-07 09:05:09 · 1805 阅读 · 0 评论 -
MD模块之处理读写过程分析-1
md可以说是一个虚拟的设备驱动层,它属于块设备驱动,拥有块设备驱动的特点。所以,他实现了块设备操作接口 [c-sharp] view plaincopystatic struct block_device_operations md_fops = { .owner = THIS_MODULE, .open = md_ope转载 2013-11-07 08:47:17 · 1355 阅读 · 0 评论 -
linux内核学习笔记之——list_for_each_entry
在Linux内核源码中,经常要对链表进行操作,其中一个很重要的宏是list_for_each_entry:意思大体如下:假设只有两个结点,则第一个member代表head,list_for_each_entry的作用就是循环遍历每一个pos中的member子项。图1:pos:转载 2013-11-09 15:16:26 · 807 阅读 · 0 评论 -
请求队列
------------------------------------------一:前言文件的读写是文件系统中最核心也是最复杂的一部份,它牵涉到了很多的概念.之前分析文件系统其它操作的时候,遇到与文件系统相关的读写部份都忽略过去了.在这一节里,来讨论一下文件的读写是怎样实现的.二:I/O请求的概述如之前所提到的,为了提高文件的操作效率,文件系统中的内容都是缓存在内存里的.每当发转载 2013-11-10 19:22:04 · 2748 阅读 · 0 评论 -
Linux文件系统之文件的读写
一:前言文件的读写是文件系统中最核心也是最复杂的一部份,它牵涉到了很多的概念.之前分析文件系统其它操作的时候,遇到与文件系统相关的读写部份都忽略过去了.在这一节里,来讨论一下文件的读写是怎样实现的.二:I/O请求的概述如之前所提到的,为了提高文件的操作效率,文件系统中的内容都是缓存在内存里的.每当发起一个Rear/Write请求的时候,都会到页面高速缓存中寻找具体的页面.如果页面不存在转载 2013-11-10 19:16:09 · 3051 阅读 · 0 评论 -
Linux内核container_of详解(图解)
在开发Linux驱动的时候,经常会用到container_of这个宏:include/linux/kernel.h~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/** * container_of - 通过结构体的一个成员获取容器结构体的指针 * @ptr: 指向成员的指针。 * @type: 成员所嵌入的容器结构体类转载 2013-11-11 13:22:08 · 1762 阅读 · 0 评论 -
linux idr机制
idr在linux内核中指的就是整数ID管理机制,从本质上来说,这就是一种将整数ID号和特定指针关联在一起的机制。这个机制最早是在2003年2月加入内核的,当时是作为POSIX定时器的一个补丁。现在,在内核的很多地方都可以找到idr的身影。idr机制适用在那些需要把某个整数和特定指针关联在一起的地方。举个例子,在I2C总线中,每个设备都有自己的地址,要想在总线上找到特定的设备,就必须要先发送该转载 2013-11-11 13:40:48 · 777 阅读 · 0 评论 -
详解Linux内核之双向循环链表
本文详解了内核中面向对象的list结构的原理,以及如何以list为内嵌对象来构造自己的链表结构,如何从内嵌list对象获得自定义的对象指针;探讨了各种宏或者函数的详细使用方法及怎样以通用list结构来操作自定义对象。【关键字】双向循环链表,list,list_entry,typeof,containerof,list_for_each, list_for_each_entry转载 2013-11-12 09:27:16 · 1249 阅读 · 0 评论 -
编译内核
环境: Host机:CentOS 6.4 虚拟机:VMware 9.0版本 调试内核版本:linux 2.6.34原创 2014-04-10 17:40:06 · 1399 阅读 · 0 评论