自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Whisper_J的专栏

愿得一人,说彼平生

  • 博客(35)
  • 资源 (1)
  • 收藏
  • 关注

原创 红黑树 reb-black tree(ngnix实现接口分析)

比较好的介绍:https://baijiahao.baidu.com/s?id=1641940303518144126&wfr=spider&for=pc红黑树是自平衡二叉查找树。一、特性:1. 节点只有2种颜色:红色或者黑色2. 根节点必须是黑色3. 每个叶子的节点都是黑色的空节点(NULL)4. 每个红色节点的两个子节点都是黑色的,任何一条路径上不允许连续红色节点。5. 从任意节点到其每个叶子的所有路径都包含相同的黑色节点。二、nginx的红黑树实现.

2020-06-24 15:34:38 273

转载 Ring Buffer

不错的基础知识,转载自https://www.embedded.com/ring-buffer-basics/The ring buffer's first-in first-out data structure is useful tool for transmitting data between asynchronous processes. Here's how to bit bang one in C without C++'s Standard Template Library.T.

2020-06-24 10:42:08 515

原创 C语言数组地址

在C语言中,数组名,数组首元素地址,数组名地址都是一样的。 1 #include <stdio.h> ...

2020-04-16 22:43:30 1220

原创 C语言宏定义函数中的#和##

在C语言中,经常通过宏定义#define来定义一些常量或者函数。1、对于常量定义,如:#define MAX_BUF 1024#define NAME "whisper"会在宏展开的时候,将所有MAX_BUF处替换为1024.2、对于宏定义的函数,如:#define max(a,b) ((a > b)?a,b)#define ma...

2020-04-15 22:17:57 577

转载 json-c开发指南

