摘要: 第11章 磁盘管理工具11.1 df指令:报告磁盘空间使用情况11.2 fdisk指令:Linux下的硬盘分区工11.2 fdisk指令:Linux下的硬盘分区工11.3 parted指令:强大的硬盘分区工具11.4 mkfs指令:创建文件系统11.5 badblocks指令:查找磁盘坏块11.6 partprobe指令:确认分区表的改11.7 convertquota指令:转换老的磁盘11.8 grub指令:多重引导程序grub的sh11.9 lilo指令:Linux引导加载器11.10 mkbootdisk指令:创建引导软盘11.11 hdparm指令:读取并设置硬盘参11.12 mkin 阅读全文
posted @ 2014-02-23 17:41 cgj 阅读(208) 评论(0) 推荐(0) 编辑
摘要: 1. 引言:这篇文章提供了一种增加自定义系统调用或劫持原有的系统调用的实现方法,只针对 linux 系统。主要思路是获取系统调用表 sys_call_table 地址,然后用新函数地址覆盖系统调用表某个元素的值,最终代码可以以modules的模式使用,也可以直接编译进内核使用。2. 获取系统调用表基地址的方法:cat System.map | grep "sys_call_table"3. 获取了系统调用表基地址后,如果直接修改这个表,会报错unable to handle kernel paging request at XX,这里引出本文主要要说清楚的一个问题:系统调用 阅读全文
posted @ 2014-02-23 16:15 cgj 阅读(975) 评论(0) 推荐(0) 编辑
摘要: 转:http://hi.baidu.com/clivestudio/item/4341015363058d3d32e0a952值得玩味的一篇分析程序链接、装载、动态链接细节的好文档导读:by falcon2008-02-26 Linux支持动态连接库,不仅节省了磁盘、内存空间,而且可以提高程序运行效率[1]。不过引入动态连接库也可能会带来很多问题,例如动态连接库的调试[4]、升级更新[5]和潜在的安全威胁[6][7]。这里主要讨论符号的动态链接过程,即程序在执行过程中,对其中包含的一些未确定地址的符号进行重定位的过程[3][8]。 本篇主要参考资料[3]和[8],前者侧重实践,后者侧重原理,把 阅读全文
posted @ 2013-12-31 18:03 cgj 阅读(1268) 评论(0) 推荐(0) 编辑
摘要: 偶然中发现,下面的两端代码表现不一样void main(){ void* p1 = malloc(32); free(p1); free(p1); // 这里会报double free 错误,程序退出}void main(){ void* p1 = malloc(32); void* p2 = malloc(32); free(p1); free(p2); free(p1); // 正常没有报错 free(p2);//正常,没有报错 ...}我就开始疑惑,难道glibc malloc库对doublefree错误的检测那么傻B,只有连续两次free的指针一样才能检测出来?然... 阅读全文
posted @ 2013-12-15 18:21 cgj 阅读(1855) 评论(0) 推荐(0) 编辑
摘要: linux 下面查看内存有多种渠道,比如通过命令 ps ,top,free 等,比如通过/proc系统,一般需要比较详细和精确地知道整机内存/某个进程内存的使用情况,最好通过/proc 系统,下面介绍/proc系统下内存相关的几个文件单个进程的内存查看 cat /proc/[pid] 下面有几个文件: maps , smaps, statusmaps 文件可以查看某个进程的代码段、栈区、堆区、动态库、内核区对应的虚拟地址,如果你还不了解linux进程的内存空间,可以参考这里。下图是maps文件内存示例 Develop>cat /proc/self/maps 00400000-0040b0 阅读全文
posted @ 2013-12-04 17:44 cgj 阅读(25011) 评论(1) 推荐(1) 编辑
摘要: 背景:不同产品组将其功能编译为.so,这些.so 可以加载到统一的基础平台上运行,如果产品组代码有改动,只需要更新对应的.so问题:如何动态加载.so文件,并使用里边的函数/类 ?解决方法1: 使用类的多态特性,将各种产品功能抽象为“工作类”,这些“工作类”都继承一个“动态加载基类”,然后定义纯C的类创建和销毁函数,产品功能.so加载进来后,基础平台寻找创建和销毁函数,就可以创建一个“工作类”实例,并通过基类指针使用。下面是示例代码class worker_base { protected: int wtype; public: worker_base(... 阅读全文
posted @ 2013-12-03 19:41 cgj 阅读(1717) 评论(0) 推荐(0) 编辑
摘要: 这里http://hedengcheng.com/?p=725有对volatile 非常详细的解释,看完之后,心里一惊,因为我刚好在一个项目里用了文中错误示范那种方式来做线程同步,场景如下:Thread1 对性能要求非常高,它有一些中间数据需要定时同步给数据库,我就增加了一个线程Thread2 来帮它做(Thread2还干了很多其他事情),基本做法是:thread1 干完do_something后,给一个全局的 volatile flag 置1;Thread2在一个大循环里,当检测到flag值是1,则会去读thread1产生的中间数据并入库。按照帖子的说法,flag=true 对应的汇编指令可 阅读全文
posted @ 2013-12-02 19:36 cgj 阅读(815) 评论(0) 推荐(0) 编辑
摘要: 转载:http://blog.csdn.net/freas_1990/article/details/9238183看了一些linux网卡驱动的处理技术,对有些概念还是无法理解,突然搜到这篇文章,挺有意思的,有些启发,以后我也要尝试用这种方式写文章Jack:Linux外部设备的性能如何才能高呢?我:你为什么希望外部设备的性能好呢?Jack:典型的说,外部设备如磁盘、网卡都需要非常好的性能。磁盘设备处理性能好,才能承载数据库系统。网卡性能好,才能承载高性能server(数据库或者web server)。我:那你觉得用什么样的方式处理这两个外部设备,它的性能会好呢?Jack:外部设备要好,当然应该 阅读全文
posted @ 2013-11-29 18:03 cgj 阅读(1031) 评论(0) 推荐(1) 编辑
摘要: www.doxygen.org 的使用非常方便,下面分成2步介绍一下1. 注释风格,需要在c/c++代码中按照下面的风格添加注释,基本上还是很顺手的C++的注释风格 主要使用下面这种样式:即在注释块开始使用三个反斜杠‘/’文件注释/***@file 文件名*@brief 概述**详细概述**@author 作者,包含email等*@version 版本号(maj.min,主版本.分版本格式)*@date 日期*/命名空间的注释///@brief 简单概述//////详细概述类定义注释对需要的类增加注释,需要 说明类的设计方法,类的使用指南,说明类的不变项///@brief 简要概述////// 阅读全文
posted @ 2013-11-28 16:40 cgj 阅读(5623) 评论(0) 推荐(1) 编辑
摘要: 一. 缓存算法1.1 算法目的流量拆分算法的运算会明显影响包的发送速率,为了提高发送速率, tcpreplay 使用了缓存机制,该部分代码也封装在tcpprep工具里,运行 tcpprep (tcp-preparation)工具,结果是一个针对性的缓存文件,该文件存放流量拆分算法的运算结果。同时,cache.c 存放了部分读取cachefile的函数。1.2 算法思想如何设计符合目的的缓存?达到即高效又节省?最简单就是使用bool[SIZE] ,存放 0和1,这样的数据结构使用1个字节存放标识,可以表示2个方向的流量。但是用1个字节表示一个packet完全没必要,可以用1个bit表示一个pac 阅读全文
posted @ 2013-11-28 09:45 cgj 阅读(797) 评论(0) 推荐(1) 编辑