自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

wenqian 'blog

厚积薄发——Practice makes perfect !

  • 博客(140)
  • 资源 (7)
  • 收藏
  • 关注

原创 本博客全文目录索引

本专栏博文索引(目录)涵盖:C/C++、STL、Data Structure、Algorithm、TCP/IP、Linux(Interface/Driver/Kernel)和 Projects。 C/C++ 详解C指针 C++对象模型 深度探索C++对象内存模型 深度剖析C++虚函数 详解C++类的静态成员和C语言中的static C++拷贝构造函数与赋值函数 详解C+

2016-01-26 18:34:02 7180 8

原创 【Linux 内核网络协议栈源码剖析】系统网络协议栈初始化及数据传输通道建立过程

本文先大致阐述系统协议栈初始化过程,然后剖析数据包的接收和发送通道过程,在文章最后着重梳理其过程及通道结构区别。 源码版本:Linux kernel 1.2.13;工具:Source Insight 3.5 下图为网络协议栈初始化程序流程框架 本篇幅将根据上图来介绍系统网络协议栈的初始化过程。 先从init/main.c 文件出发,在执行了一系列涉及到具体处理器架构初始化代码

2015-08-24 19:51:02 3267

原创 TinyHTTPd--超轻量型Http Server源码分析

TinyHTTPd是一个超轻量型Http Server,使用C语言开发,全部代码不到600行,附带一个简单的Client,可以通过阅读这段代码理解一个Http Server的本质。源码下载链接http://sourceforge.net/projects/tinyhttpd/分析这段源码前,需要对网络协议,Unix编程,以及HTTP有一定的了解,这里假设大家对http有一定的了解,如果有时

2015-05-27 13:14:34 8210 7

原创 深度剖析C++虚函数

前面探索了C++对象的内存模型,其中简单的涉及到了虚函数,作为C++实现其多态的一个重要机制,这里进一步探索下虚函数机制,以前也看过网络上关于虚函数机制的一些精彩的文章,但现在决定自己再分析这个虚函数机制以加深理解,看与自己动手探索还是有区别的。

2014-11-27 20:57:40 1986 1

原创 深度探索C++对象内存模型

前面简单的论述过C++对象模型,总觉得不够深入,现近闲来进一步挖掘C++对象内存布局情况。主要讨论:单一继承,多重继承,钻石继承的有无虚函数以及虚拟继承的情况。贴出测试程序,并给出测试结论以及对应的类对象的大小计算。(PS:类对象的内存布局取决于编译器,这里的测试都是基于Visual Studio)

2014-11-14 21:48:15 2177

原创 详解C指针

基础的东西经过很长时间积累而且还会在未来至少10年通用。指针是一个特殊的变量,它里面存储的数值被解释成为内存(用户空间的虚拟内存)里的一个地址。一、指针的属性一个指针包含四个方面的内容:指针的类型、指针所指向的类型、指针所指向的内存区、指针本身所占据的内存区。接下来就下面几个例子作说明:1、 int *p;2、 char *p;3、 int **p;4、 int (*p)[3];5、 in

2016-01-17 15:29:17 3817 3

原创 C语言内存管理:malloc、calloc、free的实现

任何一个对C稍稍有了解的人都知道malloc、calloc、free。前面两个是用户态在堆上分配一段连续(虚拟地址)的内存空间,然后可以通过free释放,但是,同时也会有很多人对其背后的实现机制不了解。 这篇文章则是通过介绍这三个函数,并简单的予以实现,对比现有C的标准库实现(glibc等)相比,并不是特别高效,我们重在阐述背后的基本原理。一、C程序的存储空间布局图1 text:整个用户空间的最低

2016-01-03 21:07:35 13524 3

原创 【Linux 驱动】Netfilter/iptables (八) Netfilter的NAT机制

NAT是Network Address Translation的缩写,意即“网络地址转换”。从本质上来说,是通过修改IP数据首部中的地址,以实现将一个地址转换成另一个地址的技术。当然在某种情况下,修改的不仅仅是IP首部的来源或目的地址,还包括其它要素。 随着接入Internet的计算机数量不断猛增,IP地址资源也就愈加显得捉襟见肘。这也是Ipv6出现的一大原因。我们现在所有的IP地址是32位,意味

