
linux内核学习
文章平均质量分 80
tron
这个作者很懒,什么都没留下…
展开
-
Linux内核调试方法的总结
内核开发比用户空间开发更难的一个因素就是内核调试艰难。内核错误往往会导致系统宕机,很难保留出错时的现场。调试内核的关键在于你的对内核的深刻理解。一 调试前的准备在调试一个bug之前,我们所要做的准备工作有: 有一个被确认的bug。包含这个bug的内核版本号,需要分析出这个bug在哪一个版本被引入,这个对于解决问题有极大的帮助。可以采用二分查找法来逐步锁定bug引入版转载 2013-09-12 15:14:53 · 1457 阅读 · 0 评论 -
一个典型kernel bug的追踪之(一):出错现场分析
昨天偶尔在跑测试的时候发现uksmd的一个极其罕见出现的bug(在一个很难进入的路径上,很久很久没有碰到类似的问题了),本质上属于一个soft lockup的bug。所谓,soft lockup就是说,这个bug没有让系统彻底死机,但是若干个进程(或者kernel thread)被锁死在了某个状态(一般在内核区域)。很多情况下这个是由于内核锁的使用的问题。本系列新手教程帖子,教大家如何查看内核出错转载 2012-08-21 16:16:51 · 5746 阅读 · 0 评论 -
同步/异步与阻塞/非阻塞的区别
我喜欢用自己的语言通过联系现实生活中的一些现象解释一些概念,当我能做到这一点时,说明我已经理解了这个概念.今天要解释的概念是:同步/异步与阻塞/非阻塞的区别.这两组概念常常让人迷惑,因为它们都是涉及到IO处理,同时又有着一些相类似的地方.首先来解释同步和异步的概念,这两个概念与消息的通知机制有关.举个例子,比如我去银行办理业务,可能选择排队等候,也可能取一个小纸条上面有我的转载 2012-07-27 16:40:43 · 673 阅读 · 0 评论 -
linux 顶层Makefile执行的流程
原文地址:顶层Makefile执行的流程">linux 顶层Makefile执行的流程作者:天涯孤舟1、make menuconfig# *DOCUMENTATION*# To see a list of typical targets execute "make help"# More info can be located in ./README# Comments i转载 2012-08-09 14:34:15 · 1231 阅读 · 0 评论 -
2.6.22.6版本的主目录下的Makefile 语法分析
VERSION = 2# 给变量VERSION赋值PATCHLEVEL = 6# 给变量PATCHLEVEL赋值SUBLEVEL = 22# 给变量SUBLEVEL赋值EXTRAVERSION = .6# 给变量EXTRAVERSION赋值NAME = Holy Dancing Manatees, Batman!# 给变量NAME赋值# *DOCUMENTA转载 2012-08-09 14:35:27 · 1431 阅读 · 0 评论 -
Linux进程的睡眠和唤醒简析
1 Linux进程的睡眠和唤醒在Linux中,仅等待CPU时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状 态标志位为TASK_RUNNING。一旦一个运行中的进程时间片用完, Linux 内核的调度器会剥夺这个进程对CPU的控制权,并且从运行队列中选择一个合适的进程投入运行。当然,一个进程也可以主动释放CPU的控制权。函数 schedule()是一个调度函数,它可以被转载 2012-07-22 23:47:25 · 583 阅读 · 0 评论 -
linux进程的休眠(等待队列)
当进程以阻塞的方式通信,在得到结果前进程会挂起休眠。为了将进程以一种安全的方式进入休眠,我们需要牢记两条规则:一、永远不要在原子上下文中进入休眠。二、进程休眠后,对环境一无所知。唤醒后,必须再次检查以确保我们等待的条件真正为真简单休眠完成唤醒任务的代码还必须能够找到我们的进程,这样才能唤醒休眠的进程。需要维护一个称为等待队列的数据结构。等待队列就是一个进程链表,其中包含了等待某转载 2012-07-22 23:46:13 · 903 阅读 · 0 评论 -
标准linu休眠和唤醒机制分析(四)
suspend第三、四、五阶段:platform、processor、corestatic int suspend_enter(suspend_state_t state){ int error; if (suspend_ops->prepare) { // 平台特定的函数,mtkpm.c,有定义,对pmic和cpu dll的一些设置转载 2012-07-11 09:01:20 · 946 阅读 · 0 评论 -
linux模块编程(四)——消息的使者list
通过之前几节,我们已经了解了内核线程的创建方法kthread,内核同步的工具completion。现在我们就来学学内核线程传递消息的方法list。或许大家会说,list不是链表吗。不错,list是链表,但它可以变成承担消息传递的消息队列。消息的发送者把消息放到链表上,并通过同步工具(如completion)通知接收线程,接收线程再从链表上取回消息,就这么简单。linux内核或许没有给我们定制好的东转载 2012-07-10 18:00:00 · 1010 阅读 · 0 评论 -
linux模块编程(三)——线程的约会completion
上节中我们已经掌握了创建大量内核线程的能力,可惜线程之间还缺乏配合。要知道学习ITC(inter thread communication),和学习IPC(inter process communication)一样,不是件简单的事情。本节就暂且解释一种最简单的线程同步手段—completion。 打开include/linux/completion.h,你就会看到complet转载 2012-07-10 17:58:37 · 874 阅读 · 0 评论 -
linux内核部件分析(八)——设备驱动模型之bus
前面我们分析了设备驱动模型中的device和driver,device和driver本来是不相关的东西,只因为bus的存在,才被联系到了一起。本节就来看看设备驱动模型中起枢纽作用的bus。本节的头文件在include/linux/device.h和drivers/base/base.h,实现代码主要在bus.c中。因为在bus中有很多代码时为了device找到driver或者driver找到dev转载 2012-07-10 17:42:47 · 561 阅读 · 0 评论 -
新版linux系统设备架构中关于电源管理方式的变更
新版linux系统设备架构中关于电源管理方式的变更based on linux-2.6.32 一、设备模型各数据结构中电源管理的部分 linux的设备模型通过诸多结构体来联合描述,如struct device,struct device_type,struct class,struct device_driver,struct bus_type等。 @kerne转载 2012-07-11 09:03:07 · 491 阅读 · 0 评论 -
标准linu休眠和唤醒机制分析(三)
五、suspend和resume代码走读 下面对suspend分的几个阶段都是按照pm test的5中模式来划分的:freezer、devices、platform、processors、core。suspend第一阶段:freezerint enter_state(suspend_state_t state){ int error;转载 2012-07-11 09:00:20 · 813 阅读 · 0 评论 -
linux kernel 学习之进程
寒假的时候就看了两本书,一本是>,另一本就是>。两本书都只看了一半,主要是没有全心全意的去看,所以进度有点点慢。不过除了主观的原因,还有就是内核的那本书实在是有点难度,很多东西也不是那么简单能了解的,要理解书上的资料,又要去看看代码的实现,虽然只是先看看一个大概的流程,可是也是很有难度额感觉。 我想的话如果要讲进程这一章的话我可以分为几个部分来了解,那样我觉得条例也比较清楚,理转载 2013-01-18 15:17:17 · 404 阅读 · 0 评论 -
linux内核部件分析(十一)——waitqueue与线程的阻塞
当你必须一个复杂的系统,协调系统的方方面面,灵活地支持各种机制和策略,即使很简单的问题也会变得很复杂。linux绝对就是这样一个复杂的系统。所以我们要理解它,尽量从原理的角度去理解事务的处理流程,尽量避免各种细枝末节的干扰,尽量规避那些足以压垮自己的庞然大物。(尽管细致末节和庞然大物很可能就是linux闪光的地方,但我们还是小心为上。)原理 现在我们来考虑linux中线程的阻塞。它的转载 2012-07-10 17:50:22 · 1632 阅读 · 0 评论 -
Linux2.6 内核的 Initrd 机制解析
简介: Linux 的 initrd 技术是一个非常普遍使用的机制,linux2.6 内核的 initrd 的文件格式由原来的文件系统镜像文件转变成了 cpio 格式,变化不仅反映在文件格式上, linux 内核对这两种格式的 initrd 的处理有着截然的不同。本文首先介绍了什么是 initrd 技术,然后分别介绍了 Linux2.4 内核和 2.6 内核的 initrd 的处理流程。最后通过对转载 2013-06-15 15:37:55 · 515 阅读 · 0 评论 -
Linux FB Console---boot logo and the flash cursor
1 Remove the flash cursor when booting into Linux kenrel(开机光标) drivers/video/console/fbcon.c change: static void fb_flashcursor(void *private) { ...} static void fbcon_cursor(struc转载 2013-04-19 11:03:47 · 1905 阅读 · 0 评论 -
Linux内核开发之阻塞非阻塞IO----轮询操作
“小王,来聊聊,今天面试的情况怎么样,应该挺顺利的吧..”看着小王平淡的眉头,我问道。“唉,别提了,你说,我的运气咋这差呢,面试前你不是给我讲了有关阻塞的问题吗,我见了面试官是吧,还跟他好好的用今天排队的例子说了有关阻塞的问题,但是..”小王哀声叹气地说到。“别但是了,怎么啦..”“可问题是面试官压根就没打算问我有关阻塞的问题及解决方案,但是问我说:这样吧,你给我说说在Linux设备驱转载 2013-02-27 13:55:43 · 347 阅读 · 0 评论 -
Linux内核开发之阻塞/非阻塞IO----等待对列
十一过后..小王也刚好即将大学毕业,现在要开始写简历,投简历,找工作了。到了家工作单位,小王欣喜若狂,可再一看,心都凉了半截..“咋了,小王,看你找工作,我都来了帮你大气,怕什么,不就人多点吗..”看着排到电梯口的长龙,我说(其实,我心里也害怕,可也不能说出来不是)。“不是,你不知道,我并不怕面试上有问题,有你在,技术上还是问题吗,不相信自己还不相信你啊,我主要是怕连面试的机会都没转载 2013-02-27 13:54:57 · 438 阅读 · 0 评论 -
Linux内核开发之并发控制(实例总结篇)
"小王,小王,别睡了,瞧你,咋还睡着了呢…"我催促他说."现在是公元前还是公元后啊,我的MM等急了没.."呵呵,看他一脸傻笑。提醒各位路过的MM,如果没有男友的,可以联系小王,电话:拐拐拐。“什么,我的,呵呵,没办法,谁让我这有才呢..”算算前边有关并发控制的有关内容,都到五了,一连来了十一招,今天也不好意思再卖官子了,做一个最后的实例总结篇,下一节,就要开始新的内容了哦,没赶上的可要转载 2013-02-27 11:04:14 · 407 阅读 · 0 评论 -
Linux内核开发之并发控制(三)
算了,既然给你那么多秘籍了,也不在乎这剩下的两三招:出招表五:顺序锁(seqlock)使用顺序锁,读执行单元绝不会被写执行单元阻塞,同时写执行单元也不需要等待所有读执行单元完成读操作后才进行写操作。但是写执行单元之间仍然是互斥的。如果读执行单元在读操作期间,写执行单元已经发生了操作,那么,读执行单元必须重新读取数据,以便确保得到的数据是完整的。致命弱点:顺序锁有一个限制,就是它必须要求转载 2013-02-27 10:56:23 · 359 阅读 · 0 评论 -
Linux内核开发之并发控制(五)
"小涛,还有多少啊,你看我本来就开玩笑似的说说火车票,飞机票的事,看MM的事,你在眉飞色舞,鸡飞狗跳的没完了呢…”"啊?怎么这样呢,本来一个寝室,做人的差别就那么大嗫,平时不好好学习,有问题了问我,给你免费教学,还满腹牢骚,也太不够朋友了吧…."我锤着桌子说."朋友,我还不够朋友啊,你没听说吗:朋友为我,两肋插刀,我为朋友,插它两刀..“小王打断我,”听你念经似的,都三个小时了,你瞧,都来转载 2013-02-27 11:00:34 · 303 阅读 · 0 评论 -
Linux内核开发之并发控制(二)
上集说到哪儿了呢?瞧这记性,什么?说到"天要下雨,娘要嫁人"那段。。这是谁在答话,废话,我当然知道讲到这里了,我是说驱动讲到哪里了。算了,不管了..话说Linux开源社区的开发者们做了什么工作呢,很简单:利用spin_lock()/spin_unlock()作为自旋锁的基础,将它们和关中断local_irq_disable()/开中断local_irq_enable(),关底半部loc转载 2013-02-27 10:54:49 · 341 阅读 · 0 评论 -
Linux内核开发之并发控制(一)
“小涛,你说十一黄金周,火车站,飞机场那些售票系统咋没一个宕掉的呢。你不宕掉也没关系,来两个卖错票的,说不定哥就去上海看世博,去北京看青梅竹马的表妹了…”小王抱怨道。“晕死..哥鄙视你,你说都老大不小的人了,怎么脑子里天天都是MM之类的事了,能不能有点男子气概啊..”。“靠,能跟你比啊,你是饱汉不知饿汉饥,要是像你一样十一和…” "嗯,啊,哼哼.."没等他说完,我赶忙塞了双臭袜子(哪转载 2013-02-26 18:56:31 · 351 阅读 · 0 评论 -
Linux内核开发之并发控制(四)
出招表七:信号量(信号量其实和自旋锁是一样的,就是有一点不同:当获取不到信号量时,进程不会原地打转而是进入休眠等待状态)Linux系统中与信号量相关的操作主要有一下4种:1)定义信号量 struct semaphore sem;2)初始化信号量 void sema_init (struct semphore *sem, int val); //设置sem为val转载 2013-02-27 10:59:05 · 309 阅读 · 0 评论 -
内核中的调度与同步
摘要本章将为大家介绍内核中存在的各种任务调度机理以及它们之间的逻辑关系(这里将覆盖进程调度、推后执行、中断等概念),在此基础上向大家解释内核中需要同步保护的根本原因和保护方法。最后提供一个内核共享链表同步访问的例子,帮助大家理解内核编程中的同步问题。内核任务调度与同步关系引言对于从事应用程序开发的朋友来说,用户空间的任务调度与同步之间的关系相对简单,无需过多考虑需要同步的原因。这一是因转载 2013-02-26 18:45:57 · 551 阅读 · 0 评论 -
linux内核部件分析(六)——设备驱动模型之device
linux的设备驱动模型,是建立在sysfs和kobject之上的,由总线、设备、驱动、类所组成的关系结构。从本节开始,我们将对linux这一设备驱动模型进行深入分析。 头文件是include/linux/device.h,实现在drivers/base目录中。本节要分析的,是其中的设备,主要在core.c中。[cpp] view plaincopyprint?转载 2012-07-10 17:40:22 · 1636 阅读 · 0 评论 -
标准linu休眠和唤醒机制分析(二)
三、pm_test属性文件读写int pm_test_level = TEST_NONE; static const char * const pm_tests[__TEST_AFTER_LAST] = { [TEST_NONE] = "none", [TEST_CORE] = "core", [TEST_CPUS] = "proces转载 2012-07-11 08:59:13 · 609 阅读 · 0 评论 -
标准linu休眠和唤醒机制分析(一)
说明:1. Based on linux2.6.32, only for mem(SDR)2. 有兴趣请先参考阅读: 电源管理方案APM和ACPI比较.docLinux系统的休眠与唤醒简介.doc3. 本文先研究标准linux的休眠与唤醒,android对这部分的增改在另一篇文章中讨论4. 基于手上的一个项目来讨论,这里只讨论共性的地方 虽然linux支持三种省电模式转载 2012-07-11 08:58:03 · 591 阅读 · 0 评论 -
Linux 原子操作
所谓原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,它的最小的执行单位,不可能有比它更小的执行单位,因此这里的原子实际是使用了物理学里的物质微粒的概念。 原子操作需要硬件的支持,因此是架构相关的,其API和原子类型的定义都定义在内核源码树的include/asm/atomic.h文件中,它们都使用汇编语言实现,因为C语言并不能实现这样的操作。 原子操作主要转载 2012-05-17 15:59:02 · 606 阅读 · 0 评论 -
Linux输入子系统分析 -- 输入子系统初始化
Linux输入子系统分析 (1) -- 输入子系统初始化[linux-3.0 http://lxr.linux.no/#linux+v3.0]输入子系统:2173subsys_initcall(input_init);其源代码如下:2133static const struct file_operations input_fops = {2134 .owner转载 2012-05-15 18:24:35 · 721 阅读 · 0 评论 -
深入理解Linux内存映射机制
一. 绪 论我们经常在程序的反汇编代码中看到一些类似0x32118965这样的地址,操作系统中称为线性地址,或虚拟地址。虚拟地址有什么用?虚拟地址又是如何转换为物理内存地址的呢?本章将对此作一个简要阐述。1.1 Linux内存寻址概述现代意义上的操作系统都处于32位保护模式下。每个进程一般都能寻址4G的物理空间。但是我们的物理内存一般都是几百M,进程怎么能获得4G的物理空间呢转载 2012-06-01 14:04:10 · 467 阅读 · 0 评论 -
Linux设备模型
OverviewLinux的sysfs文件系统一般mount在/sys目录。本文主要介绍sysfs文件系统中设备驱动模型的建立过程,内核版本2.6.29。设备驱动信息主要用来表示设备以及驱动的层次关系,以及处理热插拔等。/sys中与之相关的数据有:class 代表一类设备,比如mtd、net、tty等等bus 总线,比如PCI、USB、转载 2012-03-16 00:02:23 · 570 阅读 · 0 评论 -
设备驱动中关键数据结构
1.file_operations数据结构内核内部通过file结构识别设备,通过file_operations数据结构提供文件系统的入口点函数。file_operations定义在中的函数指针表。这个结构的每一个成员的名字都对应着一个系统调用。从某种意义上说,写驱动程序的任务之一就是完成file_operations中的函数指针。如果在2.4版本内核下开发的驱动很可能在2.6版本中无法使用转载 2012-03-30 10:10:37 · 665 阅读 · 0 评论 -
device_register分析
这篇文章也是从别的地方转载的,我的目的是搞清楚:当调用device_register()函数向系统注册一个设备的时候,我注册进去的设备是如何和他父设备关联起来的,以及如何加入到他所在的总线设备中的,但针对这个问题,好像通过这篇文章了解的并不透彻。但具体到代码分析的最后关于设备和驱动是如何绑定的,这并不是我这篇文章的重点,但大概看了一下,有点类型i2c总线上设备和驱动的匹配过程。看下图:转载 2012-02-27 14:04:06 · 501 阅读 · 0 评论 -
ioremap和iounmap -- 内核态地址映射
ioremap和iounmap -- 内核态地址映射#include #include #include /* for ioremap and iounmap */static int __init hello_init(void){ void * v_addr = NULL; unsigned long p_addr = 0xfe转载 2012-02-17 10:19:58 · 9859 阅读 · 0 评论 -
uImage生成过程
uImage生成过程 http://blog.youkuaiyun.com/voice_shen/article/details/6559752 当编译linux的时候,运行make uImage,如果一切正常,最后会生成uImage。如下具体讲解uImage生成过程:1. 生成uImag的工具mkimage由arch/arm/boot/Makefile中的MKIMAGE定义v转载 2011-12-29 16:53:10 · 1096 阅读 · 0 评论 -
Linux 同步方法剖析
Linux 同步方法剖析内核原子,自旋锁,信号量和互斥锁 简介: 在学习 Linux® 的过程中,您也许接触过并发(concurrency)、临界段(critical section)和锁定,但是如何在内核中使用这些概念呢?本文讨论了 2.6 版内核中可用的锁定机制,包括原子运算符(atomic operator)、自旋锁(spinlock)、读/写锁(reader/writer lo原创 2012-01-13 18:13:43 · 433 阅读 · 0 评论 -
Copy_from_user函数详细分析
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/15780/showart_409121.html copy_from_user函数的目的是从用户空间拷贝数据到内核空间,失败返回没有被拷贝的字节数,成功返回0.这么简单的一个函数却含盖了许多关于内核方面的知识,比如内核关于异常出错的处理.从用户空间拷贝数据到转载 2012-01-13 17:16:38 · 1019 阅读 · 0 评论 -
中断中I2C通信导致进程调度或者睡眠
谢谢,第一次碰到,我有个i2c的设备驱动,在中断里进行读写,就碰到以下情况,不知道是不是使用mutex_lock引起的.出错的地方在i2c转串口(SC16IS740)的驱动程序里,该模块申请了一个IRQ中断,中断处理函数是serial_sc16is7_interrupt(),在这个函数里要调用i2c-core模块里的i2c_smbus_read_byte_data()函数读I2C总线,原创 2012-01-13 17:57:13 · 2688 阅读 · 0 评论