
kernel
文章平均质量分 79
请叫我四哥
人生会碰到好多事,好事,坏事.
展开
-
linux内核源码源码分析之zImage的出生实录
此文为两年前为好友刘庆敏的书《嵌入式Linux开发详解--基于AT91RM9200和Linux 2.6》中帮忙写的章节的重新整理。如有雷同,纯属必然。经作者同意,将我写的部分重新整理后放入blog中。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~转载 2013-03-26 14:03:44 · 1194 阅读 · 0 评论 -
LINUX内核设计思想之进程调度
调度程序,负责选择下一个要运行的进程.在单处理器上,LINUX系统也许有100多个进程在内存里面,但是只有一个处于可运行状态.调度程序选择下一个要运行的进程的依据是什么呢? 4.1 策略这里所谓的策略,是指决定调度程序何时让什么进程运行.调度程序的执行意味着要从等待执行的进程队列里面选出一个合适的进程来运行.有这样一个情景:有这样一个系统,它拥有两个运行中的进程:一个文字编辑程原创 2013-11-07 10:56:12 · 934 阅读 · 0 评论 -
LINUX内核设计思想之定时器和时间管理
内核中有大量函数都是基于时间驱动的.例如,屏幕刷新.10.1 内核中的时间概念节拍(tick):连续两次时钟中断的间隔时间,谓之节拍.10.2 节拍率:HZ把上面的节拍取倒数就是节拍率(HZ).内核在文件中定义了HZ的实际值,节拍率等于HZ,周期为1/HZ秒.例如:I386体系结构在include/asm-i386/param.h中对HZ值定义如下:#define HZ 1原创 2013-11-07 15:15:50 · 897 阅读 · 0 评论 -
LINUX内核设计思想之内核同步方法
9.1 原子操作原子操作是不可分的微粒操作,它可以保证执行过程不被打断.LINUX提供了两组原子操作接口--一组针对整数操作,另一组针对单独的位操作.9.1.1 原子整数操作定义于相关体系结构的文件中.针对整数的原子操作只能对atomic_t类型的数据进行处理.示意代码如下:Atomic_t v; /*定义 v*/Atomic_t u = ATOMIC_INIT(0); /原创 2013-11-07 14:48:05 · 760 阅读 · 0 评论 -
LINUX内核设计思想之系统调用
通过系统调用,是用户空间访问内核的唯一手段,除异常和陷入之外,它们是内核唯一的合法入口. 5.1 系统调用的示意代码例如获取当前进程的PID,用户空间只需要调用如下代码:User Space:getpid()实质上,内核是这样响应此系统调用的.Kernel Space:Asmlinkage long sys_getpid(void){Return curre原创 2013-11-07 11:07:08 · 860 阅读 · 0 评论 -
LINUX内核设计思想之内核同步介绍
并发共享数据是造成不稳定的一类隐患,而且这种错误一般难以跟踪和调度,因此必须给内核同步以高度重视. 8.1 临界区和竞争条件临界区:访问和操作共享数据的代码段.同步:避免并发和防止竞争条件的策略.原子操作:确保每个事务的完整操作,是同步一种笼统策略说法. 8.2 加锁锁提供的就是这样一种机制:它如同一把门锁,门后的房间可想象成一个临界区.在一个指定的时间内,房间里只原创 2013-11-07 14:27:37 · 655 阅读 · 0 评论 -
LINUX内核设计思想之中断和中断处理程序
中断,主要分两种:同步中断和异常中断.同步中断是和处理器时钟同步的,是用户可预见的,如编程失误导致的错误指令(例如除0);异常中断是随机的,用户不可预见的,一般由外设引发,如键盘的按下和弹起的动作. 6.1 中断上半部和下半部在实际应用中,我们不得不面对以下情景:处理器能及时响应中断,如果ISR(中断例程)里面包含比较大的数据量要处理的话(例如网卡),ISR里面会因为停留在中断数据处理原创 2013-11-07 11:11:36 · 874 阅读 · 0 评论 -
LINUX内核设计思想之下半部和推后执行的工作
LINUX内核为解决异常中断的即时响应及大量的数据交互二者之间的矛盾,把中断分为上半部和下半部.上半部保证了异常中断的即时响应,下半部去完成中断引发的大量数据的交互,如从硬盘拷贝数据到内存. 7.1 下半部的实现机制有三种机制可以用来实现将工作推后执行:软中断、tasklet和工作队列.tasklet是通过软中断实现的,而工作队列与它们完成不同.如果某中断需要用到下半部机制,往往在中断原创 2013-11-07 11:31:58 · 805 阅读 · 0 评论 -
LINUX内核设计思想之内存管理
11.1 页内核把物理页作为内存管理单元.大多数32全体系结构支持4KB的页.从虚拟内存角度来说,页就是最小单位.struct page结构体定义于中: Page结构与物理页相关的,而并非与虚拟页相关.因此,该结构对页的描述只是短暂的.即使页中所包含的数据继续存在,由于交换等原因,它们可能不再和同一个page结构关联.内核仅仅用这个数据结构来描述当前时刻在相关的物理页存放的东西.这种数原创 2013-11-07 16:04:52 · 832 阅读 · 0 评论 -
struct inode、struct file和struct file_operations的宏观认识
我们在驱动编程中经常会遇到文件的操作:struct file_operations.比如open()、release()、read()、write()、ioctl()、poll()、select()、fsync()、llseek()等.原创 2013-11-21 23:31:31 · 2498 阅读 · 0 评论 -
LINUX内核设计与实现之虚拟文件系统
VFS作为内核子系统,为用户空间程序提供了文件系统的操作接口.VFS是用户空间到具体文件系统(如EXT3)的一个接口中间层. 12.1 通用文件系统接口VFS最大的意义就是使用用户空间可以直接使用open()、read()和write()等等函数而不需要考虑具体的文件系统(如YAFFS,ext2等). 12.2 文件系统抽象层LINUX之所以可以做到对所有类型的文件系统(比原创 2013-11-08 11:41:26 · 1068 阅读 · 0 评论 -
LINUX内核设计写实现之块IO层
块设备:系统中能够随机(不需要按顺序)访问固定大小数据片(chunk)的设备.这些数据片称为块.一般而言,块设备都是以安装文件系统的方式使用的.所谓的随机性,是指被读取的块在磁盘上的位置不一定要连续,它能够在介质的不同区间前后移动.字符设备:以字符流的方式有序访问的设备. 13.1 解剖一个块设备扇区:块设备中最小的可寻址单元,是物理设备性质的.扇区是所有块设备的基本单元--块设备原创 2013-11-08 13:45:17 · 1226 阅读 · 0 评论 -
LINUX内核设计与实现之进程地址空间
两个不同的进程可以在它们各自地址空间相同地址内存存放不同的数据.但是进程之间也可以选择共享地址空间,这样的进程我们称之为线程.内存区域:内存地址是一个给定的值,它要在地址空间范围之内的,比如4021f000.这个值表示的是进程32位地址空间中的一个特定的字节.在地址空间中,我们更关心的是进程有权访问的虚拟内存地址区间,比如08048000-0804c000.这些可被访问的合法地址区间谓之内原创 2013-11-08 23:38:25 · 1139 阅读 · 0 评论 -
LINUX内核设计与实现之页高速缓存和页回写
页高速缓存(cache):是LINUX内核实现的一种主要磁盘缓存.它主要用来减少对磁盘的I/O操作.具体而言,通过把磁盘的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问.页高速缓存的价值:磁盘高速缓存的价值在两方面:一、访问磁盘的速度远低于访问内存的速度;二、数据一旦被访问,就很有可能在短期内再次被访问,这些数据会被暂存在高速缓存中,实现快速命中.页高速缓存的实现原创 2013-11-08 23:53:32 · 1222 阅读 · 0 评论 -
LINUX内核设计与实现模块
LINUX内核模块的意义:允许内核在运行时动态地向其中插入或从中删除代码. 16.1 构建模块我们经常做的事情就是往内核源码树添加我们自己的驱动源码,便交付内核去编译.下面以一个例子来说明此流程.比如说,我们有个驱动,涉及到两个源码文件:fishing-main.c和fishing-line.c.而且要独立于一个文件夹下.假设我们的驱动是字符设备.那么,我们可以在/deiver原创 2013-11-09 13:43:19 · 678 阅读 · 0 评论 -
LINUX内核设计与实现之kobject与sysfs
2.6内核引入了一个新特性--统一的设备模型.其优点如下:.代码重复最小化;.提供诸如引用计数这样的统一机制;.可以列举系统中所有的设备,观察它们的状态,并且查看它们连接的总线;.将系统中全部设备结构以树的形式完整、有效地展现出来,包括所有的总线和内部连接;.可以将设备和其对应的驱动联系起来,反之亦然;.可以将设备按照类型加以归类,如分类输入设备,而无需要理解设备的拓扑结构原创 2013-11-09 14:40:44 · 948 阅读 · 0 评论 -
LINUX内核设计与实现之可移植性
LINUX系统是一个可移植性非常好的操作系统.一般而言,暴露在外的内核接口往往是与硬件体系结构无关的.例如:调试程序(存放于kernel/sched.c文件中)就是与体系结构无关的.但是其中封装的一些功能函数,如处理器上下文切换和地址空间切换等,是依赖于相应的体系结构完成的.因此,context_switch()用于实现进程切换,而在它内部,会调用switch_to()和switch_mm()原创 2013-11-09 14:48:13 · 1172 阅读 · 0 评论 -
LINUX内核设计与实现之调试
内核调度主要靠经验和对整个操作系统的把握. 18.1 调度前需要准备什么重现BUG. 18.2 内核中的BUG引发内核中的BUG的原因如下:.同步;.定时限制;.竞争条件. 18.3 printk()在终端没有初始化之前,printk()函数是不可用的.比如在setup_arch()函数之前.不过可以用printk()函数的变体--early_pri原创 2013-11-09 15:00:18 · 717 阅读 · 0 评论 -
LINUX内核设计思想之进程管理
什么是进程?进程是处于执行期的程序以及它所包含的资源的总称. LINUX下进程的特性:1.进程的出生:fork()系统调用.其实现机制是通过复制一个现有的进程来创建一个全新的进程. 2.进程的执行:exec*()函数族创建新地址空间并把新的程序载入执行. 3.进程的死亡:exit() 3.1 进程描述符及任务结构LINUX内核里面用结构体st原创 2013-11-07 10:08:25 · 944 阅读 · 0 评论 -
LINUX内核设计思想之初识LINUX
2.1获取内核源码:官方网址:http://www.kernel.org 2.1.1 内核源码的安装:内核源码一般安装在/usr/src/linux目录下. 2.1.2 使用内核补丁:在要打内核补丁的目标内核源码目录下,运行:$patch -p1 2.2 内核源码树Arch 特定体系结构的源码Crypto Crypto APIDocumenta原创 2013-11-06 14:56:07 · 694 阅读 · 0 评论 -
LINUX内核源码树的结构
1.arch: 该目录包含了与体系结构相关的文件.如ARM、Motorola、MIPS、X86等处理器的子目录. 2.block: 该目录主要包含块存储设备I/O调度算法的实现. 3.crypto: 该目录实现了密码操作及与加密相关的API,它们可以应用于WIFI设备驱动的加密算法等场合. 4原创 2013-08-03 14:49:39 · 1200 阅读 · 0 评论 -
Linux内核源码分析--内核启动之(1)zImage自解压过程(Linux-3.0 ARMv7)
分类: LINUX 研究内核源码和内核运行原理的时候,很总要的一点是要了解内核的初始情况,也就是要了解内核启动过程。我在研究内核的内存管理的时候,想知道内核启动后的页表的放置,页表的初始化等信息,这促使我这次仔细地研究内核的启动代码。 CPU在bootloader的帮助下将内核载入到了内存中,并开始执行。当然,bootloader必须为zImage做好必要的准备转载 2013-03-26 14:04:14 · 1485 阅读 · 0 评论 -
linux源码分析--内核启动之(2)Image内核启动(汇编部分)
分类: LINUX 在完成了zImage自解压之后,就跳转到了解压后的内核(也就是vmlinux的bin版本Image),具体的入口可以在arch/arm/kernel/vmlinux.lds.S(最终的链接脚本是通过这个文件产生的)中获得:......SECTIONS{#ifdef CONFIG_XIP_KERNEL. = XIP_VIRT_ADDR(CON转载 2013-03-26 14:03:24 · 898 阅读 · 0 评论 -
对于LINUX内核tty设备的一点理解
虽然一直做嵌入式Linux,宿主机和开发板通信天天都在用tty设备通信,但是其实自己对TTY设备及终端的概念认识几乎是0。对于Linux内核的终端、tty、控制台等概念的认识很模糊。由于在学习的时候碰到了重定向console的问题,所以借机学习下tty的知识。以下是我对tty的认识总结,信息来源于网络和内核文档。参考资料见文章末尾。tty一词源于Teletypes,或Teletypewrite转载 2013-03-26 14:02:50 · 1888 阅读 · 0 评论 -
__init、__initdata和__exit、__exitdata的学习笔记
分类: LINUX由于4年前对于C语言和Linux的知识贫乏,所以当时对于模块中的函数定义没有细看。这次在温习《LDD3》的时候,重新看了一下关于__init、__initdata和__exit、__exitdata的知识,记录如下:对于__init、__initdata和__exit、__exitdata的定义位于,这些宏定义的作用是告诉编译器将这些函数或者数据放入相应的转载 2013-03-26 14:01:26 · 743 阅读 · 0 评论 -
解析linux根文件系统的挂载过程
一:前言 前段时间在编译kernel的时候发现rootfs挂载不上。相同的root选项设置旧版的image却可以。为了彻底解决这个问题。研究了一下rootfs的挂载过程。特总结如下,希望能给这部份知识点比较迷茫的朋友一点帮助。 二:rootfs的种类 总的来说,rootfs分为两种:虚拟rootfs和真实rootfs.现在kernel的发展趋势是将更多的功能放到用户空间完成。以保转载 2013-03-26 14:07:13 · 559 阅读 · 0 评论 -
Linum kernel从入口到start_kernel的代码分析
linux kernel 从入口到start_kernel 的代码分析本文的很多内容是参考了网上某位大侠的文章写的>,有些东西是直接从他那copy过来的。最近分析了一下u-boot的源码,并写了分文档, 为了能够衔接那篇文章,这次又把arm linux的启动代码大致分析了一下,特此写下了这篇文档。一来是大家可以看看u-boot到底是如何具体跳转到linux下跑的,二来也为自己更深入的学习l转载 2013-03-28 09:50:40 · 683 阅读 · 0 评论 -
内核命令行传递的传递过程
转自:http://blog.chinaunix.net/uid-20543672-id-3151113.htmlLinux内核在启动的时候需要一些参数,以获得当前硬件的信息或者启动所需资源在内存中的位置等等。这些信息可以通过bootloader传递给内核,比较常见的就是cmdline。以前我在启动内核的时候习惯性的通过uboot传递一个cmdline给内核,没有具体的分析这个过程转载 2013-03-28 09:25:26 · 724 阅读 · 0 评论 -
解密module_init
在Linux底下写过driver模块的对这个宏一定不会陌生。module_init宏在MODULE宏有没有定义的情况下展开的内容是不同的,如果这个宏没有定义,基本上表明阁下的模块是要编译进内核的(obj-y)。1.在MODULE没有定义这种情况下,module_init定义如下:#define module_init(x) __initcall(x);因为#define __ini转载 2013-03-28 09:47:46 · 701 阅读 · 0 评论 -
解析 Linux 中的 VFS 文件系统机制
解析 Linux 中的 VFS 文件系统机制简介: 本文阐述 Linux 中的文件系统部分,源代码来自基于 IA32 的 2.4.20 内核。总体上说 Linux 下的文件系统主要可分为三大块:一是上层的文件系统的系统调用,二是虚拟文件系统 VFS(Virtual Filesystem Switch),三是挂载到 VFS 中的各实际文件系统,例如 ext2,jffs 等。本文侧重于通过具体的代转载 2013-03-28 09:50:00 · 628 阅读 · 0 评论 -
console_init初始化的研究
在linux初始化过程中,除非启用了early console,否则直到console_init调用之前是没有任何输出的,它们的输出都放在__log_buf这个缓冲内的,在console_init调用时再将这个缓冲区内的数据一次性输出。void __init console_init(void){initcall_t *call;/* Setup the default TTY转载 2013-03-28 09:23:22 · 1145 阅读 · 0 评论 -
do_initcall()函数的说明
1.在看linux核心代码的时候看到/init/main.c 里面的do_initcalls函数static void __initdo_initcalls(void)742 {743 initcall_t *call;744745 for (call = __initcall_start; call __initcall_end;转载 2013-03-28 09:49:12 · 1835 阅读 · 0 评论 -
内核部件之内核链表
概述: 内核链表往往被包含在目标数据结构中,实现通过统一的链表成员可以找到目标数据结构的其他成员来操作.内核链表的存在意义主要是方便、简化软件上的组织和管理. 1.内核链表简介 1-1.定义: struct list_head { struct list_head *next, *prev;}; 注:内核链表定义很简单,里面主要包括指向原创 2013-04-14 15:21:51 · 619 阅读 · 0 评论 -
内核部件之同步机制之原子操作
概述: 所谓原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,它的最小的执行单位,不可能有比它更小的执行单位,因此这里的原子实际是使用了物理学里的物质微粒的概念。原子操作需要硬件的支持,因此是架构相关的,其API和原子类型的定义都定义在内核源码树的include/asm/atomic.h文件中,它们都使用汇编语言实现,因为C语言并不能实现这样的操作。转载 2013-04-20 01:08:15 · 832 阅读 · 0 评论 -
内核部件之同步机制之自旋锁
1.概述 当一个进程(线程)试图获取一个被别的执行单元占有的自旋锁时,只能在干等.这类似于"马桶".如果一个人占住了马桶,另一个想上厕所的人只能在门外干等.因此,试图占有自旋锁或已经占有自旋锁的执行单元,不能够睡眠.要不然,占着马桶睡觉去,你不把门外的那个谁给憋坏了...因此,"马桶"的占有者也必须占有时间短. 应用场景: 如果被保护的共享资源在中断上下文(包括底半部转载 2013-04-30 15:51:21 · 880 阅读 · 0 评论 -
内核部件之同步机制之信号量
1.信号量简介信号量(semaphore)是用于保护临界区的一种常用方法,只有得到信号量的进程才能执行临界区代码.与自旋锁不同的是,获取不到信号量时,进程不会原地打转而是进入睡眠状态.2.内核API2-1.定义信号量Struct semaphore sem;2-2.初始化信号量Void sema_init(struct semaphore *sem,int val);转载 2013-05-01 13:33:22 · 904 阅读 · 0 评论 -
内核部件之同步机制之互斥体
1.互斥体简介信号量已经实现了互斥功能,如宏DECLARE_MUTEX(name)、DECLARE_MUTEX_LOCKED(name).但是在内核中,也存在专门实现互斥的机制.用mutex来表示.2.内核API2-1 定义并初始化Struct mutex my_mutex;Mutex_init(&my_mutex);2-2 获取互斥体Void fastcall m转载 2013-05-01 15:03:12 · 834 阅读 · 0 评论 -
关于Linux container_of用法
Linux container_of的原型定义如下: 各参数含义: type -- 需要操作的数据类型,通常为结构; member -- type结构的成员名称; ptr -- member类型定义的指针变量; 例如: struct typeabc{ int mem0; float mem2; double mem4;转载 2013-08-02 20:34:01 · 632 阅读 · 0 评论 -
LINUX内核设计与实现之kobject与sysfs
2.6内核引入了一个新特性--统一的设备模型.其优点如下:.代码重复最小化;.提供诸如引用计数这样的统一机制;.可以列举系统中所有的设备,观察它们的状态,并且查看它们连接的总线;.将系统中全部设备结构以树的形式完整、有效地展现出来,包括所有的总线和内部连接;.可以将设备和其对应的驱动联系起来,反之亦然;.可以将设备按照类型加以归类,如分类输入设备,而无需要理解设备的拓扑结构原创 2013-11-10 12:08:16 · 734 阅读 · 0 评论