2015-12-27 21:28:08 3294 1

原创 【Linux 驱动】Netfilter/Iptables (七) 内核协议栈skb封装分析(续六)

上文介绍了netfilter机制下,如何重造并发送一个skb,涉及到内核协议栈编程,而不是我们平时所说的用户层socket网络编程。我们先来介绍下上面skb重构程序涉及到的几个函数: 首先,有必要说下,也是后面每段程序中都有说道的,就是开发源码树版本是3.13的,这个版本的skb_buff和我们常见的2.4、2.6有很大的不同。一、主要看一下四个字段://typedef unsigned int

2015-12-25 15:24:57 3411

原创 【Linux 驱动】Netfilter/iptables (六) 内核协议栈编程(发送skb)

内核态基于 Netfilter 构造skb数据包 前面第四篇介绍了 Netfilter Hook 机制,我们知道了数据包在协议栈中传递时会经过不同的HOOK点,而每个HOOK点上又被Netfilter预先注册了一系列hook回调函数,每个数据包经过时都会经过这些hook函数的处理。在hook回调函数中,你可以进行任何操作,这些操作你都可以自定义,然后以模块的形式加载进去。这里我们给出一个实例:每收

2015-12-25 10:33:22 5281

原创 【Linux 驱动】Netfilter/iptables (五) 数据包过滤

