自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(48)
  • 资源 (4)
  • 收藏
  • 关注

原创 Linux mount代码分析

1.    数据结构vfsmountstruct vfsmount {                struct list_head mnt_hash;          // hash表                struct vfsmount*mnt_parent;   /* fs we are mounted on */                struct

2012-11-07 22:02:15 4217

原创 Linux kernel FAT32文件系统分析

文本探讨了Linux kernel中对fat32文件系统的实现,关于fat文件的格式可以查看微软的fat白皮书。1.    FAT表操作FAT文件系统中,使用FAT表标记哪个cluster被占用,哪个没被占用。在Linux内核代码中,与FAT表操作对应的是fat_entry,fatent_ops结构和fat_cache_id缓存等。1.1 fat_entryfat中的fat e

2012-09-20 09:39:53 12168

原创 关于Linux log机制的一些整理

很久以前整理的,今天偶然看到了,放到网上方便查询。一、      syslogd和klogdsyslogd与syslog配套使用,主要用于daemon输出log。Klogd读/proc/kmsg,保存的是kernel log。Klogd启动时有一个-f选项,用于指定保存kernel log的文件。如果没有指定,会发送到syslog,由syslog统一保存。二、

2012-04-13 23:00:58 8735

转载 select()函数、poll()函数

重读2.4 052 fs/select.ctarget="_blank">http://docs.google.com/Doc?id=dcbsxfpf_213vc73kssk2008-4-22这里讨论的是select和poll的系统调用实现方式.首先要熟悉的是内核中为poll和select定义的各种输入输出消息的含义:             POLLIN   有数据可以读

2012-03-24 21:48:54 1922

原创 蓝牙底层HCI驱动的实现

Overview蓝牙协议栈与蓝牙底层设备一般是通过串口连接,两者之间通过HCI协议通讯。这就要求实现一个串口tty驱动。而对于Bluez协议栈来说,它是通过建立蓝牙的socket来发送、接收数据。因此,在蓝牙通信中,对上层应用是socket通信,对底层则一般是通过一个tty驱动实现。本文以HCIUART_LL为例,讨论了蓝牙底层的tty驱动部分,代码在drivers\bluetooth\hci

2012-03-20 21:41:30 14435 2

原创 Bluez SPP实现代码分析

本文分析蓝牙协议栈中蓝牙转串口(SPP)部分的实现。1.  基本概念Bluez提供了蓝牙转串口的功能,应用程序可以通过dbus接口控制bluez的串口功能。1.1 启动SPP服务等待远端设备连接的过程:org.bluez.SerialProxyManager->CreateProxy         // 得到一个serial proxyorg.bluez.SerialProx

2012-01-30 00:44:59 12982 3

原创 Bluez HID分析(二)

本文分析了蓝牙bluez协议栈中HID协议的实现。1.  基本概念HID协议用于人机输入设备。Bluez中关于HID的实现代码在其根目录下的input目录。蓝牙规范中包含关于HID的profile,里面重用了USB中关于HID的一些协议规范。Bluez协议栈与上层应用之间使用dbus接口。Bluez与kernel之间使用AF_BLUETOOTH协议族的socket通信,并使用了gt

2012-01-28 00:35:02 9764

原创 Bluez HID分析--Linux kernel部分

本文介绍蓝牙协议栈Bluez在linux中实现HID功能的kernel部分。在linux kernel中,Bluez对HID的实现代码在/net/bluetooth/hidp文件夹中,主要包括sock.c,core.c和hidp.h三个文件。Bluez提供了一个socket接口,用户空间程序通过使用该socket控制HID。该socket使用的协议编号为BTPROTO_HIDP。1.  初

2012-01-23 23:56:15 11042

原创 linux HID驱动分析

最近研究蓝牙的键盘鼠标,所以粗略看了一下Linux的HID框架。HID 总线HID的总线在hid-core.c的hid-init中初始化:bus_register(&hid_bus_type);hid_bus_type的定义:static struct bus_type hid_bus_type = {       .name            = "hid",

2012-01-21 23:31:21 19077 2

原创 Linux regulator分析

Regulator模块用于控制系统中某些设备的电压/电流供应。在嵌入式系统(尤其是手机)中,控制耗电量很重要,直接影响到电池的续航时间。所以,如果系统中某一个模块暂时不需要使用,就可以通过regulator关闭其电源供应;或者降低提供给该模块的电压、电流大小。Regulator的文档在KERNEL/Documentation/Power/Regulator中。 Regulator与模块

2011-11-18 11:31:06 10171 1

原创 Linux对电平触发与沿触发中断的区别

<br />对于电平触发中断和沿触发中断,在Linux中分别用了handle_level_irq和handle_edge_irq进行处理。中断发生后,系统的中断开关会自动处于disable状态,这由CPU的硬件保证(至少arm中是这样),所以两个函数都在中断禁止的环境中执行。<br /> <br />handle_level_irq<br />void handle_level_irq (unsigned int irq, struct irq_desc *desc)<br />       spin_lo

2011-03-19 23:16:00 5645 1

原创 ARM Linux异常处理之data abort(二)

上文提到data abort的正常处理过程中,最终会调用do_DataAbort函数,下面分析一下该函数的处理过程。do_DataAbortasmlinkage void __exception do_DataAbort(      unsigned long addr,                    // 导致异常的内存地址      unsigned int fsr

2011-03-10 22:37:00 18127

转载 WCDMA物理层中的基本概念

转自http://blog.sina.com.cn/s/blog_4d0d56900100bs3y.html小区呼吸:    CDMA网络与GSM网络完全不同。由于不再把信道和用户分开考虑,也就没有了传统的覆盖和容量之间的区别。一个小区的业务量越大,小区面积就越小。因为在CDMA  网络中,业务量增多就意味着干扰的增大。这种小区面积动态变化的效应称为“小区呼吸”。远近效应问题:    CDMA网络的另一典型问题是所谓的远近效应问题。因为同一小区的所有用户分享相同的频率,所以对整个系统来说,每个用户都以最小的

2011-03-08 21:53:00 5362 1

原创 ARM Linux异常处理之data abort(一)

本文简要分析了ARM Linux的data abort异常处理过程,内核版本2.6.28,s3c6410平台。异常向量与程序跳转data abort是ARM体系定义的异常之一。异常发生时,ARM会自动跳转到异常向量表中,通过向量表中的跳转命令跳转到相应的异常处理中去。ARM的异常处理向量表在entry-armv.S文件中:       .globl      __vectors_start__vectors_start:       swi   SYS_ERROR0       b     vector_u

2011-03-07 22:58:00 25639

原创 s3c6410 framebuffer分析

本文介绍了s3c6410中的framebuffer,参考代码为Linux2.6.28。网上介绍framebuffer的文章很多,内核代码中也有关于framebuffer的文档,所以本文只介绍一些其它文章较少介绍的部分。1.     Overview在嵌入式系统中,会有一块内核空间保存LCD上每一个象素需要被显示的值。系统运行时,CPU的显示控制器会自动从这块内存读取内容,然后发送到LCD显示屏。这块内存就叫作framebuffer。对程序来说,通过修改framebuffer中的内容,就可以控制LCD的显示。

2011-02-27 12:20:00 6968 5

原创 Linux Posix Timer实现代码分析

本文简要介绍了Linux实现POSIX定时器的内核代码。内核中对posix定时器的实现代码在kernel/posix-timers.c/h中,本文使用的代码是2.6.29;关于用户空间如何使用POSIX定时器请查阅相关man文档。Linux提供的POSIX定时器功能主要由以下几个函数组成:int timer_create(clockid_t which_clock, struct sigevent* timer_event_spec, timer_t* created_timer_id);int timer

2011-02-01 23:32:00 9611

原创 Linux Signal实现代码分析

本文介绍了Linux信号处理的基本流程。关于信号处理的具体细节可以看ULK第三版第11章。1.     基本数据结构1.1           task_struct中信号相关的域struct signal_struct * signal;         // Pointer to the process's signal descriptorstruct sighand_struct * sighand;    // Pointer to the process's signal handler des

2011-01-28 00:38:00 14538 5

原创 Linux的timerfd分析

timerfd是Linux为用户程序提供的一个定时器接口。这个接口基于文件描述符,所以能够被用于select/poll的应用场景。1.      使用方法timerfd提供了如下接口供用户使用timerfd_createint timerfd_create(int clockid, int flags);timerfd_create用于创建一个定时器文件。参数clockid可以是CLOCK_MONOTONIC或者CLOCK_REALTIME。参数flags可以是0或者O_CLOEXEC/O_NONBLOCK

2011-01-24 22:41:00 29232 2

原创 Linux hrtimer分析(2)

<br />本文介绍Linux2.6.29中,配置高精度模式的hrtimer与未配置高精度模式时行为的区别。本文暂不考虑高精度模式对Linux系统时钟中断的影响。<br /> <br />在没有配置高精度模式时,hrtimer的超时在系统时钟中断的轮循中检查,所以此时hrtimer的定时精度还是以轮循的间隔为单位,精度与传统的时间轮定时器一样。<br />在配置高精度模式后,hrtimer的超时由struct clock_event_device的超时中断完成。clock_event_device一般来说描

2011-01-18 23:01:00 8445 1

转载 自旋锁及其衍生的锁,值得看看

自旋锁 自旋锁(spinlock)是用在多个CPU系统中的锁机制,当一个CPU正访问自旋锁保护的临界区时,临界区将被锁上,其他需要访问此临界区的CPU只能忙等待,直到前面的CPU已访问完临界区,将临界区开锁。自旋锁上锁后让等待线程进行忙等待而不是睡眠阻塞,而信号量是让等待线程睡眠阻塞。自旋锁的忙等待浪费了处理器的时间,但时间通常很短,在1毫秒以下。 自旋锁用于多个CPU系统中,在单处理器系统中,自旋锁不起锁的作用,只是禁止或启用内核抢占。在自旋锁忙等待期间,内核抢占机制还是有效的,等待自旋锁释放的线程可能被

2011-01-14 13:58:00 3652

原创 Linux hrtimer分析(一)

本文分析了Linux2.6.29中hrtimer的实现。 Linux中实现了一种新的定时器hrtimer。与传统定时器使用时间轮算法不同,hrtimer使用了红黑树算法。hrtimer本身可以配置成高精度和普通精度两种,在单CPU系统和多CPU系统中的实现也有区别。这里先分析最简单的配置成普通精度、单CPU的情况。配置成高精度的情况见后续文章。 1. 时钟源的定义为了实现hrtimer,Linux为系统中每一个CPU定义了一个hrtimer_cpu_base,这个结构体的定义如下: struct hrtim

2011-01-12 23:44:00 25544 2

转载 Linux内核红黑树使用方法

选自2.6.29内核文档,rbtree.txtRed-black Trees (rbtree) in Linux January 18, 2007 Rob Landley =============================What are red-black trees, and what are they for?------------------------------------------------Red-black trees are a type of self-balancing

2011-01-06 23:44:00 3831

原创 Linux动态库函数介绍

<br />头文件#include <dlfcn.h><br /> <br /> <br />加载动态库<br />void *dlopen(const char *filename, int flag);<br />flag的可能值:<br />l        RTLD_LAZY<br />l        RTLD_NOW<br />l        RTLD_GLOBAL<br />l        RTLD_LOCAL<br />l        RTLD_NODELETE (since glib

2011-01-05 21:35:00 4798

原创 Linux Call Trace原理分析

本文介绍了在Linux环境下根据EABI标准进行call dump调试的一般性原理。Linux开发过程中,由于程序不稳定,经常会出现错误,导致程序异常,甚至崩溃。这时,就需要有一种机制将崩溃时的函数调用栈打印出来,方便调试,这种机制就是call dump。下面简单介绍powerpc环境中如何实现call dump。内核态call dump内核态有三种出错情况,分别是bug, oops和panic。bug属于轻微错误,比如在spin_lock期间调用了sleep,导致潜在的死锁问题,等等。oops代表某一用户

2011-01-03 21:01:00 54137

原创 linux2.6定时器的时间轮算法分析

1.     Overview常用的定时器实现算法有两种:最小堆和时间轮(timing wheel)。在Linux2.6的代码中,kernel/timer.c文件实现了一个通用定时器机制,使用的是时间轮算法。每一个CPU都有一个struct tvec_base结构,代表这个CPU使用的时间轮。struct tvec_base{       spinlock_t lock;                                  // 同步锁       struct timer_list * ru

2010-12-27 22:11:00 9694

原创 Linux2.6软中断分析

Linux2.6的软中断框架与2.4相比有了一些不同。传统的底半部机制已经几乎没有了,任务队列也已经取消。下面分析一下2.6软中断的框架。2.6中软中断还是由函数do_softirq调用,但异常和系统调用返回、调度时不再执行软中断,执行时机变为以下3个:l         硬件处理完一个中断之后(irq_exit函数)l         内核线程ksoftirqdl         显式调用do_softirq的地方(比如net子系统中)do_softirq会遍历所有的softirq_vec,依次调用其中的

2010-12-18 00:12:00 158

转载 The journey of a packet through the linux 2.4 network stack

<br />作者介绍:<br /><br />Harald Welte is one of the five netfilter/iptables core team members, and is the current Linux 2.4.x firewalling maintainer. His main interest in computing has always been networking but in the little time left after netfilter/iptabl

2010-12-13 16:04:00 1609

转载 深入Linux网络核心堆栈

<br /><br />目录<br /><br />1 - 简介<br />  1.1 - 本文涉及的内容<br />  1.2 - 本文不涉及的内容<br />2 - 各种Netfilter hook及其用法<br />  2.1 - Linux内核对数据包的处理<br />  2.2 - Netfilter对IPv4的hook<br />3 - 注册和注销Netfilter hook<br />4 - Netfilter 基本的数据报过滤技术[1]<br />  4.1 - 深入hook函数<br />

2010-12-13 15:56:00 1055

原创 不使用递归和堆栈,遍历二叉树所有叶子节点的算法

最近看1-wire总线的DS2480芯片,里面用到了一种不使用递归来遍历二叉树的算法。这里归纳了一下,供参考。因为没编译过,所以细节上可能会有点问题。但算法保证是正确的。// g_bFlag中保存的是节点的路径,数组中某一位为0,代表取这个节点的左子节点作为路径的下一个节点;// 为1代表取右子节点作为下一个节点char g_bFlag[MAX_DEPTH] = {0}; int g_iLastZero;   // 中间变量,遍历中会用到int g_iLastNode = 0; // 用于标记遍历是否结束N

2010-11-09 18:20:00 2799

原创 Linux2.6 input子系统分析

Linux的input子系统提供了输入设备的驱动框架,比如鼠标、键盘、触摸屏等就属于输入设备。Linux中关于input子系统的文档在Documentation/input目录,input的核心代码在input.c和input.h中。本文没有涉及input的一些细节实现,比如input_dev->grab,以及按键的定时事件等。1.    input_handle, input_han

2010-10-26 22:29:00 2584

原创 linux spi驱动分析

关于spi的学习,我觉得最好的方法还是看Linux的源代码,主要是driver/spi/spi.c(h),spidev.c(h)。spi dev的示例可以看看at25.c,spi总线的示例可以看omap_uwire或者spi_s3c24xx.c和spi_s3c24xx_gpio.c。在看这些代码之前,需要对Linux的设备模型有一定的了解。另外,网上有两篇教程不错,《linux spi子系统驱动分析》以及《linux spi子系统驱动分析续》,百度可以直接搜到,这里帖一下我找到的链接,但不清楚是转载的还是原

2010-10-17 11:57:00 21559 6

原创 uevent分析

1.kobject, ktype, kset<br />kobject代表sysfs中的目录。<br />ktype代表kobject的类型,主要包含release函数和attr的读写函数。比如,所有的bus都有同一个bus_type;所有的class都有同一个class_type。<br />kset包含了subsystem概念,kset本身也是一个kobject,所以里面包含了一个kobject对象。另外,kset中包含kset_uevent_ops,里面主要定义了三个函数<br />       in

2010-10-01 12:35:00 16118 4

原创 Linux设备模型

OverviewLinux的sysfs文件系统一般mount在/sys目录。本文主要介绍sysfs文件系统中设备驱动模型的建立过程,内核版本2.6.29。设备驱动信息主要用来表示设备以及驱动的层次关系,以及处理热插拔等。/sys中与之相关的数据有:class              代表一类设备,比如mtd、net、tty等等bus         总线,比如PCI、USB、I2C等device     代表一个设备driver      代表一个驱动以下是一些sysfs中的全局变量://  /sys/c

2010-09-30 15:55:00 5988 5

转载 MFC文件操作

文件操作:二进制文件和文本文件的区别。二进制文件将数据在内存中存在的模式原封不动的搬到文件中,而文本文件是将数据的asc码搬到文件中。首先做一个读写文件的菜单,在CxxView里响应1.C的方式:fwrite:size:Item size in bytes 每次写多少个字节count:Maximum number of items to be written ,总共写几次。 FILE *p;p

2009-06-30 22:45:00 1384 2

原创 Linux移植的一般过程

前一阵子在公司移植Linux2.6到一块ARM11的开发板上,下面粗略讲讲移植Linux的一般过程。 一开始的UBOOT的移植不多说了。UBOOT最后有两种方式进入Linux,一种是使用uImage,可以在引导时附加命令行参数,但操作起来比较麻烦。另一种较简单的是使用tftp将Linux内核加载到0x80008000(默认起始地址)的地方,然后使用go命令直接跳转。我使用的是第二种方式,其

2009-04-24 22:20:00 16499

转载 C++中几个比较不常用的关键字

转自http://dev.21tx.com  mutable关键字 关键字mutable是C++中一个不常用的关键字,他只能用于类的非静态和非常量数据成员  我们知道一个对象的状态由该对象的非静态数据成员决定,所以随着数据成员的改变,  对像的状态也会随之发生变化!  如果一个类的成员函数被声明为const类型,表示该函数不会改变对象的状态,也就是  该函数不会修改类的非静态数据成

2008-04-11 17:18:00 1030

原创 实现自己的操作系统 第三部分

3-12006-1-9 23:43实现了和C函数的整合。ld -Ttext org之后的obj的顺序似乎有讲究。call 命令对堆栈的影响: 16位的实模式中,会将cs和ip压栈,因此栈会减少4。 32位的保护模式中,如果是段内调用,只会将eip压栈;如果是段间调用,会将eip和cs入栈,不过目前还没遇到过这种情况。C函数调用约定 参数从右向左入栈,在汇编中等调用完后,要手动将

2008-03-31 12:59:00 898

原创 实现自己的操作系统 第二部分

2-1实现了内存的检测。下一步:读kernel.bin到内存。目前内存信息放在8000:f000开始的4k空间中。以后此空间会被拷贝到“0页”,即0x00104000处。Linux中关于内存检测的参数在e820.h中。内存检测结果如下:00 00 00 00 00 00 00 00  00 FC 09 00 00 00 00 00 01 00 00 0000 FC 09 00 00 0

2008-03-28 13:23:00 984

原创 实现自己的操作系统 第一部分

1-1实现了一个简单的函数调用。重点是里面对栈的应用。call返回时调用ret,后面有一个数字,代表调用时有多少字节数据入栈。 1-2实现了代码的自我搬移。include不能放在文件开头,因为程序执行时是从第一行开始。(可能能够重定位,目前未知)搬移后标记的内存地址都需要重新调整。当使用短跳转或短call调用的时候,标号不需要调整,因为这里的操作数的间接地址,即两个

2008-03-27 16:29:00 797

原创 实现自己的操作系统--序

最近整理电脑,找到自己2年以前写的一个操作系统,放到网上共享一下。当时的代码有的地方看起来还比较幼稚。系统开始时的bootloader部分是参考《自己动手写操作系统》做的,那本书里面如何搭建环境写得很详细,另外还有一些PC的基本概念写的也不错,推荐大家看一下;从分段分页开始我参考了Linux2.4的风格,没有按照那本书上的走。调试环境是Virtual PC和Bochs。以下为当时写的总结:

2008-03-27 15:48:00 893

关于ELF文件格式的官方文档

关于Linux中常用的ELF文件格式的官方文档

2011-02-10

OS 1-x

详见本人blog,自己写的操作系统的第一阶段

2008-03-27

ucgui移植到windml

ucgui移植到windml的代码

2008-01-29

vxworks BSP的移植源码(lpc2210)

vxworks BSP的移植源码(lpc2210)

2007-12-28

空空如也

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

TA关注的人

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