自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(95)
  • 收藏
  • 关注

原创 Linux的USB-Serial 代码跟踪

我们在Linux dev目录看到的ttyUSB*一系列的终端,这些读写在Linux底层是如何处理的呢?首先看USB serial 核心层,kernel\drivers\usb\serial\usb-serial.c文件里面实现static void __exit usb_serial_exit(void){usb_serial_console_exit();

2016-03-30 14:01:28 4226

转载 Linux电源管理(2)_Generic PM之基本概念和软件架构

1. 前言这里的Generic PM,是蜗蜗自己起的名字,指Linux系统中那些常规的电源管理手段,包括关机(Power off)、待机(Standby or Hibernate)、重启(Reboot)等。这些手段是在嵌入式Linux普及之前的PC或者服务器时代使用的。在那个计算机科学的蛮荒时代,人类在摩尔定律的刺激下,孜孜追求的是计算机的计算能力、处理性能,因此并不特别关心Power消耗

2016-03-30 11:14:52 368

转载 Linux电源管理(1)_整体架构

1. 前言在这个世界中,任何系统的运转都需要能量。如树木依靠光能生长,如马儿依靠食物奔跑,如计算机系统依靠电能运行。而能量的获取是有成本的,因此如果能在保证系统运转的基础上,尽量节省对能量的消耗,就会大大提升该系统的生存竞争力。这方面,大自然已经做的很好了,如植物的落叶,如动物的冬眠,等等。而在计算机的世界里(这里以运行Linux OS的嵌入式系统为例),称作电源管理(Power Mana

2016-03-30 11:13:24 433

转载 Process Creation(二)

本文是Process Creation(一)的延续,主要内容包括:1、进程描述符中Realtime Mutex相关数据结构的初始化2、子进程如何复制父进程的credentials3、per-task delay accounting的处理4、子进程如何复制父进程的flag七、初始化Realtime Mutex相关的成员static v

2016-03-30 10:36:27 613

转载 Process Creation(一)

一、前言为什么要写一个关于进程如何创建的文档?其实用do_fork作为关键字进行索引,你会发现网上的相关文档数以万计。作为一个内核工程师,对进程以及进程相关的内容当然是非常感兴趣,但是网上的资料并不能令我非常满意(也许是我没有检索到好的文章),一个简单的例子如下:static void copy_flags(unsigned long clone_flags, struct t

2016-03-30 10:35:12 843

转载 Linux时间子系统之(六):POSIX timer

一、前言在用户空间接口函数文档中,我们描述了和POSIX timer相关的操作,主要包括创建一个timer、设定timer、获取timer的状态、获取timer overrun的信息、删除timer。本文将沿着这些用户空间的接口定义来看看内核态的实现。虽然POSIX timer可以基于各种不同的clock创建,本文主要描述real time clock相关的timer。本文第二

2016-03-30 10:30:59 1443

转载 Linux时间子系统之(五):POSIX Clock

一、前言clock是timer的基础,任何一个timer都需要运作在一个指定的clock上来。内核中维护了若干的clock,本文第二章描述了clock的基本概念和一些静态定义的posix clock。根据计时的特点,clock分成两种:一种是真实世界的时间概念,另外一个是仅仅计算CPU执行时间 ,这两种clock分别在第三和第四章描述。从clock的生命周期来看,可以分成静态和动态的pos

2016-03-30 10:29:08 1740

转载 Linux时间子系统之(四):timekeeping

一、前言timekeeping模块是一个提供时间服务的基础模块。Linux内核提供各种time line,real time clock,monotonic clock、monotonic raw clock等,timekeeping模块就是负责跟踪、维护这些timeline的,并且向其他模块(timer相关模块、用户空间的时间服务等)提供服务,而timekeeping模块维护timeli

2016-03-30 10:27:57 899

转载 Linux时间子系统之(三):用户空间接口函数

一、前言从应用程序的角度看,内核需要提供的和时间相关的服务有三种:1、和系统时间相关的服务。例如,在向数据库写入一条记录的时候,需要记录操作时间(何年何月何日何时)。2、让进程睡眠一段时间3、和timer相关的服务。在一段指定的时间过去后,kernel要alert用户进程本文主要描述和时间子系统相关的用户空间接口函数知识。 二、和系统时间相关

2016-03-30 10:26:53 555

转载 Linux时间子系统之(二):软件架构

一、前言本文的主要内容是描述内核时间子系统的软件框架。首先介绍了从旧的时间子系统迁移到新的时间子系统的源由,介绍新的时间子系统的优势。第三章汇整了时间子系统的相关文件以及内核配置。最后描述各种内核配置下的时间子系统的数据流和控制流。 二、背景介绍1、传统内核时间子系统的软件架构让我们先回到远古的2.4内核时代,其内核的时间子系统的软件框架如下:

2016-03-30 10:25:57 1289

转载 Linux时间子系统之(一):时间的基本概念

本文使用Q & A的方式来和大家以前探讨一下时间的基本概念一、什么是时间?这个问题实在是太复杂了,我都不知道这是一个物理学、宇宙学、还是热力学异或是哲学问题,我只是想从几个侧面来了解一下时间这个概念。本节内容都是我坐在公交车上瞎想的,对物理学有兴趣的人可以指出我的错误(一个搞linux kernel的人不会有太深刻的物理学知识的),对Linux时间子系统有兴趣的人还是忽略这个小节吧

2016-03-30 10:23:46 537

转载 linux kernel的中断子系统之(九):tasklet

一、前言对于中断处理而言,linux将其分成了两个部分,一个叫做中断handler(top half),属于不那么紧急需要处理的事情被推迟执行,我们称之deferable task,或者叫做bottom half,。具体如何推迟执行分成下面几种情况:1、推迟到top half执行完毕2、推迟到某个指定的时间片(例如40ms)之后执行3、推迟到某个内核线程被调度的时候

2016-03-30 10:20:55 495

转载 linux kernel的中断子系统之(八):softirq

一、前言对于中断处理而言,linux将其分成了两个部分,一个叫做中断handler(top half),是全程关闭中断的,另外一部分是deferable task(bottom half),属于不那么紧急需要处理的事情。在执行bottom half的时候,是开中断的。有多种bottom half的机制,例如:softirq、tasklet、workqueue或是直接创建一个kernel t

2016-03-30 10:19:51 395

转载 linux kernel的中断子系统之(七):GIC代码分析

一、前言GIC(Generic Interrupt Controller)是ARM公司提供的一个通用的中断控制器,其architecture specification目前有四个版本,V1~V4(V2最多支持8个ARM core,V3/V4支持更多的ARM core,主要用于ARM64服务器系统结构)。目前在ARM官方网站只能下载到Version 2的GIC architecture sp

2016-03-30 10:18:53 1246

转载 Linux kernel的中断子系统之(六):ARM中断处理过程

一、前言本文主要以ARM体系结构下的中断处理为例,讲述整个中断处理过程中的硬件行为和软件动作。具体整个处理过程分成三个步骤来描述:1、第二章描述了中断处理的准备过程2、第三章描述了当发生中的时候,ARM硬件的行为3、第四章描述了ARM的中断进入过程4、第五章描述了ARM的中断退出过程本文涉及的代码来自3.14内核。另外,本文注意描述ARM指令集的内容

2016-03-30 10:17:05 937

转载 Linux kernel中断子系统之(五):驱动申请中断API

一、前言本文主要的议题是作为一个普通的驱动工程师,在撰写自己负责的驱动的时候,如何向Linux Kernel中的中断子系统注册中断处理函数?为了理解注册中断的接口,必须了解一些中断线程化(threaded interrupt handler)的基础知识,这些在第二章描述。第三章主要描述了驱动申请 interrupt line接口API request_threaded_irq的规格。第四章

2016-03-30 10:15:58 780

转载 linux kernel的中断子系统之(四):High level irq event handler

一、前言当外设触发一次中断后,一个大概的处理过程是:1、具体CPU architecture相关的模块会进行现场保护,然后调用machine driver对应的中断处理handler2、machine driver对应的中断处理handler中会根据硬件的信息获取HW interrupt ID,并且通过irq domain模块翻译成IRQ number3、调用该IR

2016-03-30 10:14:32 624

转载 linux kernel的中断子系统之(三):IRQ number和中断描述符

一、前言本文主要围绕IRQ number和中断描述符(interrupt descriptor)这两个概念描述通用中断处理过程。第二章主要描述基本概念,包括什么是IRQ number,什么是中断描述符等。第三章描述中断描述符数据结构的各个成员。第四章描述了初始化中断描述符相关的接口API。第五章描述中断描述符相关的接口API。二、基本概念1、通用中断的代码处理示意图

2016-03-30 10:12:58 3227

转载 Linux kernel的中断子系统之(二):IRQ Domain介绍

http://www.wowotech.net/linux_kenrel/irq-domain.html一、概述在linux kernel中,我们使用下面两个ID来标识一个来自外设的中断:1、IRQ number。CPU需要为每一个外设中断编号,我们称之IRQ Number。这个IRQ number是一个虚拟的interrupt ID,和硬件无关,仅仅是被CPU

2016-03-30 10:12:03 1002

转载 Linux kernel的中断子系统之(一):综述

http://www.wowotech.net/irq_subsystem/interrupt_subsystem_architecture.html一、前言一个合格的linux驱动工程师需要对kernel中的中断子系统有深刻的理解,只有这样,在写具体driver的时候才能:1、正确的使用linux kernel提供的的API,例如最著名的request_threade

2016-03-30 10:09:00 567

转载 一个女孩写的暴强代码,累死人啊!

http://blog.chinaunix.net/uid-31057203-id-5689692.htmlresult love(boy, girl){    if( boy.有房() and boy.有车() )    {        boy.set(nothing);        return girl.嫁给(boy);    }    if( girl.

2016-03-29 17:08:23 463

转载 彻底搞定C语言指针详解-完整版-时候初学者-必备

http://blog.chinaunix.net/uid-22889411-id-59688.html1.语言中变量的实质要理解C指针,我认为一定要理解C中“变量”的存储实质, 所以我就从“变量”这个东西开始讲起吧!先来理解理解内存空间吧!请看下图:内存地址→  6      7   8      9   10      11      12       13

2016-03-29 16:17:56 622

转载 嵌入式Linux之我行——S3C2440上MMC/SD卡驱动实例开发讲解(一)

http://blog.ednchina.com/mcuandme/1787530/Message.aspx http://blog.chinaunix.net/u3/101649/showart_2232724.html嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处

2016-03-29 14:12:34 1906

转载 关于linux mmc/sd驱动程序架构

关于linux mmc/sd驱动程序架构今天花了时间简单看了mmc/sd部门内容和代码,我觉得形式上,这个部分和i2c非常相似系统也是分成core层,host层(对应i2c的adapter),设备层如果这样讲,那么core层主要功能应该是提供host注册,总线注册,设备注册的几个方法以及所谓sdio总线接口的算法了。host层已经是注册一个platform设备,其中应该提供主要sd

2016-03-29 13:42:00 1349

原创 linux内核串口控制器注册以及收发

我们看到Linux dev目录下面ttyS系列的串口设备的终端,现在用一个uart 控制器的程序来分析下怎么实现的首先是定义了uart driverstatic struct uart_driver XX_uart_driver = {.owner = THIS_MODULE,.driver_name = XX_UART_DEV_NAME, //名字,实际是uart.d

2016-03-29 11:19:34 1613

转载 __FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程 )

先看下简单的初始代码:注意其编译运行后的结果。root@xuanfei-desktop:~/cpropram/2# cat global.h //头文件#ifndef CLOBAL_H        #define GLOBAL_H        #include         int funca(void);        int funcb(void);#en

2016-03-28 19:09:37 361

转载 可变参数(...)学习笔记

http://topic.csdn.net/t/20041124/09/3582660.html原文链接 最近应CSDN的邀请,C/C++值班室的几位兄弟为C++电子杂志写了一些文章,现将我的稿件预先刊发在论坛上,请兄弟们批评指正。也欢迎大家为CSDN c/c++电子杂志专刊投稿。杂志详情请见http://emag.csdn.net/                      

2016-03-28 19:08:23 533

转载 数组与指针---都是"退化"惹的祸

个人的浅显认识, 欢迎批评指正.1. 什么是数组类型?下面是C99中原话:An array type describes a contiguously allocated nonempty set of objects with aparticular member object type, called the element type.36) Array types a

2016-03-28 19:06:41 417

转载 数组名和数组名取地址的区别

from:http://blog.csdn.net/daniel_ice/article/details/6857019以下代码会打印出什么样的日志呢?[cpp] view plaincopy#include     int a[2] = {1,2};  int main(){         

2016-03-28 19:05:40 291

转载 嵌入式Linux编译器gcc使用

from: http://blog.csdn.net/jyjmc/article/details/5278130At first, GCC is used for GNU C Compiler. At present,it supports JAVA Ada C++ and so on. GCC编译流程分为:1.Pre-Processing(预处理)

2016-03-28 19:03:57 506

转载 大尾端小尾端

from:big endian:大尾端,也称大端(高位)优先存储。   little endian:小尾端,也称小端(低位)优先存储。    如下00000000 00000000 00000000 00000001的存储          大尾端: 00000000 00000000 00000000 00000001

2016-03-28 19:02:59 665

转载 C语言的标准

from: http://blog.csdn.net/gogor/article/details/45626601.ANSI/ISO C     ANSI C是C语言的标准,任何C语言的编译器都在ANSI C的基础上扩充。1990年,国际化标准组织ISO(Intrernational StandardOrganization)接受了ANSI C(C89)为ISO

2016-03-28 19:01:46 396

转载 linux的内建函数

转自: http://blog.sina.com.cn/s/blog_4b8ad9530100cl2v.html内建函数是与语言相关的(或者更准确地说是编译器相关吧),作用应该是跟关键字一样,无需申明,编译器就知道它是什么东西。同样,无需#include任何头文件,只要语法符合,编译器就知道去哪儿链接相关代码!另外,如果显式申明的函数与内建函数同名,内建函数将会

2016-03-28 18:59:16 488

转载 伙伴系统的概述 (一)

伙伴系统的概述        Linux内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下,避免碎片的产生。Linux采用伙伴系统解决外部碎片的问题,采用slab解决内部碎片的问题,在这里我们先讨论外部碎片问题。避免外部碎片的方法有两种:一种是之前介绍过的利用非连续内存的分配;另外一种则是用一种有效的方法来监视内存,保证在内核只要申请一小块内存的情况下,不会从大块的连续空

2016-03-28 17:31:14 325

转载 Linux操作系统多线程信号总结

linux 多线程信号编程总结linux 多线程信号总结(一)1. 在多线程环境下,产生的信号是传递给整个进程的,一般而言,所有线程都有机会收到这个信号,进程在收到信号的的线程上下文执行信号处理函数,具体是哪个线程执行的难以获知。2 signal函数BSD/Linux的实现并不在信号处理函数调用时,恢复信号的处理为默认,而是在信号处理时阻塞此信号,直到信号处理函数返回。其他

2016-03-28 17:17:44 328

转载 多线程---自旋锁、互斥锁区别

何谓自旋锁?它是为为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环

2016-03-28 17:16:46 417

转载 Linux操作系统多线程信号总结

linux 多线程信号编程总结linux 多线程信号总结(一)1. 在多线程环境下,产生的信号是传递给整个进程的,一般而言,所有线程都有机会收到这个信号,进程在收到信号的的线程上下文执行信号处理函数,具体是哪个线程执行的难以获知。2 signal函数BSD/Linux的实现并不在信号处理函数调用时,恢复信号的处理为默认,而是在信号处理时阻塞此信号,直到信号处理函数返回。其他

2016-03-28 17:14:47 449

转载 Linux设备驱动之——I2C总线

目录(?)[-]I2C子系统i2c-dev总线驱动2  I2C子系统2.1 LinuxI2C子系统架构在内核中已经提供I2C子系统,所以在做I2C驱动之前,就必须要熟悉该子系统。2.2 三大组成部分1、I2C核心(i2c-core)I2C核心提供了I2C总线驱动和设备驱动的注册、注销方法,I2C通信方法(algorit

2016-03-28 16:39:53 537

转载 Linux SPI总线和设备驱动架构之一:系统概述

目录(?)[-]硬件结构工作时序软件架构SPI控制器驱动程序SPI通用接口封装层SPI协议驱动程序SPI通用设备驱动程序SPI是"Serial Peripheral Interface" 的缩写,是一种四线制的同步串行通信接口,用来连接微控制器、传感器、存储设备,SPI设备分为主设备和从设备两种,用于通信和控制的四根线分别是:

2016-03-28 16:37:53 455

转载 read 系统调用剖析

目录(?)[-]Read 系统调用在用户空间中的处理过程Read 系统调用在核心空间中的处理过程Read 系统调用在核心空间中处理的层次模型图1 read 系统调用在核心空间中的处理层次相关的内核数据结构数据结构之间的关系图2 数据结构关系图前提条件准备清单1 sys_open 函数代码图3 file 对象和当前进程描述符之间的关系虚拟文件系统层

2016-03-28 16:21:02 477

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除