通过前面的学习,我们窥探了整个Netfilter框架,下面我们就通过一些编程实例来进一步学习。一. 基于网络设备接口进行数据包过滤 根据hook函数接收的参数中的 struct net_device 结构,net_device 结构体用于描述网络接口设备,其中name这个成员表示对应设备的名字,我们可以通过比对来判断数据包的源接口或目的接口。/*安装一个丢弃所有进入我们指定接口的数据包的 netf

2015-12-22 14:48:45 7523

原创 【Linux 驱动】Netfilter/iptables (四) 窥探 Netfilter Hook 机制

上篇文章介绍了注册和注销Netfilter/iptables,其中对于hook函数,我们没有具体到数据包的规则处理,直接一律来者皆拒(NF_DROP)。ok,我们接着前面,深入探索下hook函数:typedef unsigned int nf_hookfn(const struct nf_hook_ops *ops, struct sk_buff *s

2015-12-22 14:46:00 3705 1

原创 【Linux 驱动】netfilter/iptables (三) 注册和注销Netfilter hook

继前面介绍了 netfilter hook,这里我们开始进行实例讲解: wqlkp.c:#include <linux/module.h>#include <linux/kernel.h>#include <linux/netfilter.h>#include <linux/netfilter_ipv4.h>MODULE_LICENSE("Dual BSD/GPL");static stru

2015-12-22 10:58:37 3387 1

原创 【Linux 驱动】netfilter/iptables (二) Netfilter hook 数据结构

Netfilter是Linux 2.4.x 引入的一个子系统,它作为一个通用的、抽象的框架,提供一整套的hook函数的管理机制,使得诸如数据包过滤(filter)、网络地址转换(NAT)和基于协议类型的链接跟踪成为了可能。这些功能仅通过使用内核网络代码提供的各式各样的hook函数完成。对于数据在网络协议栈中的传送过程,前面我们花了较大篇幅,从原理到内核源码剖析了数据包在整个协议栈的传送过程,包括发送

2015-12-22 10:57:22 4442

原创 【Linux 驱动】netfilter/iptables (一) 基础概念

在介绍netfilter/iptables之前,我们先来了解下防火墙: 防火墙是指设置在不同网络或网络安全域之间的一系列部件的组合,它能增强机构内部网络的安全性。它通过访问控制机制,确定哪些内部服务允许外部访问,以及允许哪些外部请求可以访问内部服务。它可以根据网络传输的类型决定IP包是否可以传进或传出内部网。 防火墙通过审查经过的每一个数据包,判断它是否有相匹配的过滤规则,根据规则的先

2015-12-20 13:15:40 3527

原创 【Linux 驱动】中断处理(一)上半部

关于中断大家应该很熟悉,无论是操作系统的学习也好还是微机原理也好都会接触到中断。以前进行单片机单板开发的时候,会有外部中断,定时器中断以及串口中断,就是有一个事件触发(外部中断则是外部有按键触发(边缘触发和水平触发),串口中断则是串口有数据输入,定时器中断则是内部设置一个定时器,时间到了就触发),然后就去调用对应的中断处理函数。在此之前,需要保护现场,保存中断发生时的状态,比如寄存器,堆栈,各种变量

2015-12-20 10:43:00 2010 1

原创 【Linux 驱动】中断处理(二)下半部tasklet

前面我们介绍了Linux驱动的[中断处理程序机制]由于其本身存在一些局限,所以它只能完成整个中断处理流程的上半部分。这里我们则着重介绍下半部。

2015-12-17 16:23:28 1180

原创 【Linux 驱动】异步通知机制

异步通知机制:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,是一种“信号驱动的异步I/O”。信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候会到达。我们试图通过两个方面来分析异步通知机制: 从用户程序的角度考虑

2015-12-16 22:41:26 3440 1

原创 【Linux驱动】内存管理

关于linux内存管理的概念请参考笔者前面的博文: linux内存管理(一)基础篇 linux内存管理(二)伙伴算法 linux内存管理(三)slab分配器下面的驱动程序中的函数的区别,以及对应的函数介绍请参考第一个链接(linux内存管理基础篇)#include <linux/module.h>#include <linux/types.h>#include <linux/init.h>

2015-12-15 20:28:19 1468

原创 【Linux驱动】轮询操作select()和poll()

使用非阻塞I/O的应用程序通常会使用select()和poll()系统调用查询可对设备进行无阻塞的访问。select()和poll()系统调用最终会引发设备驱动中的poll()函数被执行。 select()和poll()系统调用的本质是一样的。本系列只关注设备驱动中的函数层,对于应用层具体请参考《APUE》或《TLPI》(linux/unix系统编程手册),楼主手上就有这两本书,在编写应用态测试

2015-12-12 15:27:40 4059

原创 【Linux驱动】阻塞型I/O(一)

校招结束很久了,回顾校招,除了阿里的笔试没通过以后,其余的均通过了笔试拿到面试机会(海康威视由于进错考场考错了试卷,没有拿到面试资格,不过后面去霸面,最后顺利拿到offer),在拿到几个还算重量级的offer以后,后面就开始休息了,大家都说今年的就业形势很艰难,说实话我没怎么感觉到,九月底底扎堆的公司太多了,曾记得,一天参加六场笔试+面试,不得不放弃一些面试,有舍有得嘛。 闲来无事,学习下linu

2015-12-11 21:19:35 1218

原创 【Linux驱动】阻塞型I/O(二+并发控制)

承接上文,这里继续学习linux内核驱动并发控制阻塞型I/O。 废话不多说,直接看代码,基础接口函数请自行查阅相关资料,比如《LDD》。 另外并发控制信号量和linux应用层的信号量概念和原理是差不多的,在内核态使用有所差别而已。

2015-12-11 20:49:57 1150

原创 【Linux驱动】字符设备驱动

本文假定读者具备一定linux基础以及对linux驱动基础有所了解。➜ ~ cat /proc/versionLinux version 3.13.0-43-generic (buildd@akateko) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #72-Ubuntu SMP Mon Dec 8 19:35:44 UTC 2014globa

2015-12-04 12:41:18 1161

原创 【Linux 内核】文件系统(四)

本篇将在前面的基础上,再次通过剖析虚拟文件系统以及更下层文件系统结构,主要是基于结构篇深度剖析。Linux内核的应用层就是以文件系统为核心而展开的。文件系统在整个内核架构中具有基础架构性质,字符设备、块设备这些设备驱动的概念都要依靠文件系统来实现。进阶篇说到了存储设备分区,引导区、超级块区、inode table区以及数据块区。引导区主要是为计算机开机服务的。我们这里略过,先看1、

2015-11-03 19:08:36 1329

原创 【Linux 内核】文件系统(进阶篇)

前面相继介绍文件系统的概念以及Linux内核中与文件系统相关的数据结构及文件系统内部大致关联以及虚拟文件系统,这里我们进一步剖析我们应用操作时是如何与文件系统挂钩的。上一篇最后有说道,要访问一个文件就得先访问一个目录,才能根据文件名从目录中找到该文件的目录项,进而找到其inode节点。这里我们以绝对路径访问方式来具体看看其流程是如何的:假如根据绝对路径寻找文件/tem/temp/wenqian的:1

2015-11-02 11:57:30 1637

原创 【Linux 内核】文件系统(结构篇)

ok,继前面概念篇之后,我们开始正式的探讨下Linux的文件系统。 文件系统是对一个存储设备上的数据和元数据进行组织的机制(教材式还是需要的),在前面的概念篇有说到,Linux支持大多数文件系统,可以预料到Linux文件系统接口实现为分层的体系结构,从而将用户接口层、文件系统实现和操作存储设备的驱动程序分隔开。Linux源码(Linux/fs文件夹下)下会有Linux支持的各种文件系统的代码实现,

2015-11-02 09:46:54 5634

原创 【Linux 内核】文件系统(概念篇)

一、开篇Linux下的文件系统为树形结构,入口为/(根目录)树形结构下的文件目录,Linux发行版本之间的差别很少,差别主要表现在系统管理的特色工具以及软件包管理方式的不痛,目录结构基本上是一样的。Windows的文件结构是多个并列的树形结构,最顶部的是不同的磁盘(分区),如:C,D,E,F盘等,目录结构属于分区,启动时检测不同的分区并被赋予一个分区字母。而在Linux下,只有一个单独的顶级目录结构

2015-11-01 12:04:46 2806

原创 最短路径——迪科斯彻算法(Dijkstra)算法

迪科斯彻算法(Dijkstra)是有荷兰计算机科学家艾兹格·迪科斯彻(Edsger Wybe Dijkstra)发明的。算法解决的是有向图中单个源点到其他顶点的最短路径问题。算法描述这个算法是通过为每个顶点 v 保留目前为止所找到的从s到v的最短路径来工作的。初始时,原点 s 的路径长度值被赋为 0 (d[s] = 0),同时把所有其他顶点的路径长度设为无穷大,即表示我们不

2015-08-01 13:36:13 5525

原创 【数据结构】图的邻接矩阵存储实现

图的邻接表存储实现:http://blog.csdn.net/wenqian1991/article/details/24667287图的邻接表DFS和BFS算法:http://blog.csdn.net/wenqian1991/article/details/24812393这里则介绍图的另外一种存储方式:邻接矩阵。参考资料《大话数据结构》《C算法:卷二》一、图的数据结构图的邻接

2015-07-29 11:05:53 8099

原创 【数据结构|剑指Offer】单向链表的各项操作实现

本博文着重实现《剑指Offer》上面的单向链表操作。//数据结构struct ListNode{ int data; ListNode *next; ListNode(int x) :data(x), next(NULL) {}};//在链表尾部添加结点void AddToTail(ListNode **pHead, int value){ ListNode *pNew =

2015-07-27 12:10:44 956

原创 【设计模式】单例模式(singleton pattern)

单例模式(singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。如何保证一个类只有一个实例并且这个实例易于被访问呢?一个全局变量使得一个对象可以被访问,但它不能防止你实例化多个对象。一个更好的办法是,让类自身负责保存它的唯一实例,这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法,这就是 Singleton 模式。Singleton 类UML图

2015-07-21 21:52:38 778

原创 【Linux 内核网络协议栈源码剖析】recvfrom 函数剖析

继前篇介绍完sendto 数据发送函数后,这里介绍数据接收函数 recvfrom。一、应用层——recvfrom 函数对于这个函数有必要分析一下,先看看这个dup例子。服务器端中调用recvfrom函数,并未指定发送端(客户端)的地址,换句话说这个函数是一个被动函数,有点类似于tcp协议中服务器listen 之后阻塞,等待客户端connect。这里则是服务器端recvfrom后,等待客户端

2015-07-16 19:14:26 16101

原创 【Linux 内核网络协议栈源码剖析】sendto 函数剖析

前面介绍的函数基本上都是TCP协议的,如listen,connect,accept 等函数,这都是为可靠传输协议TCP定制的。对于另一个不可靠udp协议(通信系统其可靠性交由上层应用层负责),则主要由两个函数完成,sendto 和 recvfrom 函数。这里先介绍 sendto 函数。对于 udp 协议的介绍和编程实现请参考下文:UDP 客户/服务器简单 Socket 程序简要介绍下UD

2015-07-16 10:24:43 12219 4

原创 【Linux 内核网络协议栈源码剖析】ARP地址解析协议

ARP地址解析协议理论前篇参见ARP与RARP,这里则通过源码(Linux kernel 1.2.13;net\inet\arp.c)来剖析其内部原理及实现过程。

2015-07-09 20:54:20 6717 2

原创 【Linux 内核网络协议栈源码剖析】accept 函数剖析

好,tcp 协议建立连接的几个函数到这,就还差个accept 函数,这里直接贴代码了,不再向前面那般赘述了。一、应用层——accept 函数该函数返回一个已建立连接的可用于数据通信的套接字。#include int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);//返回:非负描述子——成功,-1——

2015-07-07 21:55:56 4582 1

原创 【Linux 内核网络协议栈源码剖析】数据包接收(含TCP协议状态变换)

接前文connect 函数剖析(一)接收数据包函数,release_sock 函数是在 sock.c中,该函数是在 inet socket 层,其内部的数据结构为 sock 结构该函数被 tcp_connect 函数最后调用,用于接收数据包//如果对应的套接字正忙或被中断,则将数据包暂存到sock结构back_log队列中,这不能算被接收//数据包要插入receive_queue

2015-07-07 21:39:28 4848

原创 【Linux 内核网络协议栈源码剖析】connect 函数剖析(二)

网络层——ip_build_header 函数前篇(跳跃有点大,记得理清思路找到被调用位置,参见connect(一))介绍的 tcp_connect 函数内部调用了 build_header函数,实则是ip层的 ip_build_header 函数,该函数的主要功能是创建合适的 mac和ip头部/* * This routine builds the appropriate hard

2015-07-07 15:14:03 2036

原创 【Linux 内核网络协议栈源码剖析】数据包发送

release_sock 函数是在 sock.c中//如果对应的套接字正忙或被中断,则将数据包暂存到sock结构back_log队列中,这不能算被接收//数据包要插入receive_queue中才能算真正完成接收//release_sock函数则是从back_log中取数据包重新调用tcp_rcv函数对数据包进行接收void release_sock(struct sock *sk)

2015-07-06 10:53:12 4737

原创 【Linux 内核网络协议栈源码剖析】connect 函数剖析(一)

TCP客户用 connect 函数来建立与 TCP 服务器的连接,其实是客户利用 connect 函数向服务器端发出连接请求。1、应用层——connect 函数#include int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);/*sockfd是由socket函数返回的套接口描述字,第

2015-07-02 09:17:03 5034

原创 【Linux 内核网络协议栈源码剖析】listen 函数剖析

listen 函数仅供服务器端调用,把一个未连接的套接字转换为一个被动套接字,指示内核应接受指向该套接字的连接请求。1、应用层——listen 函数#include int listen(int sockfd, int backlog);/*sockfd是bind之后的套接口描述字,第二个参数规定了内核应该为相应套接口排队的最大连接个数*/2、BSD Socket 层——sock_li

2015-07-01 18:48:15 2845

排序二叉树完整代码

本代码涵盖二叉查找树的创建,插入,删除,添加,遍历等操作,结合http://blog.csdn.net/wenqian1991/article/details/18228309 可理解

2014-03-01

proteus8086实验指导书

8086的proteus仿真 实验指导书,比干巴巴的看编译器仿真好多了

2012-05-13

微机原理与接口技术重点难点及典型题精解

西交大出版的,同系列的电气类书籍都不错,市面上关于微机的参考书籍比较少(除教材配套的),

2012-04-04

C++项目实践

如题目所言,不过里面只有一个大型的C++开发项目,工资管理系统开发

2012-02-20

数据结构与算法分析 C++描述

很好的资料,正如题目所描述的那样,非常经典的一本书

2012-02-18

J-Link用户手册(中文)

J-Link用户手册(中文) 笔记本调试arm开发板

2011-05-24

空空如也

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

TA关注的人

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