
Linux kernel
文章平均质量分 86
Tommy_wxie
Tommy_wxie
展开
-
ARM linxu启动过程分析(三)
<!--p {margin-bottom:0.08in}-->1. Linux内核启动第二阶段:内核启动第二阶段主要完成的工作有,cpuID检查,machineID(也就是开发板ID)检查,创建初始化页表,设置C代码运行环境,跳转到内核第一个真正的C函数startkernel开始执行。这一阶段涉及到两个重要的结构体:一个是structproc_inf转载 2012-01-14 11:09:51 · 1321 阅读 · 0 评论 -
ARM linxu启动过程分析(四)
<!--p {margin-bottom:0.08in}-->1. Linux内核启动第三阶段start_kernel:内核从现在开始就进入C语言部分,内核启动第三阶段从init/main.c文件中的start_kernel()函数开始,到该函数结束。这一阶段对整个系统内存、cache、信号、设备等进行初始化,最后生成init进程后,调用cpu_idle()转载 2012-01-14 11:10:47 · 1370 阅读 · 1 评论 -
linux内核定时器
struct list_head { struct list_head *next, *prev;} 定时器(内核定时器、动态定时器)由结构timer_list表示,定义在文件linux/timer.h中。struct timer_list { struct list_head entry; /* 定时器链表的入口 */原创 2012-01-16 09:47:58 · 1235 阅读 · 0 评论 -
Linux下面一个简单的虚拟platform驱动
在Linux之中,约定如果设备不属于任何的总线,则可以把它注册为虚拟的platform设备。下面就简单来学习一下一个简单的platform设备是怎么创建出来的。一般注册platform驱动的步骤是:1,platform_device_create注册一个设备2,platform_driver_create注册一个驱动。static struct platform_dri原创 2012-01-14 15:56:19 · 1462 阅读 · 0 评论 -
Linux工作队列实现机制
<!--p {margin-bottom:0.08in}h1 {margin-top:0.13in; margin-bottom:0.13in; line-height:0.28in; page-break-inside:avoid}h1.western {font-family:"Times New Roman",serif; font-size:16pt原创 2012-01-16 10:07:15 · 7247 阅读 · 0 评论 -
tasklet使用
taskletTasklet的使用比较简单,只需要定义tasklet及其处理函数并将两者关联例子:Void my_tasklet_func(unsigned long)DECLARE_TASKLET(my_tasklet.my_tasklet_func,data)代码DECLARE_TASKLET实现了定义名称为my_tasklet的tasklet并将其与my_taskle原创 2012-01-16 10:42:04 · 5918 阅读 · 0 评论 -
Linux内核模块时间同步函数汇总
在linux内核模块中能用到的函数比用户空间多,但是它的函数往往被用得很少。当然在内核中叶可以调用用户空间的函数只要直接调用系统调用的封装函数就行,如下:如调用long gettimeofday(struct timeval tv, struct timezone tz);函数可以直接调用封装体:_syscall1(long,gettimeofday, struct timeval,tv,原创 2012-01-17 10:17:42 · 3429 阅读 · 0 评论 -
Sysfs overview
最近想把驱动模型彻底整明白,翻译了几篇文档,这篇sysfs是Patrick Mochel 2003年写的,现在代码有些变化,不过可以让我们基本了解sysfs这个东西。发现个有趣的事情,一般看kernel的东西都会在文件头部看到作者的信息,然后google.com搜这些大侠的名字和相关模块都能找到相关的知识~~ sysfs说穿了是kernel和userspace打交道的一个借口,kernel转载 2012-02-07 11:24:17 · 1559 阅读 · 0 评论 -
ARM linux kernel启动流程 head.S(一)
1. kernel运行的史前时期和内存布局在arm平台下,zImage.bin压缩镜像是由bootloader加载到物理内存,然后跳到zImage.bin里一段程序,它专门于将被压缩的kernel解压缩到KERNEL_RAM_PADDR开始的一段内存中,接着跳进真正的kernel去执行。该kernel的执行起点是stext函数,定义于arch/arm/kernel/head.S。在分析st原创 2012-02-07 11:11:17 · 20552 阅读 · 1 评论 -
ARMlinux kernel 启动之start_kernel (二)
了解完kernel启动以前的汇编之后我们来看看正式的c语言启动代码,也就是我们的start_kernel函数了。start_kernel相当大,里面每一个调用到的函数都足够我们伤脑筋了,我这里只是浅尝辄止的描述一下函数的功能,从而对kernel启动的过程有一个比较直观的了解。很多函数真正理解需要对linux相关体系有很深的了解,暂时没有时间深入,留待以后了。 说实话启动的代码看到现原创 2012-02-07 11:17:48 · 3124 阅读 · 0 评论 -
Linux内核Makefile文件
=== 目录 === 1 概述 === 2 角色分工 === 3 内核编译文件 --- 3.1 目标定义 --- 3.2 内嵌对象 - obj-y --- 3.3 可加载模块 - obj-m --- 3.4 导出符号 --- 3.5 库文件 - lib-y转载 2012-02-21 17:42:21 · 2277 阅读 · 0 评论 -
Linux 2.6内核Makefile浅析
1 概述Makefile由五个部分组成:Makefile:根目录Makefile,它读取.config文件,并负责创建vmlinux(内核镜像)和modules(模块文件)。.config:内核配置文件(一般由make menuconfig生成)。arch/$(ARCH)/Makefile:目标处理器的Makefile。scripts/Makefile.*:所有kbuild Makef原创 2012-02-21 17:17:15 · 16656 阅读 · 1 评论 -
linux KBuild MakeFile介绍 之二
从Linux内核2.6开始,Linux内核的编译采用Kbuild系统,这同过去的编译系统有很大的不同, 尤其对于Linux内核模块的编译。在新的系统下,Linux编译系统会两次扫描Linux的Makefile:首先编译系统会读取Linux内核顶层的 Makefile,然后根据读到的内容第二次读取Kbuild的Makefile来编译Linux内核。Linux内核Makefile分类·转载 2012-02-22 10:57:09 · 13577 阅读 · 0 评论 -
linux驱动current,引用当前进程,及task_struct
尽管内核模块不象应用程序一样顺序执行, 内核做的大部分动作是代表一个特定进程的. 内核代码可以引用当前进程, 通过存取全局项 current, 它在 中定义, 它产生一个指针指向结构 task_struct, 在 定义. current 指针指向当前在运行的进程. 在一个系统调用执行期间, 例如 open 或者 read, 当前进程是发出调用的进程. 内核代码可以通过使用 current原创 2012-02-22 12:00:04 · 1771 阅读 · 0 评论 -
Linux/Android启动 之 (module_init和machine-init函数)
Linux/Android启动之Machine-Init函数一. 基础知识1. Linux启动过程中驱动模块初始化的位置Linux OS的启动过程中将会去创建线程kernel_init,该线程负责Driver初始化等一系列工作。线程kernel_init将会依次调用do_basic_setup() -->do_initcalls()-->do_one_initcall(转载 2012-02-17 10:25:07 · 2743 阅读 · 0 评论 -
linux 等待队列 PK linux 等待队列头
Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在这个链表中,有两种数据结构:等待队列头(wait_queue_head_t)和等待队列项(wait_queue_t)。等待队列头和等待队列项中都包含一个list_head类型的域作为"连接件"。它通过一个双链表和把等待tast的头,和等待的进程列表链接起来。从上图可以清晰看到。所原创 2012-02-20 16:06:38 · 2623 阅读 · 1 评论 -
Linux下的IO端口和IO内存
CPU地址空间CPU地址空间(一)地址的概念1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义。物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上 (如显存、BIOS等)。在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址线上。 物理地址空间,一部分给物理RAM(内存)用,一部分给总原创 2012-03-22 19:56:44 · 2601 阅读 · 1 评论 -
Linux进程的睡眠和唤醒
1 Linux进程的睡眠和唤醒在Linux中,仅等待CPU时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状态标志位为TASK_RUNNING。一旦一个运行中的进程时间片用完, Linux 内核的调度器会剥夺这个进程对CPU的控制权,并且从运行队列中选择一个合适的进程投入运行。当然,一个进程也可以主动释放CPU的控制权。函数 schedule()是一个调度函数,它可以被一原创 2012-03-02 22:40:56 · 2400 阅读 · 0 评论 -
使用 ftrace 调试 Linux 内核,第 2 部分
简介: ftrace 是 Linux 内核中提供的一种调试工具。使用 ftrace 可以对内核中发生的事情进行跟踪,这在调试 bug 或者分析内核时非常有用。本系列文章对 ftrace 进行了介绍,分为三部分。本文是第二部分,通过示例介绍了如何使用 ftrace 中的跟踪器,并对不同格式的跟踪信息进行了描述,同时还对如何使用 ftrace 调试指定内核模块进行了介绍。通过对本文的学习,读者可以了解原创 2012-03-10 21:24:19 · 2882 阅读 · 0 评论 -
linux panic 和 bug_on
内核在发生严重错误的时候要“X屏”一下,以windows为例就是蓝屏,而 linux却是黑屏,windows仅仅提供一个出错码和对应地址,十分难以 理解,而linux却可能提供整个寄存器和堆栈,它不隐瞒一切,代码公开,当然出错时的环境就没有必要隐瞒了,首先看一下panic:NORET_TYPE void panic(const char * fmt, ...){ lon原创 2012-03-02 22:46:11 · 5520 阅读 · 0 评论 -
使用 ftrace 调试 Linux 内核,第 1 部分
简介: ftrace 是 Linux 内核中提供的一种调试工具。使用 ftrace 可以对内核中发生的事情进行跟踪,这在调试 bug 或者分析内核时非常有用。本系列文章对 ftrace 进行了介绍,分为三部分。本文是第一部分,介绍了内核相关的编译选项、用户态访问 ftrace 的接口、ftrace 的数据文件,并对 ftrace 提供的跟踪器的用途进行了介绍,以使读者更好的了解和使用该工具。原创 2012-03-10 21:19:47 · 6401 阅读 · 0 评论 -
使用 Crash 工具分析 Linux dump 文件
简介: Linux 内核由于其复杂性,使得对内核出现的各种异常的追踪变得异常困难。本文将介绍内核中的内存转储机制,以及如何使用 crash 工具对内核产生的内存存储文件进行分析。通过对本文的学习,读者可以像专业内核开发者那样去追踪和修复内核的错误。前言Linux 内核(以下简称内核)是一个不与特定进程相关的功能集合,内核的代码很难轻易的在调试器中执行和跟踪。开发者认为,内核如果原创 2012-03-10 21:29:00 · 1552 阅读 · 0 评论 -
使用 ftrace 调试 Linux 内核,第 3 部分
简介: ftrace 是 Linux 内核中提供的一种调试工具。使用 ftrace 可以对内核中发生的事情进行跟踪,这在调试 bug 或者分析内核时非常有用。本系列文章对 ftrace 进行了介绍,分为三部分。本文是第三部分,通过示例代码介绍如何在代码中使用 ftrace 提供的工具函数,以与 ftrace 交互。通过本文的讲解,读者可以在实际代码中使用 ftrace,方便了调试和分析。原创 2012-03-10 21:25:30 · 2680 阅读 · 0 评论 -
ftrace 简介
简介: Trace 对于软件的维护和性能分析至关重要,ftrace 是当前 Linux 内核中一种新的 trace 工具。本文介绍 ftrace 的使用和实现原理,并将 ftrace 和 systemTap,LTTng 等软件进行对比,希望读者能够对 ftrace 有一个全面的了解。ftrace 简介ftrace 的作用是帮助开发人员了解 Linux 内核的运行时行为,以便进行原创 2012-03-10 21:32:14 · 1554 阅读 · 0 评论 -
Linux slab 分配器剖析
简介: 良好的操作系统性能部分依赖于操作系统有效管理资源的能力。在过去,堆内存管理器是实际的规范,但是其性能会受到内存碎片和内存回收需求的影响。现在,Linux® 内核使用了源自于 Solaris 的一种方法,但是这种方法在嵌入式系统中已经使用了很长时间了,它是将内存作为对象按照大小进行分配。本文将探索 slab 分配器背后所采用的思想,并介绍这种方法提供的接口和用法。动态内存管理原创 2012-03-10 21:14:43 · 1040 阅读 · 0 评论 -
Linux-Android启动 之 (zImage生成过程)
可以看到,在顶层makefile的第278行,包含了scripts/Kbuild.include文件,在这里定义了大量的函数和变量,供顶层makefile和其他makefile文件使用。 在顶层makefile文件的第412行,包含了arch/arm/Makefile。这个是体系结构相关makefile文件。它定义了体系结构相关的一些变量及规则。 当执行”make”时,arc转载 2012-02-17 10:58:40 · 1080 阅读 · 0 评论 -
open系统调用在内核中的流程分析
真是蛮复杂的,我分三步走,力求讲得比较清楚。以字符设备为例,相对于块设备要简单些。基于2.6.26的内核一)驱动注册open函数都干了些什么?register_chrdev -> cdev_add -> kobj_mapfile: fs/char_dev.cint register_chrdev(unsigned int major, const c原创 2012-01-18 16:30:12 · 1904 阅读 · 0 评论 -
等待队列 PK 工作队列
对这2个容易混淆的队列做简单概念上的区别,至于怎么用,资料一大堆,不多说,等需要的时候再去找吧 等待队列在内核中有很多用途,尤其适合用于中断处理,进程同步及定时。我们在这里只说,进程经常必须等待某些事件的发生。例如,等待一个磁盘操作的终止,等待释放系统资源,或者等待时间经过固定的间隔。 等待队列实现了在事件上的条件等待,希望等待特定事件的进程把自己放进合适的等待队列,并原创 2012-01-12 10:00:56 · 1298 阅读 · 0 评论 -
Arm linxu启动过程分析(一)
<!--p {margin-bottom:0.08in}-->本文着重分析FS2410平台linux-2.6.14内核启动的详细过程,主要包括:zImage解压缩阶段、vmlinux启动汇编阶段、startkernel到创建第一个进程阶段三个部分,一般将其称为linux内核启动一、二、三阶段,本文也将采用这种表达方式。对于zImage之前的启动过程,本文不做表述,可转载 2012-01-14 11:06:00 · 1767 阅读 · 0 评论 -
ARM linxu启动过程分析(二)
<!--p {margin-bottom:0.08in}-->*****解压缩内核,分三种情况,下面一一解释:说明:这一段分析中所提到的vmlinux指的是基本内核映像vmlinux/*检查当前地址间的相互关系,防止解压缩过程中出现地址重叠或者说地址冲突 * r4 = final kernel address //最终解压后的内核首地址 *转载 2012-01-14 11:08:35 · 1464 阅读 · 0 评论 -
Linux内核自旋锁
自旋锁 自旋锁(spinlock)是用在多个CPU系统中的锁机制,当一个CPU正访问自旋锁保护的临界区时,临界区将被锁上,其他需要访问此临界区的CPU只能忙等待,直到前面的CPU已访问完临界区,将临界区开锁。自旋锁上锁后让等待线程进行忙等待而不是睡眠阻塞,而信号量是让等待线程睡眠阻塞。自旋锁的忙等待浪费了处理器的时间,但时间通常很短,在1毫秒以下。自旋锁用于多个CPU系统中,在单处理器系统转载 2012-02-22 14:33:41 · 11394 阅读 · 0 评论 -
Kobject overview
sysfs是kobject的表达,所以这里翻译了Documention下的kobjct.txt,并加上了一些自己的注释,这样基本就对kobject和sysfs有了一个比较深刻的理解,我们可以简单的将sysfs看成最bottom的操作,然后kobject的想关操作是架构在sysfs之上,再然后kobject和attribute所嵌入的结构体再构成上一层结构来操作kobject,最后就实现了kerne转载 2012-02-07 11:26:29 · 819 阅读 · 0 评论 -
Linux内核链表
Linux内核链表定义在include/linux/list.h文件中链表结构定义struct list_head { struct list_head *next, *prev;};Linux内核链表它是一个双向循环链表,里面只包含两个struct list_head结构指针。1. 链表初始化链表初始化有两种方式:(1)原创 2012-04-04 11:42:29 · 2446 阅读 · 1 评论 -
Linux内核进程上下文和中断上下文
内核空间和用户空间是操作系统理论的基础之一,即内核功能模块运行在内核空间,而应用程序运行在用户空间。现代的CPU都具有不同的操作模式,代表不同的级别,不同的级别具有不同的功能,在较低的级别中将禁止某些操作。Linux系统设计时利用了这种硬件特性,使用了两个级别,最高级别和最低级别,内核运行在最高级别(内核态),这个级别可以进行所有操作,而应用程序运行在较低级别(用户态),在这个级别,处理器控制着对原创 2012-04-04 15:09:36 · 1339 阅读 · 0 评论 -
内核随记(三)--同步(1)
1、概述同步问题是操作系统中的经典问题,它伴随着并发处理而自诞生。现代体系结构中常见的并发处理情况可以分为如下三种情况:(1)多个线程在单处理器上执行——多线程编程(2)多个线程在多处理器上执行——并行计算(3)多个线程在分布的多个处理上执行——分布式计算相应的编程也分成三种情况:共享变量编程、分布式(基于消息)编程和并行编程。1.1、并发程序设计的本质并发程序通常原创 2012-04-04 15:20:08 · 1301 阅读 · 0 评论 -
内核随记(三)--同步(2)
2.2、睡眠与唤醒在操作系统中,睡眠和唤醒原语实际上是操作系统的基本原语,也是实现同步的一种方式,而且它还是实现信号量的基础。当进程请求的资源(如内存、文件等)不能得到满足时,就会主动放弃CPU,进入等待状态(可中断等待或者不可中断等待)。当资源满足时,就会由别的进程唤醒,从而投入运行。2.2.1、等待队列等待队列表示一组睡眠的进程,这些进程正在等待特定的事件发生(或者说条件为真),比原创 2012-04-04 15:24:10 · 1602 阅读 · 0 评论 -
理解Linux中断 (1)
一直认为,理解中断是理解内核的开始。中断已经远远超过仅仅为外围设备服务的范畴,它是现代体系结构的重要组成部分。1、基本输入输出方式现代体系结构的基本输入输出方式有三种:(1)程序查询:CPU周期性询问外部设备是否准备就绪。该方式的明显的缺点就是浪费CPU资源,效率低下。但是,不要轻易的就认为该方式是一种不好的方式(漂亮的女人不一定好,不漂亮的女人通常很可爱),通常效率低下是由于原创 2012-04-04 15:29:39 · 2289 阅读 · 0 评论 -
理解Linux中断 (2)
3、内核的中断处理3.1、中断处理入口由上节可知,中断向量的对应的处理程序位于interrupt数组中,下面来看看interrupt:341 .data #数据段342 ENTRY(interrupt)343 .text344345 vector=0346 ENTRY(irq_entries_start) 347 .rept NR_IRQS #348-354原创 2012-04-04 15:38:09 · 3492 阅读 · 0 评论 -
理解Linux中断 (3)
4、下半部在中断处理过程中,不能睡眠。另外,它运行的时候,会把当前中断线在所有处理器上都屏蔽(在ack中完成屏蔽);更糟糕的情况是,如果一个处理程序是SA_INTERRUPT类型,它执行的时候会禁上所有本地中断(通过cli指令完成),所以,中断处理应该尽可能快的完成。所以Linux把中断处理分为上半部和下半部。上半部由中断处理程序完成,它通常完成一些和硬件相关的操作,比如对中断的到达的确认原创 2012-04-04 15:42:08 · 1738 阅读 · 0 评论 -
Linux内核抢占与中断返回
1、上下文一般来说,CPU在任何时刻都处于以下三种情况之一:(1)运行于用户空间,执行用户进程;(2)运行于内核空间,处于进程上下文;(3)运行于内核空间,处于中断上下文。应用程序通过系统调用陷入内核,此时处于进程上下文。现代几乎所有的CPU体系结构都支持中断。当外部设备产生中断,向CPU发送一个异步信号,CPU调用相应的中断处理程序来处理该中断,此时CPU处于中断上下文。原创 2012-04-04 15:43:21 · 5478 阅读 · 2 评论