网上看到的一片关于json-c的文章。收藏一下,忘记了出处,尽请作者谅解。JSON c语言开发指南     引言本文档是基于json-c 库对数据交换进行开发所编写的开发指南,及详细解释json-c库中常用api。 适用于开发人员使用c语言对json的编程。  (注:  此文档json-c库版本为0.8——json-c-0.8)     JSON简介JSON(J...

2018-08-17 18:36:53 341

转载 【iMX6QD】 How to Add 24-bit LVDS Support in Android

Introduction LVDS display panel driving data flow:Display quality:To get the best display quality for 24bit LVDS display panel in Android, we should use 32bitframebuffer, make IPUv3 disp

2013-09-23 13:29:48 2517

转载 intel 网卡点滴

S = PCI - copperEF = PCI express - fibrePF = PCI express - fibreET = PCI express - copperPT = PCI express - copperXF = PCI-X - fibreMF = PCI-X - fibreMT = PCI-X - copperGT = PCI-X

2013-06-08 16:17:52 944

转载 结构体和位域对齐的原则(3/5原则)

C语言结构体对齐问题详解测试环境32位机 WinXP:编译器VC6(MS cl.exe ) 和 mingw32-gcc-4.5.2 1 结构体数据对齐(没有#pragma pack()宏定义)结构体对齐可以总结为三个基本原则①数据成员对齐规则: 结构体的数据成员中,第一个成员从offset为0的地址开始,以后每一个成员存储的起始位置为该成员大小的整数倍(在win32中i

2013-05-04 16:01:44 1128

转载 C语言中结构体的对齐

<!--p {margin-bottom:0.08in; direction:ltr; color:rgb(0,0,0); text-align:justify}a:link {color:rgb(0,0,255)}-->C语言结构体的字节对齐原则为什么要对齐?现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访

2013-05-04 15:58:56 1185

转载 通过/proc访问内核空间

最初开发 /proc 文件系统是为了提供有关系统中进程的信息。但是由于这个文件系统非常有用,因此内核中的很多元素也开始使用它来报告信息,或启用动态运行时配置。/proc 文件系统包含了一些目录(用作组织信息的方式)和虚拟文件。虚拟文件可以向用户呈现内核中的一些信息,也可以用作一种从用户空间向内核发送信息的手段。实际上我们并不会同时需要实现这两点,但是本文将向您展示如何配置这个文件系统进行输入和

2013-03-12 14:04:45 1400

原创 NAPI

内核为网络设备提供了NAPI机制来代替tasklet等。=======napi_struct结构体======【位置】include/linux/netdevice.h/*  * Structure for NAPI scheduling similar to tasklet but with weighting  */  struct napi_struct {  _

2013-03-05 16:50:16 2295

原创 网卡驱动:设备挂起恢复-netif_device_attach/netif_device_detach

在网卡驱动程序中通常需要实现suspend和resume函数来支持设备的挂起和恢复操作。网络驱动程序可以用两个函数来告知网络子系统网络设备的挂起和恢复:1】netif_device_attach2】netif_device_detachNETIF_DEVICE_ATTCH:【作用】将net_device的state中的__LINK_STATE_PRESENT置位。同时开

2013-03-05 15:02:50 4234

原创 网卡驱动:载波检测-netif_carrier_ok/netif_carrier_on/netif_carrier_off

网卡在物理上具有载波侦听的功能,当网络连接完整或者网络链接断开时,网卡芯片硬件会自动设置寄存器标志位来标识。如网线链接断开的时候,会将LinkSts清位;重新链接网线,则硬件自动将此位置位。这样,在网卡驱动中读写该位信息就可一判断网络是否链接通路。网卡驱动程序通过netif_carrier_on/netif_carrier_off/netif_carrier_ok来和内核网络子系统传递

2013-03-05 14:39:15 18101

原创 网卡驱动:传输超时watchdog_timeo/ndo_tx_timeout

网络子系统提供了对传输超时的处理框架,在驱动程序中要支持传输超时处理,只需要实现net_device的watchtimeo和net_device_ops中的ndo_tx_timeout函数。1】watchdog_timeo【作用】用于实现传出超时的时间设定。1】ndo_tx_timeout【作用】在发送队列停止(netif_queue_stopped(dev)返回1),且watch

2013-03-05 10:33:36 7528

原创 网卡驱动:数据包发送的流控机制-netif_start_queue/netif_wake_queue/netif_stop_queue

在网卡驱动中,内核为发送数据包的流量控制提供了几个主要的函数,用来在驱动程序和内核之间传递流控信息。主要有三个:1】netif_start_queue2】netif_wake_queue3】netif_stop_queue4】netif_queue_stoppedNETIF_STOP_QUEUE:【作用】在驱动程序中调用这个函数来告诉内核的网络子系统,当前网

2013-03-05 09:56:21 16379 1

转载 sk_buff

从网上转载了一篇讲sk_buff的文章,讲的很清楚,最棒的是还有图。sk_buff结构可能是linux网络代码中最重要的数据结构,它表示接收或发送数据包的包头信息。它在中定义,并包含很多成员变量供网络代码中的各子系统使用。 这个结构在linux内核的发展过程中改动过很多次,或者是增加新的选项,或者是重新组织已存在的成员变量以使得成员变量的布局更加清晰。它的成员变量可以大致分为以下几类:

2013-03-04 22:02:58 4762

转载 linux的时间与时钟中断处理

转载地址:http://blog.sina.com.cn/s/blog_62401233010118et.html本文主要介绍在Linux下的时间实现以及系统如何进行时钟中断处理。一.      Linux的硬件时间PC机中的时间有三种硬件时钟实现,这三种都是基于晶振产生的方波信号输入。这三种时钟为:(1)实时时钟RTC( Real Time Clock) (2)可编程间隔器PIT(P

2012-09-28 16:13:45 2221

原创 linux时间管理 之 内核定时器

1、内核定时器的定义    struct timer_list {           /*           * All fields that change during normal runtime grouped to the           * same cacheline           */           struct list_head

2012-09-28 15:26:26 638

原创 linux时间管理 之 延时操作

1、有时候为了同步CPU与外设的速度问题,带来了延时操作。     延时可以分为长延时和断延时。2、长延时      a、忙等待            while(i--)            优点:简单            缺点:i、忙等待,CPU效率低                       ii、内核允许抢占时,时间不精确      b、让出处理器

2012-09-27 20:17:37 874

原创 linux时间管理 之 jiffies

1、jiffies     又称时钟滴答,是一个全局变量,它的值在系统引导的时候初始化为0,在时钟中断初始化完成后,每次时钟中断发生,在时钟中断处理例程中都会将jiffies的值 +1。     jiffies_64:为了解决jiffies溢出问题,更重要的是通过jiffies_64可以知道自开机以来的时间间隔。2、HZ     HZ表示时钟中断发生的频率。可以在.config

2012-09-27 17:44:35 7255

原创 linux内存管理 之 DMA

1、DMA:直接内存访问                 用于在主存贮器和设备内存之间的大量数据的交换,无须CPU参与,可以提高系统效率。2、内核中的DMA层struct dma_map_ops {  ____void* (*alloc_coherent)(struct device *dev, size_t size,  ________________dma_addr_t

2012-09-27 11:06:10 2511

原创 linux虚拟内存管理 之 内存映射

1、内存映射主要是将用户空间的MMAP区域的虚拟地址空间映射到物理内存或者设备内存和IO空间     主要通过file_operation中的mmap来实现用户空间对设备内存的直接访问。2、设备缓存与设备内存      设备缓存:驱动程序分配管理的一段物理内存,是主内存RAM中的一部分。      设备内存:是设备自带的存贮空间,是设备的一部分      设备缓存与设备

2012-09-26 10:31:19 1484

原创 linux内存管理 之 虚拟内存管理

1、虚拟内存空间的划分32位系统,1-4G的虚拟内存空间中,1-3G是用户空间,3G-4G是内核空间。内核空间分为几个部分:物理内存直接映射区(PAGE_OFFSET-----highmem)                                         VMALLOC区(VMALLOC_START-----VMALLOC_END)

2012-09-24 13:08:37 775

原创 linux内存管理 之 slab分配器

1、页面分配器是页面级的内存分配工具,能分配2的order次幂的连续物理内存。     linux在页面级内存分配的基础上,开发了小内存分配方案--slab、slob、slub。     后两者分別针对大型系统和嵌入式系统。 2、slab分配器的思想      先利用页面分配器分配出单个或者一组连续的物理页面,然后在此基础上将整块页面分割成多个相等的小内存单元,以满足小内存

2012-09-24 11:19:24 697

原创 linux内存管理 之 页面分配器page allocator

1、a、物理内存分配的page allocator 是页面级的内存分配,是建立在页面伙伴关系的基础上的分配方式。             只能分配2 order次方大小的物理页面。           mem_map、物理内存、虚拟地址空间的关系如下图:          TODO     b、内存分配的两个基本函数           alloc_pages

2012-09-21 17:04:30 1083

原创 linux内存管理 之 物理内存管理

1、linux对物理内存的管理分为 内存节点、内存区域、内存页面对内存管理总体上分成两大部分:最底层的是页面级内存管理,然后是基于页面级内存管理之上的slab内存管理。2、内存节点a、内存节点是为了实现UMA和NUMA架构UMA: 一致内存访问NUMA:非一致内存访问struct pglist_data 来表示单个内存节点。3、内存区域zonestr

2012-09-21 15:26:44 765

原创 linux 之 等待队列

1、等待队列由等待队列头和队列节点构成,当进程要获得某一资源而暂时不能得到时候,进程可以进入睡眠状态内核为此要生成一个队列节点,并将睡眠的进程挂到等待队列中。2、等待队列头wait_queue_head_tstruct __wait_queue_head {         spinlock_t lock;         struct list_head task_l

2012-09-21 10:10:38 466

翻译 linux互斥与同步 之 原子变量和位操作

1、有时候要保护的共享资源是一个简单的变量,可以通过架构相关的原子命令来实现互斥2、atomic_t的定义typedef struct {             int counter;}3、在Linux系统中,atomic_打头的是原子操作函数,这些函数的实现都依赖于特定的硬件平台。static inline void atomic_inc(atom

2012-09-20 16:34:44 949

翻译 linux互斥与同步 之 顺序锁

1、顺序锁seqlock的思想对某一共享数据在读取的时候不加锁,写的时候加锁。引入一顺序值sequence,读取者在开始读取前读取该变量的值,在读取后再次读取该值,如果两次读取的值不一致,说明在读取期间数据发生变化,读取无效。写入者通过自旋锁做写入者之间的互斥。每次写入前,将sequence值加1,写入之后,再次将sequence值加1。在学如过程中spinlock对其他写入者互斥

2012-09-20 16:23:04 890

原创 linux互斥与同步 之 互斥锁

1、互斥锁的定义互斥缩mutex是在semaphore的基础上将struct semaphore中的count设为1而演化而来的。在此基础上做了优化。struct mutex { ____/* 1: unlocked, 0: locked, negative: locked, possible waiters */ ____atomic_t________count; __

2012-09-20 14:27:45 533

原创 linux互斥与同步 之 信号量 读写信号量

1、信号量的定义struct semaphore {           spinlock_t       lock;           unsigned int    count;           struct list_head   wait_list;}lock是一个自旋锁,保证对count操作时的原子性。count表示可以同时获得信号量而进入临界区的执

2012-09-20 11:47:01 1158

转载 linux互斥与同步 之 自旋锁读写锁

并发导致对共享资源的竞态1、并发的来源a、进程与中断处理路径之间的竞态b、调度器可抢占性导致的同一个处理器上进程间的竞态c、多处理器系统进程在不同处理器上并发执行导致的竞态(是严格意义上的并发)2、对于单处理器,不可抢占式内核 主要的竞态是由进程和中断处理例程的对资源的竞争引起的。可用local_irq_enable和local_irq_disable来解决。loc

2012-09-19 17:50:05 815

转载 Linux I/O资源

3.1 Linux对I/O资源的描述3.2 Linux对I/O资源的管理    3.2.1 I/O资源的申请    3.2.2 资源的释放    3.2.3 检查资源是否已被占用    3.2.4 寻找可用资源    3.2.5 分配接口allocate_resource()    3.2.6 获取资源的名称列表3.3 管理I/O Region资源    3.3

2012-08-21 17:23:35 1861

转载 linux mips 启动分析

系统加电起动后,MIPS处理器默认的程序入口是0xBFC00000,此地址在无缓存的KSEG1的地址区域内,对应的物理地址是0x1FC00000,即CPU从0x1FC00000开始取第一条指令,这个地址在硬件上已经确定为FLASH的位置,Bootloader将Linux内核映像拷贝到 RAM 中某个空闲地址处,然后一般有个内存移动操作,目的地址在arch/mips/Makefile内指定:co

2011-12-05 11:34:30 908

转载 apt-get使用

1.修改source list文件配置文件是/etc/apt/sources.list在文件中添加如下的两行deb ftp://ftp.iitm.ac.in/debian/ stable maindeb-src ftp://ftp.iitm.ac.in/debian/ stable main这两个位于印度的服务器,下载的速度很快。2.apt-get update用于获取最新

2011-12-01 13:08:02 1340

空空如也

空空如也

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

TA关注的人

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