
linux内核
文章平均质量分 78
myxmu
不积跬步无以至千里,不积小流无以成江海
展开
-
PCI Power Management:Runtime Device Power Management
2.3. Runtime Device Power Management------------------------------------The PCI subsystem plays a vital role in the runtime power management of PCIdevices. For this purpose it uses the general翻译 2012-09-22 17:39:31 · 2366 阅读 · 0 评论 -
为Android内核添加新驱动,并添加到menuconfig菜单【实践简记】
为Android内核添加新驱动,并提供menuconfig选项为Android的Linux内核2.6.25添加驱动。1. 在drives目录下添加hello目录,内含hello.c Kconfig Makefilehello.c内容:#include #include MODULE_LICENSE("Dual BSD/GPL");static int hello_i转载 2012-09-11 10:21:43 · 1513 阅读 · 0 评论 -
标准linux休眠和唤醒机制分析
标准linux休眠和唤醒机制分析(一)说明:1. Based on linux2.6.32, only for mem(SDR)2. 有兴趣请先参考阅读:电源管理方案APM和ACPI比较.docLinux系统的休眠与唤醒简介.doc3. 本文先研究标准linux的休眠与唤醒,android对这部分的增改在另一篇文章中讨论4. 基于手上的一个项目来讨论,这里只讨论转载 2012-09-08 18:52:34 · 1443 阅读 · 0 评论 -
Linux进程管理命令详解(3)
4.3 Linux进程管理命令详解(3) 图4-8第二行代码中,USER表示启动进程用户。PID表示进程标志号。%CPU表示运行该进程占用CPU的时间与该进程总的运行时间的比例。%MEM表示该进程占用内存和总内存的比例。VSZ表示占用的虚拟内存大小,以KB为单位。RSS为进程占用的物理内存值,以KB为单位。TTY表示该进程建立时所对应的终端,"?"表示该进程不占用终端。STAT表示进程的运转载 2012-09-06 10:35:08 · 797 阅读 · 0 评论 -
linux_sched.h
#ifndef _SCHED_H#define _SCHED_H#define NR_TASKS 64 // 系统中同时最多任务(进程)数。#define HZ 100 // 定义系统时钟滴答频率(1 百赫兹,每个滴答10ms)#define FIRST_TASK task[0] // 任务0 比较特殊,所以特意给它单独定义一个符号。#转载 2012-09-06 10:03:58 · 1535 阅读 · 0 评论 -
linux内核线程相关
linux内核线程相关1. 头文件#include //wake_up_process()#include //kthread_create()、kthread_run()#include //IS_ERR()、PTR_ERR()2. 实现2.1创建线程在模块初始化时,可以进行线程的创建。使用下面转载 2012-09-06 10:02:43 · 1222 阅读 · 0 评论 -
Linux内核 kthread_run函数 理解学习
最近发现在内核创建线程的时候经常会用到kthread_run()这样的一个调用。于是准备拿出来学习一下。首先看看它的定义之处才发现它是一个宏函数,而不是一个真正意义上的函数。在include/linux/Kthread.h里有/*** kthread_run - create and wake a thread.* @threadfn: the function to run un转载 2012-09-06 09:18:29 · 2117 阅读 · 0 评论 -
Android启动脚本init.rc
在 Android中使用启动脚本init.rc,可以在系统的初始化过程中进行一些简单的初始化操作。这个脚本被直接安装到目标系统的根文件系统中,被 init可执行程序解析。 init.rc是在init启动后被执行的启动脚本,其语法主要包含了以下内容:Commands:命令Actions: 动作Triggers:触发条件Services:服务Options: 选项Propert转载 2012-10-09 19:01:39 · 649 阅读 · 0 评论 -
ARM芯片的启动程序的分析和总结
1、综述: 目前大多基于ARM芯片的系统都是一个比较复杂的片上系统,多数硬件模块都是可配置的,可以通过软件来设置其需要的工作状态。因此在运行用户的应用程序之前,需要由专门的一段代码来完成对系统的初始化。这一段代码就称为启动程序。 由于这类代码直接面对处理器内核和硬件控制器进行编程,一般都是用汇编语言。在ARM系统上电复位后,需要设置中断向量表、初始化各模式堆栈、设置系统时钟频率转载 2012-12-25 10:48:01 · 1519 阅读 · 0 评论 -
全面解析Linux内核的同步与互斥机制--同步篇
【摘要】本文分析了内核的同步及互斥的几种机制:原子运算符(atomic operator)、自旋锁Spinlock、等待队列Waitqueue、事件Event、completion、信号量Semaphore及其优化版互斥锁,详细分析了其实现流程。Event及Semaphore本质上都是基于Waitqueue和自旋锁实现的。本文还探讨了每种机制最适合应用到哪些地方,以及如何构建安全高效的内核及驱动代转载 2012-09-25 13:34:49 · 880 阅读 · 0 评论 -
浅谈linux内核中的idr机制
<!--@page {margin:2cm}p {margin-bottom:0.21cm}-->idr在linux内核中指的就是整数ID管理机制,从本质上来说,这就是一种将整数ID号和特定指针关联在一起的机制。这个机制最早是在2003年2月加入内核的,当时是作为POSIX定时器的一个补丁。现在,在内核的很多地方都可以找到idr的身影。idr机制适用在那些需要把某个转载 2012-09-25 11:25:18 · 618 阅读 · 0 评论 -
LINUX中的MACH定义之MACHINE_START / MACHINE_END
本文讲解LINUX中用MACHINE_START/MACHINE_END定义的MACH,并给出定义的各个成员函数在初始化过程中被调用的时机。 1. 定义一个MACHLINUX中MACHINE定义是用MACHINE_START()/MACHINE_END两个宏来实现的,比如MSM的实现(arch/arm/mach-msm/board-halibut.c):[cpp]转载 2012-09-25 10:37:44 · 1238 阅读 · 0 评论 -
LINUX内核中的xx_initcall初始化标号
LINUX内核中有很多的初始化指示标志postcore_initcall(), arch_initcall(), subsys_initcall(), device_initcall(), etc. 这些起什么作用呢?查阅源代码(android goldfish-2.6.29)并搜索网上相关文章,对此做一总结。初始化标号先看这些宏的定义(定义在文件include/linux/init.转载 2012-09-25 10:10:22 · 817 阅读 · 0 评论 -
Linux内核的Oops
什么是Oops?从语言学的角度说,Oops应该是一个拟声词。当出了点小事故,或者做了比较尴尬的事之后,你可以说"Oops",翻译成中国话就叫做“哎呦”。“哎呦,对不起,对不起,我真不是故意打碎您的杯子的”。看,Oops就是这个意思。在Linux内核开发中的Oops是什么呢?其实,它和上面的解释也没什么本质的差别,只不过说话的主角变成了Linux。当某些比较致命的问题出现时,我们的Linux内核转载 2012-09-16 18:30:44 · 1024 阅读 · 0 评论 -
Runtime Power Management Framework for I/O Devices
Runtime Power Management Framework for I/O Devices(C) 2009-2011 Rafael J. Wysocki , Novell Inc.(C) 2010 Alan Stern 1. IntroductionSupport for runtime power management (runtime PM) of I/O device翻译 2012-09-08 11:54:59 · 2044 阅读 · 0 评论 -
Linux内核里的智能指针
众所周知,C/C++语言本身并不支持垃圾回收机制,虽然语言本身具有极高的灵活性,但是当遇到大型的项目时,繁琐的内存管理往往让人痛苦异常。现代的C/C++类库一般会提供智能指针来作为内存管理的折中方案,比如STL的auto_ptr,Boost的Smart_ptr库,QT的QPointer家族,甚至是基于C语言构建的GTK+也通过引用计数来实现类似的功能。Linux内核是如何解决这个问题呢?同样作为C转载 2012-09-16 17:54:31 · 709 阅读 · 0 评论 -
linux一些机制的总结
1. Work 将任务添加到系统的工作队列中Struct work_struct cd_wq;INIT_WORK(&cd_wq,work_func);Schedule_work(&cd_wq);实际上工作队列就是一个进程,添加到工作队列中就是调度的时候运行 Struct delayed_work otg_event;#define DELAY_TIME 1转载 2012-09-13 14:00:49 · 674 阅读 · 0 评论 -
linux 等待队列(wait queue)
什么是 wait queueWait queues are used to enable processes to wait for a particular event to occur without the need for constantpolling. Processes sleep during wait time and are woken up automatically转载 2012-09-13 10:41:09 · 1416 阅读 · 0 评论 -
新版linux系统设备架构中关于电源管理方式的变更
一、设备模型各数据结构中电源管理的部分 linux的设备模型通过诸多结构体来联合描述,如struct device,struct device_type,struct class,struct device_driver,struct bus_type等。 @kernel/include/linux/devices.h中有这几中结构体的定义,这里只列出和PM有关的项,其转载 2012-09-08 17:53:22 · 899 阅读 · 0 评论 -
Debugging hibernation and suspend
Debugging hibernation and suspend (C) 2007 Rafael J. Wysocki rjw@sisk.pl>, GPL1. Testing hibernation (aka suspend to diskor STD)To check if hibernation works, you can try to hibernate in the "re翻译 2012-09-08 15:52:46 · 614 阅读 · 0 评论 -
Run-time PM
每个device或者bus都会向run-time PM core注册3个callbackstruct dev_pm_ops {...int (*runtime_suspend)(struct device *dev);int (*runtime_resume)(struct device *dev);int (*runtime_idle)(struct device转载 2012-09-08 15:02:37 · 822 阅读 · 0 评论 -
Linux电源管理详解
1.概述 虽然Linux可以在任何一台386以上的PC上运行,目前大多数人使用的都是新型的,带有各种外设的桌面PC或者笔记本电脑,这样,电源管理功能 (PM)就逐渐变得越来越重要。在笔记本电脑上电源管理可以节能,延长电池寿命,而在桌面PC上它可以降低幅射,降温,延长外设使用寿命。现在的操作系统大都内置了电源管理支持,例如 Windows 和 Linux。2.PC机实现电源管理的转载 2012-09-07 15:12:04 · 2736 阅读 · 0 评论 -
Linux中的spinlock和mutex
内核同步措施为了避免并发,防止竞争。内核提供了一组同步方法来提供对共享数据的保护。 我们的重点不是介绍这些方法的详细用法,而是强调为什么使用这些方法和它们之间的差别。Linux 使用的同步机制可以说从2.0到2.6以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随 Linux从单处理器到对称多处理器的过度;伴随着从非抢占内核到抢占内核的过度原创 2012-09-06 14:19:44 · 1356 阅读 · 0 评论 -
Linux内核:spinlock和睡眠
spinlock是linux内核锁机制的一种,而linux内核锁机制是linux内核同步机制的一部分。 linux内核同步机制的使用原因是为了避免共享数据之间的竞争出现,它包括per cpu变量、原子操作、内存屏障、spinlock、信号量、顺序锁、禁止本地中断、禁止本地软中断、RCU等等。linux内核同步机制与SMP、抢占、可延迟函数、工作队列等等紧密关联。 由于复杂性转载 2012-09-06 13:40:19 · 1705 阅读 · 0 评论 -
对称多处理SMP
对称多处理 提高硬件性能的最简单(最便宜)的方法是在主板上增加CPU。这可以让不同CPU做不同工作:非对称多处理,也叫amp,是每个核单独运行独立的操作系统或者核心实例,amp反而利于原来单核程序的运行或者继承,为老程序的移植提供了相当大的便利性(比如很多程序在多核上运行不是很理想的)。但是由于一个核心就要一个操作系统核心实例,比较耗资源。或者让它们并行运行,做相同工作(对称多处理转载 2012-09-06 12:40:43 · 1085 阅读 · 0 评论 -
Linux内核态抢占机制分析
【摘要】本文首先介绍非抢占式内核(Non-Preemptive Kernel)和可抢占式内核(Preemptive Kernel)的区别。接着分析Linux下有两种抢占:用户态抢占(User Preemption)、内核态抢占(Kernel Preemption)。然后分析了在内核态下:如何判断能否抢占内核(什么是可抢占的条件);何时触发重新调度(何时设置可抢占条件);抢占发生的时机 (何时检查可转载 2012-10-08 18:08:39 · 799 阅读 · 0 评论 -
5.7. 加锁的各种选择
Linux 内核提供了不少有力的加锁原语能够用来使内核避免被自己绊倒. 但是, 如同我们已见到的, 一个加锁机制的设计和实现不是没有缺陷. 常常对于旗标和自旋锁没有选择; 它们可能是唯一的方法来正确地完成工作. 然而, 有些情况, 可以建立原子的存取而不用完整的加锁. 本节看一下做事情的其他方法.5.7.1. 不加锁算法有时, 你可以重新打造你的算法来完全避免加转载 2012-10-08 00:32:53 · 487 阅读 · 0 评论 -
5.6. 锁陷阱
多年使用锁的经验 -- 早于 Linux 的经验 -- 已经表明加锁可能是非常难于正确的. 管理并发是一个固有的技巧性的事情, 有很多出错的方式. 在这一节, 我们快速看一下可能出错的东西.5.6.1. 模糊的规则如同上面已经说过的, 一个正确的加锁机制需要清晰和明确的规则. 当你创建一个可以被并发存取的资源时, 你应当定义哪个锁将控制存取. 加锁应当真正在开始转载 2012-10-08 00:08:21 · 478 阅读 · 0 评论 -
5.5. 自旋锁
对于互斥, 旗标是一个有用的工具, 但是它们不是内核提供的唯一这样的工具. 相反, 大部分加锁是由一种称为自旋锁的机制来实现. 不象旗标, 自旋锁可用在不能睡眠的代码中, 例如中断处理. 当正确地使用了, 通常自旋锁提供了比旗标更高的性能. 然而, 它们确实带来对它们用法的一套不同的限制.自旋锁概念上简单. 一个自旋锁是一个互斥设备, 只能有 2 个值:"上锁"和"解锁". 它常常实现为一个整转载 2012-10-07 23:50:47 · 703 阅读 · 0 评论 -
5.2. 并发和它的管理
在现代 Linux 系统, 有非常多的并发源, 并且因此而来的可能竞争情况. 多个用户空间进程在运行, 它们可能以令人惊讶的方式组合存取你的代码. SMP 系统能够同时在不同处理器上执行你的代码. 内核代码是可抢占的; 你的驱动代码可能在任何时间失去处理器, 代替它的进程可能也在你的驱动中运行. 设备中断是能够导致你的代码并发执行的异步事件. 内核也提供各种延迟代码执行的机制, 例如 workqu转载 2012-10-07 23:28:18 · 463 阅读 · 0 评论 -
4.6. 调试器和相关工具
调试模块的最后手段是使用调试器来单步调试代码, 查看变量值和机器寄存器. 这个方法费时, 应当尽量避免. 但是, 通过调试器获得的代码的细粒度视角有时是很有价值的.在内核上使用一个交互式调试器是一个挑战. 内核代表系统中的所有进程运行在自己的地址空间. 结果, 用户空间调试器所提供的一些普通功能, 例如断点和单步, 在内核中更难得到. 本节中, 我们看一下几个调试内核的方法; 每个都有缺点转载 2012-10-07 23:15:55 · 706 阅读 · 0 评论 -
4.5. 调试系统故障
即便你已使用了所有的监视和调试技术, 有时故障还留在驱动里, 当驱动执行时系统出错. 当发生这个时, 能够收集尽可能多的信息来解决问题是重要的.注意"故障"不意味着"崩溃". Linux 代码是足够健壮地优雅地响应大部分错误:一个故障常常导致当前进程的破坏而系统继续工作. 系统可能崩溃, 如果一个故障发生在一个进程的上下文之外, 或者如果系统的一些至关重要的部分毁坏了. 但是当是一个驱动错误导转载 2012-10-07 22:56:18 · 950 阅读 · 0 评论 -
printk
printk 函数将消息写入一个 __LOG_BUF_LEN 字节长的环形缓存, 长度值从 4 KB 到 1 MB, 由配置内核时选择. 这个函数接着唤醒任何在等待消息的进程, 就是说,任何在系统调用中睡眠或者在读取 /proc/kmsg 的进程.这 2 个日志引擎的接口几乎是等同的, 但是注意, 从 /proc/kmsg 中读取是从日志缓存中消费数据, 然而 syslog 系统调用能够选择地转载 2012-10-07 22:36:12 · 898 阅读 · 0 评论 -
4.2.3. 消息是如何记录的
printk 函数将消息写入一个 __LOG_BUF_LEN 字节长的环形缓存, 长度值从 4 KB 到 1 MB, 由配置内核时选择. 这个函数接着唤醒任何在等待消息的进程, 就是说,任何在系统调用中睡眠或者在读取 /proc/kmsg 的进程.这 2 个日志引擎的接口几乎是等同的, 但是注意, 从 /proc/kmsg 中读取是从日志缓存中消费数据, 然而 syslog 系统调用能够选择地转载 2012-10-07 21:59:07 · 501 阅读 · 0 评论 -
2.3. 内核模块相比于应用程序
在我们深入之前, 有必要强调一下内核模块和应用程序之间的各种不同. 不同于大部分的小的和中型的应用程序从头至尾处理一个单个任务, 每个内核模块只注册自己以便来服务将来的请求, 并且它的初始化函数立刻终止. 换句话说, 模块初始化函数的任务是为以后调用模块的函数做准备; 好像是模块说, " 我在这里, 这是我能做的."模块的退出函数( 例子里是 hello_exit )就在模块被卸载时调用. 它转载 2012-10-07 20:43:06 · 535 阅读 · 0 评论 -
2.5. 内核符号表
我们已经看到 insmod 如何对应共用的内核符号来解决未定义的符号. 表中包含了全局内核项的地址 -- 函数和变量 -- 需要来完成模块化的驱动. 当加载一个模块, 如何由模块输出的符号成为内核符号表的一部分. 通常情况下, 一个模块完成它自己的功能不需要输出如何符号. 你需要输出符号, 但是, 在任何别的模块能得益于使用它们的时候.新的模块可以用你的模块输出的符号, 你可以堆叠新的模块转载 2012-10-07 20:10:00 · 798 阅读 · 0 评论 -
INFO: rcu_preempt_state detected stalls on CPUs/tasks:
Using RCU's CPU Stall DetectorThe rcu_cpu_stall_suppress module parameter enables RCU's CPU stalldetector, which detects conditions that unduly delay RCU grace periods.This module parameter enab原创 2012-10-01 15:52:40 · 24409 阅读 · 0 评论 -
一个 Linux 上分析死锁的简单方法
简介死锁 (deallocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程(线程)在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象转载 2012-10-01 15:21:23 · 1660 阅读 · 0 评论 -
各种spinlock形式及使用条件
要澄清的是,互斥手段的选择,不是根据临界区的大小,而是根据临界区的性质,以及有哪些部分的代码,即哪些内核执行路径来争夺。从严格意义上说,semaphore和spinlock_XXX属于不同层次的互斥手段,前者的实现有赖于后者,这有点象HTTP和TCP的关系,都是协议,但层次是不同的。先说semaphore,它是进程级的,用于多个进程之间对资源的互斥,虽然也是在内核中,但转载 2012-10-01 15:16:53 · 1263 阅读 · 0 评论 -
linux内存屏障浅析
内存屏障是一个很神奇的东西,之前翻译了linux内核文档memory-barriers.txt,对内存屏障有了一定有理解。现在用自己的方式来整理一下。在我看来,内存屏障主要解决了两个问题:单处理器下的乱序问题和多处理器下的内存同步问题。为什么会乱序现在的CPU一般采用流水线来执行指令。一个指令的执行被分成:取指、译码、访存、执行、写回、等若干个阶段。然后,多条指令可以同时存在于流水转载 2012-10-01 11:14:59 · 1117 阅读 · 0 评论