摘要: 要想检测内存泄漏,必须对程序中的内存分配和释放情况进行记录,所能够采取的办法有重载所有形式的operator new 和 operator delete,截获 new operator 和 delete operator 执行过程中的内存操作信息。下面列出的就是重载形式 void* operator new( size_t nSize, char* pszFileName, int nLineNum )void* operator new[]( size_t nSize, char* pszFileName, int nLineNum )void operator delete( void * 阅读全文
posted @ 2013-06-02 11:37 飞奔的猪 阅读(531) 评论(0) 推荐(0)
摘要: 用户空间 在Linux中,每个用户进程都可以访问4GB的线性虚拟内存空间。其中从0到3GB的虚存地址是用户空间,用户进程可以直接访问。 内核空间 从3GB到4GB的虚存地址为内核态空间,存放供内核访问的代码和数据,用户态进程不能访问。所有进程从3GB到4GB的虚拟空间都是一样的,linux以此方式让内核态进程共享代码段和数据段。 阅读全文
posted @ 2013-06-02 11:36 飞奔的猪 阅读(173) 评论(0) 推荐(0)
摘要: 滚滚长江东四水,浪花淘净英雄。大家好,许多人和我一样,正在苦读linux源代码,希望有照一日,宝典在手,天下我有。小弟不才,也读了两年,写的几首歪诗。从本级开始,把我所理解的linux如何启动贴出来,不懂之处大家讨论一番。也希望把linux从头到尾讨论一遍,计划写它240回,三年写完(笑。。。),欢迎大家动员一些牛人来参与讨论,提高人气,增加流量。小弟用的是arm920T,跑LINUX 2。4。18,下面是第一回。。。。。长篇连载--arm linux演艺---第一回---------------------------------------------------------------- 阅读全文
posted @ 2013-06-02 11:32 飞奔的猪 阅读(294) 评论(0) 推荐(0)
摘要: 翻译: 哈少 译者按: 本文是一篇介绍 GNU Make 的文章,读完后读者应该基本掌握了 make 的用法。而 make 是所有想在 Unix (当然也包括 Linux )系统上编程的用户必须掌握的工具。如果你写的程序中没有用到 make ,则说明你写的程序只是个人的练习程序,不具有任何实用的价值。也许这么说有点儿偏激,但 make 实在是应该用在任何稍具规模的程序中的。希望本文可以为中国的 Unix 编程初学者提供一点儿有用的资料。中国的 Linux 用户除了学会安装红帽子以外, 实在应该尝试写一些有用的程序。个人想法,大家参考。 C-Scene 题目 #2 多文件项目和 GNU Mak. 阅读全文
posted @ 2013-06-02 11:30 飞奔的猪 阅读(180) 评论(0) 推荐(0)
摘要: Linux的内核配置文件有两个,一个是隐含的.config文件,嵌入到主Makefile中;另一个是include/linux /autoconf.h,嵌入到各个c源文件中,它们由make config、make menuconfig、make xconfig这些过程创建。几乎所有的源文件都会通过linux/config.h而嵌入autoconf.h,如果按照通常方法建立文件依赖关系 (.depend),只要更新过autoconf.h,就会造成所有源代码的重新编绎。 为了优化make过程,减少不必要的重新编绎,Linux开发了专用的mkdep工具,用它来取代gcc来生成.depend文件。mk 阅读全文
posted @ 2013-06-02 11:28 飞奔的猪 阅读(232) 评论(0) 推荐(0)
摘要: 1、概述Makefile 由五个部分组成:Makefile:顶层 Makefile。 .config:内核配置文件。 arch/*/Makefile:体系结构 Makefiles。 子目录 Makefile:大约三百个。 Rules.make:为所有子目录 Makefile 提供通用规则。顶层 Makefile 读入在内核配置过程中生成的 .config 文件。 顶层 Makefile 负责两个主要产品的创建:vminux (常驻内核映象) 和模块 (任何模块文件)。它通过递归下降到内核源代码树以创建这些目标。需要进入的子目录由内核配置确定。 顶层 Makefile 引入一个名为 arch/$ 阅读全文
posted @ 2013-06-02 11:27 飞奔的猪 阅读(307) 评论(0) 推荐(0)
摘要: 基本类型包括字节型(char)、整型(int)和浮点型(float/double)。定义基本类型变量时,可以使用符号属性signed、unsigned(对于char、int),和长度属性short、long(对于int、double)对变量的取值区间和精度进行说明。下面列举了基本类型所占位数和取值范围:符号属性 长度属性 基本型 所占位数 取值范围 输入符举例 输出符举例-- -- char 8 -2^7 ~ 2^7-1 %c %c、%d... 阅读全文
posted @ 2013-06-02 11:26 飞奔的猪 阅读(159) 评论(0) 推荐(0)
摘要: 直接引入我们的主角(粗体部分):int my_printf (void *my_object, const char *my_format, ...) __attribute__ ((format (printf, 2, 3)));my_printf是一个你自己写的函数,比如可能是对vsnprintf等函数进行了封装等等。粗体部分关键字“__attribute__”可以为函数声明赋属性值,其目的是让编译程序可以优化处理。关键字“__attribute__”可以为函数(Function Attributes),变量(Variable Attributes)和结构成... 阅读全文
posted @ 2013-06-02 11:25 飞奔的猪 阅读(950) 评论(0) 推荐(0)
摘要: 2.6版以前内核进程调度机制简介Linux的进程管理由进程控制块、进程调度、中断处理、任务队列、定时器、bottom half队列、系统调用、进程通信等等部分组成。进程调用分为实时进程调度和非实时进程调度两种。前者调度时,可以采用基于动态优先级的轮转法(RR),也可以采用先进现出算法(FIFO)。后者调度时,一律采用基于动态优先级的轮转法。某个进程采用何种调度算法由改进程的进程控制块中的某些属性决定,没有专门的系统用来处理关于进程调度的相关事宜。Linux的进程调度由schedule()函数负责,任何进程,当它从系统调用返回时,都会转入schedule(),而中断处理函数完成它们的响应任务以后 阅读全文
posted @ 2013-06-02 11:24 飞奔的猪 阅读(864) 评论(0) 推荐(0)
摘要: 大部分软件开发项目依靠结合代码检查、结构测试和功能测试来识别软件缺陷。尽管这些传统技术非常重要,而且能发现 大多数软件问题,但它们无法检查出当今复杂系统中的许多共性错误。本文将介绍如何避免那些隐蔽然而常见的错误,并介绍的几个技巧帮助工程师发现软件中隐藏 的错误。结构测试或白盒测试能有效地发现代码中的逻辑、控制流、计算和数据错误。这项测试要求对软件的内部工作能够一览无遗(因此称为" 白盒"或"玻璃盒"),以便了解软件结构的详细情况。它检查每个条件表达式、数学操作、输入和输出。由于需要测试的细节众多,结构测试每次检查一个软件单 元,通常为一个函数或类。代码审 阅读全文
posted @ 2013-06-02 11:23 飞奔的猪 阅读(295) 评论(0) 推荐(0)
摘要: 1. 包含头文件和定义:#define _CRTDBG_MAP_ALLOC#include <stdlib.h>#include <crtdbg.h>如果定义了_CRTDBG_MAP_ALLOC,打印出来的是文件名和行数等更加直观的信息。2. 方法一在程序入口写几个语句: int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ); tmpFlag |= _CRTDBG_LEAK_CHECK_DF; _CrtSetDbgFlag( tmpFlag );程序退出时,如果发现有内存泄漏,会自动在DEBUG OUTPUT窗口和Deb 阅读全文
posted @ 2013-06-02 11:21 飞奔的猪 阅读(241) 评论(0) 推荐(0)
摘要: 北京恒基伟业电子产品有限公司 徐 文 来自:单片机与嵌入式系统应用 摘要:介绍一个动态内存管理模块,可以有效地检测C程序中内存泄漏和写内存越界等错误,适用于具有标准C语言开发环境的各种平台。关键词:C语言 动态内存 内存泄漏 写越界引言当 前,绝大多数嵌入式平台上的软件都采用C语言编写。除了代码简洁、运行高效之外,灵活操作内存的能力更是C语言的重要特色。然而,不恰当的内存操作通常也 是错误的根源之一。如“内存泄漏” ——不能正确地释放已分配的动态内存,就是一种非常难于检测的存错误。持续的内存泄漏会使程序性能下降到最终完全不能运行,进而影响到所有其它有动态内存 需求的程序,在某些相对简单的嵌入式 阅读全文
posted @ 2013-06-02 11:20 飞奔的猪 阅读(253) 评论(0) 推荐(0)
摘要: 每个链接都由链接脚本控制着,脚本由链接器命令语言组成。脚本的主要目的是描述如何把输入文件中的节(sections)映射到输出文件中,并控制输出文件的存储布局。大多数的链接脚本就是做这些事情的,但在有必要时,脚本也可以指导链接器执行一些其他的操作。链接器总是使用链接器脚本,如果你没有提供一个你自己的脚本文件的话,编译器会使用一个缺省的脚本,而它被编译进链接器(?)。你可以使用"-verbose"命令行参数来显示缺省的链接脚本。而某些命令行选项,像"-r","-N"会影响缺省的链接脚本。在命令行选项中,通过参数"-T" 阅读全文
posted @ 2013-06-02 11:19 飞奔的猪 阅读(742) 评论(0) 推荐(0)
摘要: 动态分配的选择、折衷和实现级别: 中级Jonathan Bartlett (johnnyb@eskimo.com) 技术总监, New Media Worx2004 年 11 月 本文将对 Linux™ 程序员可以使用的内存管理技术进行概述,虽然关注的重点是 C 语言,但同样也适用于其他语言。文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半手工地管理内存,以及如何使用垃圾收集自动管理内存。为什么必须管理内存内存管理是计算机编程最为基本的领域之一。在很多脚本语言中,您不必担心内存是如何管理的,这并不能使得内存管理的重要性有一点点降低。对实际编程来 阅读全文
posted @ 2013-06-02 11:17 飞奔的猪 阅读(158) 评论(0) 推荐(0)
摘要: 1、概述 C++中出了const关键字以后,宏定义常量的功能已经不在被推荐使用。这使得宏似乎没有了用武之地。实际上,宏还可以做很多事情,笔者也难以全部列举。这里,仅仅列举几个典型的用法,希望大家能够从中获益。 2、实现多环境兼容 常见的情况是,我们实现了一个函数,希望它只在某种编译条件满足是被编译和使用。例如,我希望在源码中插入调试语句,以便以Debug方式运行时能够通过调试信息观察程序运行情况。但是,在产品发售给用户时,我又希望这些调试信息不要输出,以降低代码尺寸,提高运行性能。 这一问题的解决方法就是使用宏。根据条件编译指令,对于不同的编译条件,提供不同的实现。例如:我们希望在特定的位置向 阅读全文
posted @ 2013-06-02 11:08 飞奔的猪 阅读(282) 评论(0) 推荐(0)
摘要: njustcxy(原作)下面关于C++的几个关键字是经常和我们打交道的而我们又经常对这些含糊不清的,本文根据自己的学习体会作以总结,以期达到真正理解和活用的目的。staticl 静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可改变其值。l 静态变量或静态函数,即只有本文件内的代码才可访问它,它的名字(变量名或函数名)在其它文件中不可见。l 在函数体内生成的静态变量它的值也只能维持int max_so_far( int curr )//求至今(本次调用)为止最大值{ static int biggest; //该变量保持着每次调用时的最新值,它的有效期等 阅读全文
posted @ 2013-06-02 11:06 飞奔的猪 阅读(161) 评论(0) 推荐(0)
摘要: 第一章 前言目的本文的目的,是讲述嵌入式Linux系统的建立、开发的一般过程。制作一个小型的Linux的系统,可以移植至其它硬盘、软盘、优盘、flash rom……关于作者 九贱,E名kendo,喜欢网络入侵技术、防火墙、入侵检测技术及网络技术,对Linux也颇感兴趣,想认识有共同爱好的朋友。最近闲暇,把一些学过的东西写下来,总结总结,以作备忘这需。已完成的有《网络入侵检测设计与Snort2.2源码分析》和这篇《我也来学做嵌入式Linux》。正在进行中的有《Windows防火墙技术实现大全》和《Linux防火墙实现及源码分析》。大家可以在CU上,或者是到我的小站www.skynet... 阅读全文
posted @ 2013-06-02 11:03 飞奔的猪 阅读(496) 评论(0) 推荐(0)
摘要: 对于实时系统,如何调试是一个很难解决的问题,包括对系统内核的调试,对驱动程序的调试,对应用程序的调试等。对于应用程序,通常各集成开发环境都提供了 常规的单步跟踪等调试手段。而对于另两个的调试,Platform Builder除了为我们提供了常规的断点跟踪等手段以外,还和系统的源程序配合使用了一种新的调试手段——Debug Zones调试区。 通常,我们都是利用OutpubDebugString函数来实现调试信息的输出的,但是由于系统底层的调试信息非常繁多,如果这样大量的调试信息用于实时输出的话一定会影响到系统的性能和实时性,也就影响到了系统的运行。如果有一种方式能允许开发人员自己选择输出... 阅读全文
posted @ 2013-06-02 11:02 飞奔的猪 阅读(242) 评论(0) 推荐(0)
摘要: 1. 宏指令:#define #error #import #undef #elif #if #include #else #ifdef #line #endif #ifndef #pragma2.#define#define WIDTH 80#define LENGTH (WIDTH+10)#define test(f1,f2) (f1*f2)3.#error#error 语言符号字符串采用error指令可产生编译错误信息#if !defined(NUM_TEN)#error ten is not defined.#endif当遇到#error指令时,编译终止3.#if,#elif,#els 阅读全文
posted @ 2013-06-02 11:01 飞奔的猪 阅读(313) 评论(0) 推荐(0)
摘要: 无论是在Linux还是在Unix环境中,make都是一个非常重要的编译 命令。不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install。利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和 makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。而且如此多的源文件,如果每次都要键入gcc命令进行编译的话,那对程序员 来说简直就是一场灾难。而make工具则可自动完成编译工作,并且可以只对程序员在上次编译后修改过的部分进行编译。因此,有效的利用make和 makefile工具可 阅读全文
posted @ 2013-06-02 10:59 飞奔的猪 阅读(411) 评论(0) 推荐(0)