摘要:转自:http://blog.sina.com.cn/s/blog_a31ff26901013n07.html一、概述1. Netfilter/IPTables框架简介 Netfilter/IPTables是继2.0.x的IPfwadm、2.2.x的IPchains之后,新一代的L...
阅读全文
随笔分类 - linux 内核学习
摘要:http://www.bitscn.com/os/linux/200904/158771.html安全 Linux 容器实现指南 轻量级容器 又称作 Virtual Private Servers (VPS) 或 Jails,它们是经常用于限制不可信应用程序或用户的工具。但是最近构造的轻量级容...
阅读全文
摘要:引子在编译2.6内核的时候,你会在编译选项中看到[*] Enable futex support这一项,上网查,有的资料会告诉你"不选这个内核不一定能正确的运行使用glibc的程序",那futex是什么?和glibc又有什么关系呢?1. 什么是FutexFutex 是Fast Userspace muTexes的缩写,由Hubertus Franke, Matthew Kirkwood, Ingo Molnar and Rusty Russell共同设计完成。几位都是linux领域的专家,其中可能Ingo Molnar大家更熟悉一些,毕竟是O(1)调度器和CFS的实现者。F
阅读全文
摘要:http://blog.chinaunix.net/uid-7530389-id-2050116.html由于各种的I/O负载情形各异,Linux系统中文件系统的缺省配置一般来说都比较中庸,强调普遍适用性。然而在特定应用下,这种配置往往在I/O性能方面不能达到最优。因此,如果应用对I/O性能要求较高,除了采用性能更高的硬件(如磁盘、HBA卡、CPU、MEM等)外,我们还可以通过对文件系统进行性能调优,来获得更高的I/O性能提升。总的来说,主要可以从三个方面来做工作:1、Disk相关参数调优2、文件系统本身参数调优3、文件系统挂载(mount)参数调优当然,负载情况不同,需要结合理论分析与充分的
阅读全文
摘要:from:https://www.ibm.com/developerworks/cn/linux/l-k26initrd/简介:Linux 的 initrd 技术是一个非常普遍使用的机制,linux2.6 内核的 initrd 的文件格式由原来的文件系统镜像文件转变成了 cpio 格式,变化不仅反映在文件格式上, linux 内核对这两种格式的 initrd 的处理有着截然的不同。本文首先介绍了什么是 initrd 技术,然后分别介绍了 Linux2.4 内核和 2.6 内核的 initrd 的处理流程。最后通过对 Linux2.6 内核的 initrd 处理部分代码的分析,使读者可以对 in
阅读全文
摘要:一、 前言Linux加密框架是内核安全子系统的重要组成部份,同时,它又一个的独立子系统形式出现,从它出现在内核根目录下的crypto/就可以看出其地位了。Crypto实现较为复杂,其主要体现在其OOP的设计思路和高度的对像抽像与封装模型,作者展现了其出色的架构设计水准和面向对像的抽像能力。本文力图从加密框架的重要应用,即IPSec(xfrm)的两个重要协议AH和ESP对加密框架的使用,展现其设计与实现。内核版本:2.6.31.13二、 算法模版1. 模版的基本概念算法模版是加密框架的第一个重要概念。内核中有很多算法是动态生成的,例如cbc(des)算法。内核并不存在这样的算法...
阅读全文
摘要:自:http://blog.csdn.net/eroswang/article/details/4131034可以将linux看作一个用来管理资源的程序,而其他应用程序跑在其上,linux管理应用程序的内存分配,回收,等等。为了管理,它首先需要给自己分配静态的内存空间:代码段空间,mem_map[]空间等等。然后它把剩余的其他RAM用buddy系统进行动态管理。linux内核的pagetable swapper_pg_dir将虚拟地址0xC0000000~0xC0000000+896M映射到物理地址0x0~0x896M。除去内核代码占用的ram外,其余的物理ram都为空闲。当内核需要时,直接分
阅读全文
摘要:转自:http://hi.baidu.com/yangyingchao/blog/item/af66b9d4e522940ca18bb705.html1 相关数据结构struct thread_info { struct task_struct *task; /* main task structure */ struct exec_domain *exec_domain; /* execution domain */ __u32 flags; /* low level flags */ __u32 s...
阅读全文
摘要:转自:http://www.linuxidc.com/Linux/2011-10/44623.htm前言之前读了关于顺序一致性和缓存一致性讨论的文章,感觉豁然开朗。对linux内核中出现的种种同步和屏障,想做一点总结。缓存一致性之前一直认为linux中很多东西是用来保证缓存一致性的,其实不是。缓存一致性绝大部分是靠硬件机制实现的,只有在带lock前缀的指令执行时才与cache有一点关系。(这话说得绝对,但我目前看来就是这样)我们更多的时候是为了保证顺序一致性。-所谓缓存一致性,就是在多处理器系统中,每个cpu都有自己的L1 cache。很可能两个不同cpu的L1 cache中缓存的是同一片内存
阅读全文
摘要:作者:刘洪涛,华清远见嵌入式学院金牌讲师,ARM ATC授权培训讲师。看了一些网络上关于linux中断实现的文章,感觉有一些写的非常好,在这里首先感谢他们的无私付出,然后也想再补充自己对一些问题的理解。先从函数注册引出问题吧。一、中断注册方法在linux内核中用于申请中断的函数是request_irq(),函数原型在Kernel/irq/manage.c中定义:int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id)irq
阅读全文
摘要:转自:http://blog.chinaunix.net/u1/49093/showart_1910189.html这个问题有很多人问过,我看了下Linux得内核代码,原因如下:(当然我不能保证一定对,如果有牛人理解得更好,欢迎指正)1、 中断处理的时候,不应该发生进程切换,因为在中断context中,唯一能打断当前中断handler的只有更高优先级的中断,它不会被进程打断,如果在 中断context中休眠,则没有办法唤醒它,因为所有的wake_up_xxx都是针对某个进程而言的,而在中断context中,没有进程的概念,没 有一个task_struct(这点对于softirq和tasklet
阅读全文
摘要:在编写设备驱动程序的时候,如果要想把设备内存映射到用户空间,那需要我们实现mmap,通过看ldd3上面的介绍,对实现mmap有了一点了解.书上介绍主要是利用int remap_pfn_range(struct vm_area_struct *vma, unsigned long virt_addr,unsigned long pfn, unsigned long size,pgprot_t prot) 函数或者int io_remap_page_range(struct vm_area_struct *vma, unsigned long virt_addr, unsigned long ph
阅读全文
摘要:内核的dma一般在平台初始化的时候已经分配好了。但是对于一些有内部dma的硬件ip,比如usb ip、video加速ip,他们可能由ip厂商封装好的,没办法绑定到cpu端,这时候在内核使用dma就要注意了,因为dma只认识物理地址哦。当然,办法还是有的,look:以下来自:http://blog.csdn.net/zjujoe/archive/2009/05/15/4189612.aspx这两天在做 DMA 相关开发, 遇到一对分配 dma buffer 的函数,dma_alloc_coherent 与 dma_alloc_writecombine。 不知其区别。 google 一下也没有得到
阅读全文
摘要:GNU C的一大特色(却不被初学者所知)就是__attribute__机制。__attribute__是用来设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。__attribute__书写特征是:__attribute__前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的__attribute__参数。__attribute__语法格式为:__attribute__ ((attribute-list))其位置约束为:放于声明的尾部“;”之前。1 设置函数属性(Function Attri
阅读全文
摘要:所有的内核代码,基本都包含了include/linux/compile.h这个文件,所以它是基础,涵盖了分析内核所需要的一些列编译知识,本博就分析分析这个文件里的代码:#ifndef __LINUX_COMPILER_H#define __LINUX_COMPILER_H#ifndef __ASSEMBLY__首先印入眼帘的是对__ASSEMBLY__这个宏的判断,这个变量实际是在编译汇编代码的时候,由编译器使用-D这样的参数加进去的,gcc会把这个宏定义为1。用在这里,是因为汇编代码里,不会用到类似于__user这样的属性(关于 __user这样的属性是怎么回子事,本博后面会提到),因为这样
阅读全文
摘要:workqueue,中文称其为工作队列,是一个用于创建内核线程的接口,通过它创建的内核线程来执行内核其他模块排列到队列里的工作,创建的内核线程被称为工作者线程。要理解工作队列的实现,重点在于理解相关的三个数据结构的含义及关系。1 表示工作队列类型的数据结构:struct workqueue_struct/** The externally visible workqueue abstraction is an array of* per-CPU workqueues:*/struct workqueue_struct {struct cpu_workqueue_struct *cpu_wq;
阅读全文
摘要:MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱 动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。MTD的所有源代码在/drivers/mtd子目录下。我将CFI接口的MTD设备分为四层 (从设备节点直到底层硬件驱动),这四层从上到下依次是:设备节点、MTD设备层、MTD原始设备层和硬件驱动层。 一、Flash硬件驱动层:硬件驱动层负责在init时驱动Flash硬件,Linux MTD设备的NOR Flash芯片驱动遵循CFI接口标准,其驱动程..
阅读全文
摘要:转自:blog.163.com/cupidove/blog/static/1005662Linux 内核提供了两个注册中断处理函数的接口:setup_irq和request_irq。这两个函数都定义在kernel/irq/manage.c里。这两个函数有什么样的区别呢?先看看setup_irqSetup_irq通常用在系统时钟(GP Timer)驱动里,注册系统时钟驱动的中断处理函数。下面举个列子, 如s3c2410 timer驱动:/* arch/arm/mach-s3c2410/time.c */static struct irqaction s3c2410_timer_irq = { .
阅读全文
摘要:系统初始化时kernel_init在内核态创建和运行应用程序以完成系统初始化. 内核刚刚启动时,只有内核态的代码,后来在init过程中,在内核态运行了一些初始化系统的程序,才产生了工作在用户空间的进程。/* This is a non __init function. Force it to be noinline otherwise gcc 736 * makes it inline to init() and it becomes part of init.text section 737 */ 738static noinline int init_post(void) 739{ 740
阅读全文
摘要:unsigned long hash_long(unsigned long val, unsigned int bits) { unsigned long hash=val *0x9e370001UL; return hash>>(32-bits); } 0x9e370001=2 654 404 609=2^31+2^29-2^25+2^22-2^19-2^16+1. 是接近黄金比例的2^32的一个素数。(也称为 “魔数常量”)也许你会想常量0x9e370001(=2654 404 609)究竟是怎么得出来的。这种散列函数是基于表索引乘于一个适当的大数,于是结果溢出,就把留在32位
阅读全文