03 2019 档案

redis基础
摘要:一、关于redis的基本说明 What does Redis actually mean? It means REmote DIctionary Server. Redis clients communicate with the Redis server using a protocol call 阅读全文

posted @ 2019-03-27 15:37 tsecer 阅读(243) 评论(0) 推荐(0) 编辑

phxpaxos的checkpoint从哪个server同步
摘要:一、状态同步 在工程应用环境中,一个新启动的节点需要能够从其它节点进行状态同步,或者叫做实例的对齐(Learn)。该节说明了C的数据可以从B学习,但是在一个具体的环境中,当一个节点需要学习时,它具体应该如何选择,以哪一个为准,这里并没有后详细说明清楚,这个就需要结合代码来看一下。 二、学习定时器 在 阅读全文

posted @ 2019-03-27 15:31 tsecer 阅读(364) 评论(0) 推荐(0) 编辑

protobuf使用基础
摘要:一、protobuf简介 万能的google可以找到这个关于protobuf的简介,从实现说明上来看,并没有特别值得说明的地方。对于一个协议或者存储来说,最为关心的其实是协议或存储的兼容性问题,其它的int变长编码并没有什么特殊的,因为在这之前,utf-8之类的变长编码也同样使用类似的方法来进行编解 阅读全文

posted @ 2019-03-26 14:46 tsecer 阅读(1946) 评论(0) 推荐(0) 编辑

结合phxpaxos简单看下paxos
摘要:一、paxos的基本假设 关于paxos最为简洁的描述在这里,作者的大致思路是根据结论来找到条件来满足这个条件,而这个限制是逐步收紧,并且在各个参与者之间逐步进行职责转移和派发。 P2a. If a proposal with value v is chosen, then every higher 阅读全文

posted @ 2019-03-21 16:04 tsecer 阅读(166) 评论(0) 推荐(0) 编辑

levelDB实现相关概念及基础
摘要:一、levelDB基础概念 在levelDB的实现中,level(分层)无疑是最为关键的一个核心概念,在分层基础上定义和实现的compact也是该算法的基本操作。在levelDB之前,总有一个先入为主的错误观念:就是只要分层的结构,都有类似于B+树的查询结构:上层节点有指针指向子节点,并且可以在N层 阅读全文

posted @ 2019-03-19 15:39 tsecer 阅读(231) 评论(0) 推荐(0) 编辑

std..tr1如何传递引用类型给function
摘要:一、问题 在常规的函数调用中,通常是直接看到函数的定义并调用该函数,所以,函数调用传递的是值还是引用是根据函数声明来决定的。但是,在std::tr1中的bind函数本身是为了完成不同格式参数的适配,所以函数调用处看到的内容和真正的函数执行位置看到的内容并不相同。 简单的说,这里可以简单的模拟下bin 阅读全文

posted @ 2019-03-07 10:39 tsecer 阅读(356) 评论(0) 推荐(0) 编辑

在变参模版出现之前,functional如何实现bind功能
摘要:一、std::tr1::bind及std::tr1::function函数的意义 在第一次见到std库中bind函数的时候,有一种你们城里人真会玩的感觉,把模版用的出神入化。但是,更关键的是这么华丽的用法,是为了解决什么问题呢?这个问题本身可能比它们如何实现更加重要。其实科技的发展也是大抵如此,往往 阅读全文

posted @ 2019-03-07 10:39 tsecer 阅读(165) 评论(0) 推荐(0) 编辑

如何判断一个点是否在矩形之内及C++的操作符重载
摘要:一、常规情况 通常情况下,这个矩形都是和坐标系平行的一个矩形,例如典型的windows系统中,一个窗口总是和屏幕坐标平行的。在这种情况下,判断一个点是否在矩形之内就非常简单:只需要判断该点在x和y轴方向是否在矩形范围内即可。 简单代码如下,当然,如果在确定x1和x2关系的情况,实现可以更加简洁。 t 阅读全文

posted @ 2019-03-07 10:38 tsecer 阅读(2853) 评论(0) 推荐(0) 编辑

物理引擎中基于AABB碰撞盒的SAP碰撞检测
摘要:一、碰撞检测中的broad phase中的常见算法 该算在 这篇文章 中有比较简单而准确的描述,由于这里描述的思路并不复杂,但是是所有物理引擎中碰撞检测的入门级功课,所以这里写代码加深下对于该简单算法的理解。同样为了避免链接失效,这个地方拷贝下关键内容: Let's see what this me 阅读全文

posted @ 2019-03-07 10:37 tsecer 阅读(991) 评论(0) 推荐(0) 编辑

C++11中部分新语法说明
摘要:一、变长模版参数(variadic template paramter) 1、语法说明 gcc源代码中对于该语法的解析是在gcc-4.8.2\gcc\cp\parser.c文件中完成,同样是"...",如何区分哪些是pack,哪些是expansion呢?从代码(的注释)上来看,只有在模版声明temp 阅读全文

posted @ 2019-03-07 10:37 tsecer 阅读(252) 评论(0) 推荐(0) 编辑

c++动态库中对于字符类型变量的格式化处理
摘要:一、问题 在使用stringstream对一个变量进行格式化的时候,发现格式化之后的字符串并不是一个可显示的字符,最后看了半天,发现问题在于这个变量定义的类型是char类型,导致格式化之后数值本身并没有变化。我记得这个问题甚至不是我第一次遇到,这个问题本身是一个很小的问题,但是既然几次遇到都没有什么 阅读全文

posted @ 2019-03-07 10:36 tsecer 阅读(261) 评论(0) 推荐(0) 编辑

从tr1的function看conversion operator
摘要:一、为什么考虑到这个问题 在看std::tr1的function实现时,看到一个问题。比方说在C++中可以通过指针获得一个变量的位置 tsecer@harry: cat function.cpp #include <tr1/functional> using namespace std::tr1; 阅读全文

posted @ 2019-03-07 10:35 tsecer 阅读(295) 评论(0) 推荐(0) 编辑

从tr1中function使用看converting constructor
摘要:一、converting constructor 不知道为什么,这个名次从来没有听说过,之前也没有关注过C++的这个特性。看了下《The C++ Programming Language》这本书最后的索引,也没有关于这个名词的索引,只是在"constructor"的"and type convers 阅读全文

posted @ 2019-03-07 10:35 tsecer 阅读(355) 评论(0) 推荐(0) 编辑

apache对于非法http请求的处理流程
摘要:一、无效请求的处理 通常来说,系统都是为了给“合法”请求提供服务,但是总有一些异常发生,也就是意料之外的事情。类似的,如果异常发生在一些知名的公司,这些事件可能就是“公关危机”。对于软件来说,通常这些异常情况也就是考验一个产品健壮性的机会,不同质量的软件对于这种异常的处理在很大程度上决定了软件的质量 阅读全文

posted @ 2019-03-07 10:33 tsecer 阅读(804) 评论(0) 推荐(0) 编辑

lua表格
摘要:一、表格 表格在整个Lua语言的数据结构中占有重要地位,正如Lua的作者所说: Tables are the main — in fact, the only — data-structuring mechanism in Lua.Table是Lua的主要(事实上,也是唯一的)数据结构。 数组变量的 阅读全文

posted @ 2019-03-07 10:32 tsecer 阅读(278) 评论(0) 推荐(0) 编辑

lua闭包
摘要:一、闭包的由来 闭包这个概念对于没有接触过函数式编程的人来说还是比较陌生的,它基于把函数看作头等公民(first-class),至于怎么理解这个first-class,我想大致就是说把函数看作是像int、float这样的基本类型,而不是把它看作一个特殊的、定制的特殊实体。把函数当作基本类型之后,就可 阅读全文

posted @ 2019-03-07 10:32 tsecer 阅读(365) 评论(0) 推荐(0) 编辑

lua函数调用
摘要:一、问题 和C相比,Lua是一种限制比较松散的语言,这个在函数相关的处理中更加明显。函数可以有多个参数,函数返回值可以被赋值给变量列表(Lua manual中的varlist),函数可以return表达式列表(Lua manual中的explist),这些其实也不是很混乱,问题在于这些特性放在一起的 阅读全文

posted @ 2019-03-07 10:31 tsecer 阅读(5625) 评论(0) 推荐(0) 编辑

innodb记录延迟删除对于其它DB操作的影响
摘要:一、快速删除记录 在事务型DB删除记录时,一个比较容易想到的优化是以通过设置一个标志位来表示这条记录已经被逻辑上删除(相对于物理删除)。这样实现的优点在于删除动作的指向会很快,特别是在事务提交中,如果只向磁盘flush一个bit的数据修改,可以缩短IO延迟,提高命令响应速度;并且有机会在回滚和再次插 阅读全文

posted @ 2019-03-07 10:30 tsecer 阅读(322) 评论(0) 推荐(0) 编辑

从apache派生cgi工作路径看软链接
摘要:一、问题和背景 对于apache生成的cgi服务来说,通常需要读取一些特有的配置,而这个配置通常使用的方法还是使用软链接。在使用软链接的场景中,由于二进制是在一个文件夹中,而配置文件和日志文件可能在一个软链接的文件夹,所以配置的时候禁不住要问下apache派生的cgi的当前工作路径在哪里,有没有一个 阅读全文

posted @ 2019-03-07 10:29 tsecer 阅读(278) 评论(0) 推荐(0) 编辑

两台主机互为网关是否会像打乒乓球一样一直互发
摘要:一、臆想的一个问题 一直比较好奇一个问题,或者说是一个恶作剧:假设说A、B两个主机互为网关,A需要发送一个数据,根据自己路由配置数据被发送给B主机;数据到达B主机之后,B主机检查自己的路由,发现网关是A主机,这样就会将这个数据(递减TTL之后)再次回传给A主机。这个过程是否会这样一直继续下去呢(当然 阅读全文

posted @ 2019-03-07 10:28 tsecer 阅读(1677) 评论(0) 推荐(1) 编辑

从Btree的一个小特性看innodb的页面分裂
摘要:一、B树基础 在B树的定义中,中间节点存储n个键值和n+1个指针,下面是一个乌托邦式的B树实例。在这个实例中可以看到,每个键值存储的都是其紧邻右侧指针指向子树的最小值。 但是比较特殊的是第一个键值的左边还有一个指针,这个指针也是n+1个指针中(+1)的由来。那么为什么要使用n+1个指针而不是直观上更 阅读全文

posted @ 2019-03-07 10:27 tsecer 阅读(708) 评论(0) 推荐(0) 编辑

MySQL的join buffer原理及如何提高查询效率
摘要:一、MySQL的join buffer 在MySQL对于join操作的处理过程中,join buffer是一个重要的概念,也是MySQL对于table join的一个重要的优化手段。虽然这个概念实现并不复杂,但是这个是实现MySQL join连接优化的一个重要方法,在"暴力"连接的时候可以极大提高j 阅读全文

posted @ 2019-03-07 10:27 tsecer 阅读(8793) 评论(6) 推荐(0) 编辑

事务隔离等级及InnoDB实现简单总结
摘要:一、数据库中事务的隔离等级 这里首先要明确的是,这里的“隔离”都是在“事务”的基础上讨论的,通常的事务通过 start transaction开启,之后通过rollback或者commit来结束。由于大部分情况下对于mysql的操作都是单条语句的操作,我想大部分人在操作mysql的时候不是在操作测试 阅读全文

posted @ 2019-03-07 10:26 tsecer 阅读(221) 评论(0) 推荐(0) 编辑

glibc协程初始化为什么需要调用getcontext
摘要:一、协程基础 按照执行单位从大到小的粒度区分,最早的执行单位就是进程(或者linux内核中所说的task)、之后为了资源共享,又有了线程的概念。线程在内核中成为基础的执行单位。线程这个概念对内核来说也是可见的,也就是说内核为了支持线程和进程的机制做过相关的处理,但是在linux下,这个处理的大部分工 阅读全文

posted @ 2019-03-07 10:25 tsecer 阅读(616) 评论(0) 推荐(1) 编辑

mysql-innodb 锁基础
摘要:一、锁的意义 在一个复杂一点的并发系统中,锁始终是一个绕不开的存在,大家通常接触到这个概念最多的是多任务操作系统,例如服务器比较常用的linux操作系统。在所有的操作系统教材中,都会对锁进行描述,生产者/消费者问题;哲学家就餐问题等都是典型的入门例子,所以锁最为常见的应用场景就是在操作系统中。但是, 阅读全文

posted @ 2019-03-07 10:24 tsecer 阅读(180) 评论(0) 推荐(0) 编辑

MySQL对于datetime的处理
摘要:一、时间比较的语法分析 在mysql中,通常时间是一个必不可少的类型,而这种类型的一个特殊地方就在于它的比较函数。其实,即使对于字符串的比较函数和对于int的比较也是完全不同的,但是这个差别并不想以datetime保存的时间这么具有视觉的震撼性和表现的这么明显。这里还有一个问题在于,当mysql的y 阅读全文

posted @ 2019-03-07 10:23 tsecer 阅读(2932) 评论(0) 推荐(0) 编辑

内核中Boyer-Moore (BM)算法简单注释
摘要:一、shift生成 这个算法之前大致看过一下,在grep中再次遇到了该算法,大致想了下它的具体实现,发现shift数组的计算并没有像KMP中那样的迭代过程,之后就在网络上搜索了下这个算法的描述,主要是看shift的生成方法,具体思想描述有不少图片甚至视频展示,这里就不详细说明了。关于shift的生成 阅读全文

posted @ 2019-03-07 10:22 tsecer 阅读(236) 评论(0) 推荐(0) 编辑

由一次sigleton错误想到的一些C++实现问题
摘要:一、问题 在编可执行文件的时候,为了图方便,没有使用工程的Makefile,而是自己做了一些特殊的处理,选择性的编译了一部分代码,导致最后调试时发现一些文件访问singleton特定组件时错误,然后就想了下C++对于头文件中定义的static类成员中的static变量是如何实现及保证这个单件的唯一性 阅读全文

posted @ 2019-03-07 10:20 tsecer 阅读(109) 评论(0) 推荐(0) 编辑

sqlite对于典型select处理流程
摘要:一、select s from f where w这是一个最为基础的sql语句,相当于C语言的printf("hello world\n");对于一个简单的应用来说,知道这个套路解决一般问题是没有难度的,在一些复杂的场景,例如涉及到subselect、join、union等各种各样的延伸问题时,如果 阅读全文

posted @ 2019-03-07 10:18 tsecer 阅读(1077) 评论(0) 推荐(0) 编辑

sqlite中对于join的实现
摘要:一、多表操作这个问题并不是一个空穴来风的纯粹分析,应用的场景是假设一个数据库中相同的表格内容是按照每个月创建一个table,这样的好处在于随着日期的变化,我们可以通过一个简单的drop命令删除不再需要的数据,而且表的大小也不会太膨胀。这些好处的作用非常明显,但是也有一些不太方便的地方,假设我们想知道 阅读全文

posted @ 2019-03-07 10:17 tsecer 阅读(794) 评论(0) 推荐(0) 编辑

sqlite中对于group by的处理
摘要:一、除重在一些数据库查询中,我们希望一些记录是唯一的,比如希望查找某一项的最大值,由于table中可能有多条记录他们的值相同,都是最大值,例如一些有上限的属性,很容易出现多条record的属性值都达到上限的情况,此时我们可能只需要一条,验证它的确曾经达到过上限,此时比较好的办法就是使用group b 阅读全文

posted @ 2019-03-07 10:16 tsecer 阅读(804) 评论(0) 推荐(0) 编辑

apache worker模式下keepalive及内核keepalive
摘要:一、apache的worker模式下保活选项由于http的keepalive是控制apache行为的一个重要的特征,所以大致看了一下这个机制的实现及意义。通常来说,如果进行定性的分析,大家都可以随便信口开河,甚至望文生义也可以胡诌半天,但是这些结论对于真正的应用来说意义极小。就好像你说,我这个结论有 阅读全文

posted @ 2019-03-07 10:14 tsecer 阅读(409) 评论(0) 推荐(0) 编辑

内存在父子进程间的共享时间及范围
摘要:一、内存共享共享内存是linux下父子进程除了文件描述符之外的另一个更加具有亲缘性的共享机制了。和文件描述符共享不同,这种内存的共享它的共享性更强,因为内存的范围很大,共享的粒度可以精确到不同的数据结构。这个说法可能有些危言耸听,而且大家会觉得这个不是事实。老实说,它的确只是部分事实。在unix类系 阅读全文

posted @ 2019-03-07 10:13 tsecer 阅读(1162) 评论(0) 推荐(0) 编辑

apache后台cgi挂掉之后现场还原
摘要:一、apache的实现对于apache的实现,默认配置的时候是不支持cgi模式的,这里的cgi模式就是cgid_mod的加载。如果没有加载该模块,当把该文件放入cgi_bin文件之后,从浏览器获得该文件的时候,httpd并不是执行该文件并将文件的输出返回,有意思的是,浏览器将会直接将请求的cgi文件 阅读全文

posted @ 2019-03-07 10:13 tsecer 阅读(845) 评论(1) 推荐(0) 编辑

mysql分析(二)mysql语法分析
摘要:一、mysqld中对于SQL语句的分析客户端和服务器之间交互的时候,客户端发送的同样是字符串形式的查询和执行命令,返回的特定格式的数据库内容(?)。这个过程就需要在服务器端进行实时指令的翻译,生成特定的查询指令。在sqlite的实现中,sqlite定义了一个专用的虚拟机环境,和通常的真正的汇编指令相 阅读全文

posted @ 2019-03-07 10:12 tsecer 阅读(930) 评论(0) 推荐(0) 编辑

mysql分析(一)源代码安装及简单调试
摘要:一、源代码安装安装方式有两种,一种是二进制文件的安装,另一种是源代码级别安装。不同的二进制安装只是将同一份源代码在不同的机器上编译并且按照指定的运行格式进行尽量简单的配置,所以二进制安装的发行包命名中包含有操作系统的信息,源代码发行版本中中只有版本信息,不包含OS信息。在下载的5.5.28版本自带的 阅读全文

posted @ 2019-03-07 10:11 tsecer 阅读(529) 评论(0) 推荐(0) 编辑

apache分析之三、配置文件解析
摘要:一、可配置型作为当前世界上部署最为广泛的Web服务器,apache具有很好的扩展性。这种扩展性和内核中的扩展性几乎有相同的作用和意义(核心的实现方法也是相同的,这两个实现应该是有相互借鉴的,只是不确定最早是谁提出的,或者两者都不是,而是从另外更早的unix版本中提出,不确定。),但是它的可配置性更好 阅读全文

posted @ 2019-03-07 10:10 tsecer 阅读(303) 评论(0) 推荐(0) 编辑

apache分析之一、svn:Could not open the requested SVN filesystem
摘要:一、问题描述本来是想测试一下svn的post-commit hook为什么能够实现对于后台任务的同步等待,所以就搭建了一个apache和svn的服务器程序,但是在调试的过程中一直出现文件系统打不开的问题,在apache的错误日志中也可以看到下面的提示内容, 1647 [Sun Oct 14 11:4 阅读全文

posted @ 2019-03-07 10:08 tsecer 阅读(1472) 评论(0) 推荐(0) 编辑

apache分析之二、post-commit后台运行
摘要:一、问题描述希望在svn的post-commit中执行一个后台任务,但是发现该后台任务没有退出之前,svn提交始终不会返回。按照bash派生的后台任务的定义,就是在子进程派生之后,父进程不会把终端输入(终端的前台任务)派发给后台任务,也不会同步等该该子进程的返回。在父shell退出之后,内核会把退出 阅读全文

posted @ 2019-03-07 10:08 tsecer 阅读(284) 评论(0) 推荐(0) 编辑

从例子看git的内部实现
摘要:零、问题 git每天提交保存的是完整修改后的内容,那么多次修改同一个文件,多次提交可能会生成多个版本。如果checkout特定版本需要依赖历史版本的话,那么此时回溯的时候需要判断特定文件是不是最后一次提交的,并且只保留最后一次修改的版本。 一、测试一次完整的提交包含了什么 1、1 先创建一个空的gi 阅读全文

posted @ 2019-03-07 10:05 tsecer 阅读(481) 评论(0) 推荐(0) 编辑

stl中容器的end指向哪里
摘要:一、问题 在很多的C++容器使用,通常的遍历方法都是 for (auto iter = cont.begin(); iter != cont.end(); iter++) 或者使用更高级的C++语法 for (auto &iter : cont) 但是无论如何,在这种场景下,我们总是假设一个容器的e 阅读全文

posted @ 2019-03-07 10:04 tsecer 阅读(2106) 评论(0) 推荐(0) 编辑

使用dependency walker定位windows下程序启动失败原因
摘要:一、问题 执行一个windows文件启动失败,弹窗内容如下: ShaderCompileWorker.exe - 应用程序错误 应用程序无法正常启动(0xc000007b)。请单击“确定”关闭应用程序。 确定 二、使用dependency walker看输出 从输出上可以看到有些DLL在系统中无法找 阅读全文

posted @ 2019-03-07 10:03 tsecer 阅读(1206) 评论(0) 推荐(0) 编辑

lvs中的保活、persistent及DR
摘要:一、保活的问题 之前一个同事问起一个问题:服务器通常不会主动检测客户端是否依然有效,在这种情况下,如果客户端异常退出后服务器依然维护着这条链路,随着时间的推移,过多的无效链接最终将会把服务器的资源消耗殆尽。举个例子:假设客户端是一个手机终端,用户可以抠出电池重启系统,这种情况下客户端的TCP协议栈没 阅读全文

posted @ 2019-03-07 10:02 tsecer 阅读(788) 评论(0) 推荐(0) 编辑

当磁盘空间满之后,为什么文件依然可以被创建
摘要:一、当磁盘满了之后创建文件 在有些服务器进程中,可能需要在进程启动之后在文件中写入进程的pid,从而可以通过读取这个pid文件对进程进行reload、stop、start之类的控制操作。但是,在磁盘空间满了之后,虽然pid文件创建成功,但是进程id却无法写入,这个时候如果依赖文件存在,然后从中读取p 阅读全文

posted @ 2019-03-07 10:01 tsecer 阅读(457) 评论(0) 推荐(0) 编辑

linux如何感知通过mmap进行的文件修改
摘要:一、问题 对于mmap将内容映射到地址空间,从而让应用程序可以像操作内存一样来操作文件内容,这是操作系统为用户态程序提供的一个便利,它的确可以将繁琐的文件操作转换为码农喜闻乐见的内存操作,更重要的是它可以将文件内容的读写达到按需加载,只有在真正使用到文件内容的时候才会触发文件内容的读取,当然写回也是 阅读全文

posted @ 2019-03-07 10:00 tsecer 阅读(2719) 评论(0) 推荐(1) 编辑

共享内存都去哪儿了
摘要:一、现象及问题 在两台同样环境上同样部署的进程,通过top工具查看两个进程的内存使用情况,可以看到的是,两个进程占用的虚拟地址空间大小相同,但是占用物理页面进程差别极大,可以认为不是一个数量级上的。通过free工具看到系统中可用内存比较少,但是buffers和caches的数量都非常大。按照常规理解 阅读全文

posted @ 2019-03-07 09:59 tsecer 阅读(1200) 评论(0) 推荐(0) 编辑

gcc如何处理函数的throw属性
摘要:一、问题 在c++的语法中,可以在函数声明中添加throw(),throw(type1, type2)之类的说明,前者声明该函数不被抛出任何异常,后者则是声明该函数只会抛出type1,type2类型的异常。当然这里并不是像孔乙己一样来说明回字的四种写法;更不是为这个语法摇旗呐喊,相反,各种论调都是不 阅读全文

posted @ 2019-03-07 09:58 tsecer 阅读(417) 评论(0) 推荐(0) 编辑

TCP建立连接时socket的epoll态及一个可能的状态不一致问题
摘要:零、原因 其实本来是在看TCP三次握手时客户端和服务器端socket对于epoll状态何时返回何种状态,不过后来引出了一个另有意思的问题:就是客户端和服务器双方对于三次握手的状态出现了不一致。我们知道,在三次握手中,客户端在发送最后一个ack之后进入ESTABLISHED状态,并没有要求服务器对于这 阅读全文

posted @ 2019-03-07 09:57 tsecer 阅读(889) 评论(0) 推荐(0) 编辑

ext2文件在延迟删除后遇到系统断电会怎样
摘要:一、文件删除 通常在用户态我们删除一个文件都是通过rm命令来删除(删除文件夹的暂时就先不讨论了),这个删除操作并没有一个系统对应的rm系统调用,而是通过unlink系统调实现。在linux中,文件的删除不受文件是否正在被进程使用的限制,这一点和windows下的文件删除非常不同。这一点大家都知道,或 阅读全文

posted @ 2019-03-07 09:57 tsecer 阅读(799) 评论(0) 推荐(0) 编辑

从IP层TTL递减看校验和及ICMP
摘要:一、协议栈中的校验和 在IP协议及UDP/TCP协议中都是用了校验和字段,这个字段通常没有人会关注,就好像现在已经没有人知道当时的一个字节中保留的一个校验bit一样。我也是偶尔看我们常用的traceroute功能的时候间接看到了这个字段。traceroute的流程大致是这样的:从1不断的增加IP协议 阅读全文

posted @ 2019-03-07 09:55 tsecer 阅读(1812) 评论(0) 推荐(0) 编辑

从虚拟机磁盘扩容看linux下磁盘管理及ext文件系统
摘要:一、虚拟机磁盘扩容 最开始的时候创建的虚拟机的磁盘容量是20G,运行了一段时间之后,发现磁盘空间已经不够用,需要增加磁盘的容量。想到最简单的方法就是增加磁盘容量,把20G扩容到30G,这里的也有两种方法,一种是现有磁盘的容量,另一种是新加一个硬盘设备。当时使用的是第一种方法,也就是增加虚拟机现在使用 阅读全文

posted @ 2019-03-07 09:54 tsecer 阅读(542) 评论(0) 推荐(0) 编辑

键盘按键频率的极限在哪里
摘要:一、为什么想到这个问题 昨天在电脑上看视频的时候,发现字幕有些问题。具体的问题就是视频是分两个文件的,但是字幕是单个文件的,所以在看第二个文件的时候字幕就对不上了,而且相差很大,这个时候就需要手动对齐字幕,这个误差大概是50分钟,也就是3K秒左右,播放器貌似又不支持直接设置一个偏移量,所以我就只能通 阅读全文

posted @ 2019-03-07 09:54 tsecer 阅读(1801) 评论(0) 推荐(0) 编辑

TCP_FIN_WAIT1可以等多久
摘要:一、为什么会想到这个问题 主要是想测试下当接收方接收窗口满了之后,此时发送的检测包报文的格式。然后就想到了一个极端的问题:当tcp连接建立起来之后,假设说一方比较缺德(或者说程序有bug),对建立的socket数据不做任何读取操作,这样就让发送方非常尴尬了,因为发送方终究会感知到对方的接收窗口已经满 阅读全文

posted @ 2019-03-07 09:52 tsecer 阅读(1042) 评论(0) 推荐(0) 编辑

TCP接收方对于重叠报文的处理
摘要:一、接受方有效负载的判断 在rfc793中说明了对于判断接收到的报文是否有负载的判断在Page 24和Page 25之间,其中的原文说明为 A segment is judged to occupy a portion of valid receive sequence space if RCV.N 阅读全文

posted @ 2019-03-07 09:52 tsecer 阅读(1155) 评论(0) 推荐(0) 编辑

为什么ip层收到的报文可能已经设置了路由
摘要:一、收到报文对于网络地址的判断 对于刚收到的网络数据,经过了NF_IP_PRE_ROUTING过滤之后,开始到达了ip_rcv_finish函数,在该函数的开始做了一个看起来比较诡异的操作,就是判断了这个数据包中的路由dst是否已经设置过了,如果没有设置过则进行路由;这也就是反过来说,一些收到的报文 阅读全文

posted @ 2019-03-07 09:51 tsecer 阅读(426) 评论(0) 推荐(0) 编辑

由socket fd泄漏想到的一些问题
摘要:一、报文跨层传递 所有的网络协议栈都告诉我们:TCP/IP协议栈是分层的,低一层的协议无需也不能感觉到上层的协议,这个观念在我的脑海中根深蒂固,并且由衷的赞叹这种设计的思想,但是在经过一些简单的思考就会发现,这种分层并不是绝对的,正如这世间的一切。一个直观的问题是,一样米养百样人,同样的网卡上,可以 阅读全文

posted @ 2019-03-07 09:50 tsecer 阅读(2400) 评论(0) 推荐(0) 编辑

由一次虚拟内存耗尽看32bits elf在x86_64下运行方式及地址空间布局
摘要:基于2.6.32内核 一、现象 在x86_64的64位操作系统环境下,一个程序执行coredump,从coredump文件可以看到,导致coredump的问题是由于执行new操作时分配内存失败导致的。这个问题看起来让人有些莫名惊诧,用掉64bit下的所有虚拟地址空间,这是什么概念(这个惊诧可以用莱芜 阅读全文

posted @ 2019-03-07 09:49 tsecer 阅读(630) 评论(0) 推荐(0) 编辑

关于TCP关闭想到的一些问题
摘要:一、问题的引入 在客户端希望通过http协议到服务器来拉取数据时,这种交互大多就是一次性的交互,客户端从httpsvr把数据拉取回来之后,服务器会主动关闭套接口。通常来说,如果是我们通过传统的PC端来连接,这个问题不是很大,因为这些客户端通常就是专门围着这个httpsvr来转的,就等着httpsvr 阅读全文

posted @ 2019-03-07 09:48 tsecer 阅读(1304) 评论(0) 推荐(0) 编辑

pure virtual method called的一种情况
摘要:一、实例代码 看了下面的例子,可能问题已经非常清晰了,但是这个例子就是为了让问题看起来清晰而故意这么写的,如果是在一个大型的项目中,特别是使用了大量的第三方库,这个问题并不是大家现在见到的这么显而易见的。下面是复现问题的demo: tsecer@harry: cat callpure.cpp #in 阅读全文

posted @ 2019-03-07 09:47 tsecer 阅读(4311) 评论(0) 推荐(1) 编辑

linux下内存分配时overcommit使用
摘要:一、用户态地址分配主要路径 用户态所有地址空间的申请主要经过mmap系统调用,也有一些是基于brk系统调用,对于mmap系统调用,它在某些条件下会执行申请空间合理性的判断,而brk则是一定进行合理性判断,下面是mmap相关的一些代码do_mmap_pgoff,它主要就是在于如果新分配的空间是私有可写 阅读全文

posted @ 2019-03-07 09:46 tsecer 阅读(1123) 评论(0) 推荐(0) 编辑

gcc对C++局部静态变量初始化相关
摘要:一、静态局部变量初始化是否会很耗 之前曾经注意到过,gcc对静态变量的运行时初始化是考虑到多线程安全的,也就是说对于工程中大量使用的单间对象: CSingletone::Instance类型的代码,理论上说都是要经过mutex这种重量级的互斥检测,如此看来,这种单间对象对系统损耗应该是非常大的,因为 阅读全文

posted @ 2019-03-07 09:45 tsecer 阅读(824) 评论(0) 推荐(0) 编辑

为什么cat binary之后可能出现乱码
摘要:一、终端显示 大部分使用SecureCRT的用户可能都会经历这种情况,不小心cat了一个二进制文件,导致整个屏幕显示错乱,使用reset,stty -sane都没有办法恢复,只能重新打开一个终端。我之前就知道它是由于终端中SI控制字符导致的问题,但是更深入的原因没有进一步分析。后来我尝试使用另一种开 阅读全文

posted @ 2019-03-07 09:44 tsecer 阅读(1212) 评论(0) 推荐(1) 编辑

gcc的模版匹配及其它
摘要:一、gcc的模版匹配实现 1、主体函数 gcc的代码实现现在看起来依然晦涩,所以下面的分析只是大致的一个意会过程,没有精确详细的描述。以gcc4.1.0版本为例,模版特殊化的具体判断主要在gcc-4.1.0\gcc\cp\pt.c:most_specialized_class函数完成,从代码中可以看 阅读全文

posted @ 2019-03-07 09:43 tsecer 阅读(337) 评论(0) 推荐(0) 编辑

gcc如何将常量除法转换为乘法及移位
摘要:一、强度削弱 之前在偶尔看gcc对于除以一个常数的表达式生成的汇编代码中,发现一条除法表达式生成的汇编指令非常多,这些指令中没有乘法操作,比较明显的特征就是进行了一个大整数的乘法,之后是移位啊、减法啊什么的操作,虽然不知道是什么意思,但是感觉很厉害的样子。 后台就觉得这应该是一个优化,搜索了一下,看 阅读全文

posted @ 2019-03-07 09:42 tsecer 阅读(1026) 评论(1) 推荐(0) 编辑

动态库为什么不能运行
摘要:so运行的方法 在我之前的印象中,so文件是不能直接运行的,但是ld.so改变了我的这种偏见。执行一下动态链接库文件,执行结果为 tsecer@harry :/lib/ld-linux.so.2 Usage: ld.so [OPTION]... EXECUTABLE-FILE [ARGS-FOR-P 阅读全文

posted @ 2019-03-07 09:41 tsecer 阅读(427) 评论(0) 推荐(0) 编辑

由UPD报文想到的
摘要:一、udp的报文发送 udp在通常的应用中使用的比较少,可靠的协议通常使用TCP传输,对于的关注自然没有TCP多。尽管UDP具有不可靠的传输问题,和TCP相比,它有一个隐性的优点就是对于packet结构本身的完整性保持。严格意义上讲,这个属性并不是UDP协议单独完成的,而是由IP层完成,对于上层应用 阅读全文

posted @ 2019-03-07 09:41 tsecer 阅读(233) 评论(0) 推荐(0) 编辑

内核中current实现
摘要:一、当前进程current 在内核中,current绝对是一个出镜率非常高的变量,在几乎所有的系统调用中都会用到该变量。由于该变量被使用的频率比较高,所以它的实现要尽可能的快速高效。在最早的内核版本中,这个实现在内核的不同版本中一直在变化,从这个变量也可以引申出一些有意思的问题。 二、早期内核实现 阅读全文

posted @ 2019-03-07 09:39 tsecer 阅读(2141) 评论(0) 推荐(0) 编辑

由securecrt光标异常想到的
摘要:一、终端编辑 之前的终端都是为了便于人机交互而设计,交互性比较强。用户输入过程中,通常不是一蹴而就,也不可能没有笔误。所以终端通常是基于行为单位进行处理,在用户输入了回车之后才向用户态返回整个输入内容,也就是shell的一条命令。同样是为了便于用户编辑,在内核态支持简单的编辑命令,例如删除一个单词, 阅读全文

posted @ 2019-03-07 09:39 tsecer 阅读(1030) 评论(0) 推荐(0) 编辑

gdb硬件watch实现及call实现的一个例证
摘要:一、gdb 硬件watch断点原理 1、直观的例子 硬件断点的watch功能是查找内存被改写的一个必备工具,和其它调试器断点功能一样,它可以快速的理解一个系统的特定方便而不用理解整个系统。对于某些关键变量,我们想知道有哪些地方使用或者初始化这些数据,只需要在该表达式打上数据断点,待命中时查看调用链即 阅读全文

posted @ 2019-03-07 09:38 tsecer 阅读(1605) 评论(0) 推荐(0) 编辑

linux下多进程写入文件的原子性
摘要:一、文件写入的原子性 管道在整个unix系统中有重要的基础设施意义,它使unix工具设计的“职能简单”原则得以实现的基础,不同的工具使用管道协调完成自己的功能,并把一个功能做好。一个想法的提出通常具有明确的场景和简洁的原理,后来需求的不断发展导致问题看起来极为复杂,就像我们现在社会的进化,可能原始社 阅读全文

posted @ 2019-03-07 09:37 tsecer 阅读(2377) 评论(0) 推荐(0) 编辑

页面反向映射之文件页面
摘要:一、文件映射和匿名页面相比,文件映射算是比较幸福的一种映射方式了,它可以依靠每个文件都有的address_space结构来引伸出自己需要的信息,例如,所有映射了这个页面的page可以指向文件对应的inode的address_space结构。在vma侧,它们可以在address_space中建立一个自 阅读全文

posted @ 2019-03-07 09:36 tsecer 阅读(307) 评论(0) 推荐(0) 编辑

页面反向映射之匿名页面
摘要:一、基础数据结构及面临的问题页面结构struct page对于反向映射的实现使用了两个成员:一个是表示映射挂靠位置的内核级唯一结构。对于匿名映射来说,这个结构为一个全局的anon_vma结构;对于文件映射结构来说,这个指针指向的是一个表示地址空间的address_space结构,这个结构也就是我们通 阅读全文

posted @ 2019-03-07 09:35 tsecer 阅读(418) 评论(0) 推荐(0) 编辑

cp so文件导致进程SIGBUS或者SEGV原因分析
摘要:一、现象so文件被不同的进程共享,映射入各个进程的地址空间中,这也是SO文件存在的重要原因。作为文件,它的只读部分可以供系统中任意多的进程使用,从而节省系统物理内存使用以及磁盘空间的使用。对于系统级的so文件,我们一般不会修改这些文件的内容,即使修改可能也是无意修改。但是对于一些自己编写的so文件, 阅读全文

posted @ 2019-03-07 09:34 tsecer 阅读(758) 评论(0) 推荐(0) 编辑

由systemtap直接修改内核代码段想到的
摘要:一、直接修改内核代码段在386内核的kprobe实现过程中,其中有一个是对于代码段断点的安装,那个地方对于代码段的修改是轻松加惬意,就好象生活在新闻联播里一样,这让我们这些看惯了用户态进程各种保护的程序员来说还是比较震撼的,套用一句三俗的话来说:我和我的小伙伴们都惊呆了。386中对于kprobe调试 阅读全文

posted @ 2019-03-07 09:32 tsecer 阅读(540) 评论(0) 推荐(0) 编辑

epoll的内核实现
摘要:一、内核实现基础和之前的select相比,epoll是一个目标性更强的实现。在epoll等待的时候,它会把每个poll的唤醒函数注册为自己特有的函数,在该回调函数中,它将自己(被唤醒的fd)添加到readylist中,然后在poll到底是什么事件的时候只检测在readylist中的描述符即可,而不是 阅读全文

posted @ 2019-03-07 09:31 tsecer 阅读(355) 评论(0) 推荐(0) 编辑

从一些现象看printf的缓冲机制
摘要:一、C库的printf函数簇这些函数其实大家最为熟悉,因为每个人都会写的hello world就是使用了printf这个C库函数。但是printf的实现并不见,如果有兴趣的同学可以看一下glibc中关于这个函数的哦实现,先不说各种格式化的处理以及文件的锁,其中的缓冲区管理及动态资源管理就有相当多的代 阅读全文

posted @ 2019-03-07 09:30 tsecer 阅读(448) 评论(0) 推荐(0) 编辑

screen工具实现简单分析
摘要:一、screen这个工具在其它地方有所耳闻,在实际工作中没有遇到过这种情况,准确的说是没有直接遇到这种情况。就像之前使用windows下的远程桌面一样,也是在无意中发现,之后在需要远程桌面的时候想到这种工具,才觉得工具非常好用。对于screen命令的使用也是如此,并没有刻意的去寻找一个特定的工具,虽 阅读全文

posted @ 2019-03-07 09:29 tsecer 阅读(465) 评论(0) 推荐(0) 编辑

SO_LINGER选项的作用和意义
摘要:一、选项在内核中的使用搜索一下内核中对于SO_LINGER的使用,主要集中在socket的关闭、两个必不可少的set/get sockopt函数中,所以真正使用这个选项的地方并不多,所以分析起来可能并不复杂,也没什么影响,但是正如之前所说的,问题的严重性和重要性往往不是问题本身决定的,而是它可能引起 阅读全文

posted @ 2019-03-07 09:28 tsecer 阅读(1519) 评论(0) 推荐(0) 编辑

gcc的异常处理机制
摘要:一、序言这个异常处理可以说是C++语法中一个重要的组成部分,但是在使用中很少有人认真的研究过它的实现,甚至在工程中使用这个工具的人都很少,加上我之前对于C++的使用也是大概在windows下使用了两年,所以一些基本的问题我也不是很熟悉。但是对于windows下的结构化异常处理方法,在Matt pie 阅读全文

posted @ 2019-03-07 09:26 tsecer 阅读(2184) 评论(0) 推荐(0) 编辑

linux下g++从异常中还原异常类型
摘要:一、异常终止在C++中,如果有一个异常没有被任何人捕捉,此时默认的处理是将进程终止掉,终止的时候使用的信号是sigabrt。好在内核对于这种信号的默认处理是会生成一个coredump文件,对于一些服务器来说,通过core文件可以知道当时的进程信息,如果附带了调试信息,那么调用的堆栈信息清晰可见。理想 阅读全文

posted @ 2019-03-07 09:25 tsecer 阅读(865) 评论(0) 推荐(0) 编辑

tcp_tw_reuse文件及SO_REUSEADDR对端口重用的一点不同
摘要:一、端口重用这本是没什么意思的一个东西,只是别人那么随便一问,自己也是没啥事情,就看了一下,可能没什么实际意义。从名字上看,两者都是端口重用的表示,可能是和socket的发送接收缓冲区一个,一个是全局的,一个是实例私有的。但是看了一下代码,感觉好像不是这样。二、SO_REUSEADDR选项的使用in 阅读全文

posted @ 2019-03-07 09:24 tsecer 阅读(1015) 评论(0) 推荐(1) 编辑

C++构造函数初始化相关操作
摘要:一、构造函数构造函数在C++中扮演着基础性的功能,再加上成员的初始化列表,问题就变的更加有意思的。通常也是机械性的写类和对应的构造函数,然后再对成员在初始化列表中对必要的成员进行初始化操作,例如对于一些整数类型赋值为非法初始值,以区分和识别一些未初始化的变量。但是在大部分情况下,我们并煤油灯对于一些 阅读全文

posted @ 2019-03-07 09:22 tsecer 阅读(647) 评论(0) 推荐(0) 编辑

网络协议栈(18)tcp连接关闭时时序
摘要:一、四次挥手三次握手是TCP协议中的一个经典问题,几乎所有的网络公司面试都会问到这个问题,以至于人们甚至忽略了更加有意义的挥手过程。无论从挥手的实现代码量还是在实际工程种可能引发的问题,挥手的过程都是比三次握手要更加的复杂。在TCP的状态转换过程中,大部分都是和连接关闭相关的操作,反过来看一下三次握 阅读全文

posted @ 2019-03-07 09:21 tsecer 阅读(358) 评论(0) 推荐(0) 编辑

网络协议栈(17)对端套接口关闭后的SIGPIPE信号
摘要:一、tcp关闭tcp的关闭在实际应用中的重要性可能会高于通常教科书中描述的三次握手。在三次握手发生时,此时的语义和动作都是确定的,server在侦听,而client去主动连接,此时连着的角色在连接开始之前就已经明确。对于TCP的断开来说,此时整个协议没有办法确定到底是谁来先断开,任何一方都可以在任何 阅读全文

posted @ 2019-03-07 09:20 tsecer 阅读(191) 评论(0) 推荐(0) 编辑

若干编码说明
摘要:一、gb2312现在我们大部分的中国程序员编译的程序可执行代码中包含的都是gb2312编码,这些编码通常体现在代码中的字符串里。编译器对于这些字符串的内容并不做特殊解释,因为gb2312中的常用英文字符是和ASCII码兼容的。根据编码的约定,通常的前32个字符是作为控制字符,也就是无法在屏幕上直接对 阅读全文

posted @ 2019-03-07 09:20 tsecer 阅读(161) 评论(0) 推荐(0) 编辑

rsync实现大致流程描述
摘要:一、文件同步不同主机之间的文件同步是服务器开发过程中一个重要的基础操作,它是cp及scp的一个扩充版本,能够实现不同主机之间的文件复制,能够提供增量复制,能够提供安全性验证。rsync的代码实现数量并不多,核心的文件更少,和很多理论作者的操作一样,该文件使用C语言编写,代码的编写、变量的命令、文档的 阅读全文

posted @ 2019-03-07 09:19 tsecer 阅读(335) 评论(0) 推荐(0) 编辑

网络协议栈(16)套接口异步关闭及重传
摘要:一、TCP的异步发送在之前的日志中,已经看到tcp报文的发送时异步的,也就是应用层的send函数向一个TCP套接口发送数据,当send函数返回之后,send中的发送数据可能还没有到达网卡,更不要说到达对方并获得对方的ACK。这样做的好处是数据的准备和发送可以异步进行,和文件的缓冲一样,当write函 阅读全文

posted @ 2019-03-07 09:19 tsecer 阅读(316) 评论(0) 推荐(0) 编辑

C++中模板生成时机
摘要:一、模板模板是C++中相对比较不太常见的结构,它实现了一些定义按照使用而动态由编译器实现的功能。或者说它部分实现了一些代码动态生成,将程序员的一些工作转移给了编译器来完成。并且它可以使用和内存的使用一样,只有在真正使用到(需要一种模板定义)的时候,此时才真正生成这种模板的一个实例。这一点和各种现代的 阅读全文

posted @ 2019-03-07 09:18 tsecer 阅读(455) 评论(0) 推荐(0) 编辑

gcc虚函数表生成时机
摘要:一、虚函数表每个包含有虚函数的类都会有一个所有对象共享的虚函数表,既然是所有实例共享,那么就涉及到可能出现“三个和尚没水喝”的情况。这个虚函数表既然是大家都要使用的,那么有谁来生成呢?最为保险但是低效的办法就是每个编译单元都生成一个,变量声明为weak,放入comdat节中,最后由连接器删除重复的冗 阅读全文

posted @ 2019-03-07 09:17 tsecer 阅读(954) 评论(0) 推荐(0) 编辑

由unix socket想到的部分文件系统问题
摘要:一、unix socket这种套接口感觉在文件系统和套接口中都是一种异类,就好像蝙蝠是兽中的鸟、鸟中的兽一样。它的特点在于一个地址是否被占用是通过一个文件是否存在来确定。这其实是一个比较危险的操作,因为这个文件的存在是持久性创建的文件,会给底层的文件系统造成持久的影响。现在假设说一个程序非正常结束, 阅读全文

posted @ 2019-03-07 09:16 tsecer 阅读(507) 评论(0) 推荐(0) 编辑

rsync算法概述
摘要:一、文件传输文件传输一直是互联互通以来的一个重要问题,为了这个问题,有各种的ftp实现,sz/rz模式,diff工具、以及scp等各种方法,它们各有各自的应用场景,也不能说一个就直接取代另一个。对于rsync来说,它应该算是一个比较特殊的方法,或者说在diff和scp之间有一个比较好的中和。通常来说 阅读全文

posted @ 2019-03-07 09:15 tsecer 阅读(404) 评论(0) 推荐(0) 编辑

tcp中发送/确认及文件缓冲
摘要:一、粘包问题TCP传输是一种基于流(stream)的传输方式,这个流是对应于udp的数据报格式的传输方式。在数据报传输格式中,每次传输的是一个单位,可以认为他是一个离散的信号,每次发送一个报单位。而流则是细水长流的流,它的数据可以持续的发送,接收和发送端都可以认为其中的字节流是没有天然的分隔点的,不 阅读全文

posted @ 2019-03-07 09:14 tsecer 阅读(350) 评论(0) 推荐(0) 编辑

用户态poll及内核态poll语义的一点不同
摘要:一、poll实现内核中VFS系统的poll机会是整个系统中异步等待的基础,无论是最为原始的poll,之后上流的select,以及最近的epoll,它们在内核中的实现都是基于每种文件提供一个poll接口功能来实现。但是对于内核态的poll来说,它并不是一个阻塞式的接口。它是最为接近poll英文原始意义 阅读全文

posted @ 2019-03-07 09:14 tsecer 阅读(564) 评论(0) 推荐(0) 编辑

gdb之jump指令及修改函数返回值
摘要:一、进程调试主要发生在一些调试环境中,文件的编译我们可以认为比较麻烦,或者说我们并不像真正的修改源代码,因为测试的代码修改之后还要改回来;麻烦不说,如果修改之后测试代码没有改回来,那么问题就更加严重了,所以我们尽量希望通过gdb工具来环保的修改程序的行为,这样我们就可能使用到下面的一些方法和指令。二 阅读全文

posted @ 2019-03-07 09:13 tsecer 阅读(2596) 评论(0) 推荐(0) 编辑

TCP/UDP丢包
摘要:一、丢包这个丢包不是网卡级别的丢包,在每个网卡中也会显示丢失的包的数据。这个一般是由于网卡在中断处理中需要通过skbuff来存储新来的包。此时是直接通过内存管理接口申请结构,此时这个地方并没有办法做限制,因为此时的中断处理程序并不理解上层的协议,更不用说进程或者是socket这些逻辑概念。所以当网卡 阅读全文

posted @ 2019-03-07 09:12 tsecer 阅读(1458) 评论(0) 推荐(0) 编辑

C/C++语法之若干个为什么
摘要:一、语法语法是一个语言的基础,每个语言都会形式化的定义自己的语法规则,因为现在大部分时候还是“属性文法”,也就是基于语法的语义识别,所以严格的语法对于任何一门语言都是必须的,即使所谓的第四代编程语言SQL语言看起来非常高端,但是事实上它的语法也是有严格规定的,也可以通过语法文件(好像应该叫巴克斯-诺 阅读全文

posted @ 2019-03-07 09:11 tsecer 阅读(151) 评论(0) 推荐(0) 编辑

unix socket,stream vs dgram及抽象套接字
摘要:一、unix套接字这种形式的套接字和通常的计算机间通讯不同,它是用来进行计算机内部进程间通讯的一种方式。大家比较经常接触到的进程间通讯方式可能是管道(无名和命名)、消息队列、共享内存等,可能对这个使用的比较少。那么我们可以想象一下这种通讯方式和前几种通讯方式相比,它的特殊之处在哪里?作为一个套接字, 阅读全文

posted @ 2019-03-07 09:10 tsecer 阅读(1177) 评论(0) 推荐(0) 编辑

从unix类套接口看stream与dgram区别及抽象套接口
摘要:一、unix套接字这 种形式的套接字和通常的计算机间通讯不同,它是用来进行计算机内部进程间通讯的一种方式。大家比较经常接触到的进程间通讯方式可能是管道(无名和命名)、 消息队列、共享内存等,可能对这个使用的比较少。那么我们可以想象一下这种通讯方式和前几种通讯方式相比,它的特殊之处在哪里?作为一个套接 阅读全文

posted @ 2019-03-07 09:09 tsecer 阅读(1111) 评论(0) 推荐(0) 编辑

bool值一定为0或者1吗
摘要:一、bool值的范围根据C++语言中的说明,一个bool值可能的值只有两个,要么是0,要么是1。但是对于一个未初始化的bool值变量,它的取值范围却要丰富多彩的多,它的取值范围应该是可以为任意的一个单字节整数。测试的程序非常简单,大家随便打印一下一个未初始化的bool变量的值就应该可以看到各种各样的 阅读全文

posted @ 2019-03-07 09:08 tsecer 阅读(1645) 评论(0) 推荐(0) 编辑

多进程侦听同一端口
摘要:一、端口侦听我们知道,系统中的互联网端口地址是系统级唯一的,在默认情况下,IPV4和IPV6的同一个协议的套接口也不能再同一个端口侦听,而套接口编程的五元组就是<IP,port,peerip,peerport,inet proto>,其中没有进程区分,所以一个系统的套接口对于同一个网络地址来说是唯一 阅读全文

posted @ 2019-03-07 09:07 tsecer 阅读(486) 评论(0) 推荐(0) 编辑

sz/rz实现及cat binary文件时乱码问题
摘要:一、嵌入式系统中文件传输这个工具之前还的确是没有使用到过,可能的原因是因为之前一直使用桌面系统fedora core发行版本,开发主要使用busybox文件系统,而这两种版本中都没有自带sz/rz工具。它们的作用是通过串口来发送和接收文件,虽然说是串口,所有的支持串口协议的软件或者链路都可以,例如使 阅读全文

posted @ 2019-03-07 09:06 tsecer 阅读(1414) 评论(0) 推荐(0) 编辑

网络协议栈(14)iptables实现浅析
摘要:一、linux下的防火墙基础iptables这个功能在之前的说法叫做ipchains,后来才修改为这个名字。名字本身通常会体现出很多的信息,这些信息可能根本不需要专业知识,只是因为这些术语本身不是我们的母语,加上翻译中信息的缺失和转义等问题,导致很多术语本身的意义并没有体现出来。拿我们最为熟悉的程序 阅读全文

posted @ 2019-03-07 09:05 tsecer 阅读(445) 评论(0) 推荐(0) 编辑

c++虚函数实现的一个直观例子
摘要:一、memset一个对象这个是一个非常低级的错误,本身大家一看就看到这个代码是错误的,但是如果出现在面试题里,估计很多人会纠结一下,也可能会忽略这个问题。因为之前比较多的是用C语言,所以初始化一个结构的方法就是随手一个飘逸的memset一个结构。但是在C++中,这种方法可能会引起严重问题,特别的就是 阅读全文

posted @ 2019-03-07 09:05 tsecer 阅读(93) 评论(0) 推荐(0) 编辑

pthread_exit/pthread_kill之后局部对象之析构
摘要:一、多线程与析构函数这个是在C++编码中可能存在的一个问题,假设说一个线程执行了局部变量的构造函数之后,没有退出局部对象作用域之前,它主动退出线程(pthread_exit)或者被动退出线程(pthread_kill ed),那么这个局部变量的析构函数是否会执行?这个问题对于通常的程序来说影响并不大 阅读全文

posted @ 2019-03-07 09:04 tsecer 阅读(537) 评论(0) 推荐(0) 编辑

链接器之Map文件与符号表
摘要:一、map、全局符号及静态符号一般的大型工程都会在生成可执行文件的同时让链接器生成一个map文件,从而大致查看一下可执行文件中符号的内存布局以及从哪里引入可执行文件。这个通常对于小型工程是作用不大,因为代码就那么多,随便grep一下就知道符号定义位置了。但是对于一些大型工程或者涉及了比较多的第三方库 阅读全文

posted @ 2019-03-07 09:03 tsecer 阅读(2936) 评论(0) 推荐(0) 编辑

链接器之库文件处理
摘要:一、链接输入其实链接真正的输入只有两类,一类是目标文件,另一类是库文件(包括通常以.a结束的静态库和以so结束的动态库),当然还有链接脚本输入以及响应文件输入等信息,这些咱就不加进来搀和了。但是事实上一个库文件也是一个所有目标文件以某种形式组成的打包文件。就好像windows下的winrar或者li 阅读全文

posted @ 2019-03-07 09:02 tsecer 阅读(360) 评论(0) 推荐(0) 编辑

linux下生成coredump文件
摘要:一、coredump文件这种文件通俗的说法叫进程转储,其中比较洋气的“转储”就是dump的翻译,这个词在计算机中用的比较多,所以建议大家多用,显得比较专业。在windows下可以通过MiniDumpWriteDump这个API来直接生成一个运行进程的转储文件。这个API的名字集成了windows A 阅读全文

posted @ 2019-03-06 21:52 tsecer 阅读(884) 评论(0) 推荐(0) 编辑

Linux动态链接(4)ldd与ldconfig
摘要:一、动态链接工具ldd和ldconfig是动态链接的两个重要辅助工具,所谓“辅助”,是相对于真正的主角动态链接器ld.so,说它是工具,是只它相对于配置文件/etc/ld.so.conf文件。ldd不直接参与链接过程,它依赖于ld.so,但是ld.so不依赖于这个工具,事实上,ldd只是一个脚本,它 阅读全文

posted @ 2019-03-06 21:51 tsecer 阅读(1251) 评论(0) 推荐(0) 编辑

Linux动态链接(5)动态库符号搜索顺序
摘要:一、动态搜索与静态搜索这里的动态搜索是指通过dlopen+dlsym来搜索动态库符号的过程,而静态搜索则是指程序在运行的过程中的惰性链接实现。这里其实又是一个比较边界的问题,但是也是可能存在的,另外这些问题可以促使感兴趣的同学看一下真正的实现代码。问题是这样的:假设说一个静态链接的文件通过dlope 阅读全文

posted @ 2019-03-06 21:51 tsecer 阅读(599) 评论(0) 推荐(0) 编辑

Linux动态链接(3)so文件映射地址
摘要:一、so文件的加载地址so文件一般在程序刚启动的时候由动态连接器映射入可执行程序的地址空间,也可以通过dl库中的dlopen来映射入可执行程序的地址空间中,它的底层实现都是通过mmap来实现,这个没有什么好说的。通常来说,我们自己使用的so文件是很少主动确定so文件加载入内存的地址,所以so文件运行 阅读全文

posted @ 2019-03-06 21:50 tsecer 阅读(1345) 评论(0) 推荐(0) 编辑

Linux动态链接(2)so初始化执行
摘要:一、so文件和exe文件这两种文件其实具有很多相似自出,或者说so文件是介于obj文件和exe文件的一种中间过渡形式,它虽然不能直接运行(但是经过特殊编写的so文件内核是支持加载运行的,例如ld.so),但是具有了自己的一些更为高级的内容,例如一些初始化节,got表等内容,虽然孱弱,但是它具有了更加 阅读全文

posted @ 2019-03-06 21:49 tsecer 阅读(1760) 评论(0) 推荐(0) 编辑

Linux动态链接(1)惰性链接
摘要:一、动态链接在Linux(unix族谱)下,共享目标文件称为so文件,它和windows下的DLL机制对应,该功能在节省物理内存使用量上有重要意义,但是更重要的它还是一种扩展框架,也就是很多所谓的“插件”的实现基础。从它的出现频率上来看,它和Linux下的多线程具有同等重要的地位,甚至更高。因为很多 阅读全文

posted @ 2019-03-06 21:48 tsecer 阅读(370) 评论(0) 推荐(0) 编辑

kill信号由谁接收处理
摘要:一、信号发送方式:片发VS点发通常信号发送都是使用kill系统调用来实现,这个功能其实相对粗糙一些,它的第一个参数指明了接受者,但是这个接受者在多线程中并不总是最终的处理者。那么通过这个现象可以解释这个参数的意义:那就是首选(prefer)这个线程,但是如果这个线程实在是有些难言之隐,那么它所在的线 阅读全文

posted @ 2019-03-06 21:47 tsecer 阅读(841) 评论(0) 推荐(0) 编辑

gdb动态库延迟断点及线程/进程创建相关事件处理(下)
摘要:一、被调试任务所有so文件如何枚举在前一篇博客中,大致说明了gdb是通过一个动态库提供的回调函数(_dl_debug_state)处埋伏断点,然后通过约定好的_r_debug全局变量来得到exe程序对应的link_map,然后以该结构为队列头来遍历被调试任务中所有的so文件。当时也说了这个地方比较模 阅读全文

posted @ 2019-03-06 21:46 tsecer 阅读(393) 评论(0) 推荐(0) 编辑

gdb调试器之"测不准原则"
摘要:一、测不准原则我大学物理学的不太好,特别是高等物理,这个概念是在很多科普性的读物中都可以见到,就像”罗素悖论“、哥德尔的”不完备理论“、爱因斯坦的”相对论“等,大家都是一知半解,然后根据这个概念大家自由发挥,所以就有千奇百怪的场景和理解了,最后以讹传讹,倒也不清楚这个东西原始真正意义,这种现象在很多 阅读全文

posted @ 2019-03-06 21:46 tsecer 阅读(407) 评论(0) 推荐(0) 编辑

gdb动态库延迟断点及线程/进程创建相关事件处理(上)
摘要:一、gdb对共享库符号的支持当使用gdb调试一些动态链接生成的可执行文件时,我们可能会有意或者无意的在一些不存在的函数上打断点,此时gdb并不是提示错误,而是提示是否在之后加载的动态库中添加该断点,也就是pending断点,下面是一个典型的提示:(gdb) b noexistingFunction 阅读全文

posted @ 2019-03-06 21:45 tsecer 阅读(2288) 评论(0) 推荐(0) 编辑

waitpid之status意义解析
摘要:一、和子进程同步在linux系统中,父进程通常需要通过waitpid来等待/获取子进程状态变化情况,而这个主要就是通过waitXXX函数族来实现的,例如常见的init函数实现的respawn类配置进程(例如getty)、调试器中对子进程状态的获取,shell对同步子进程状态的监控和获取,以及通常我们 阅读全文

posted @ 2019-03-06 21:44 tsecer 阅读(683) 评论(0) 推荐(0) 编辑

bash中管道命令返回值如何确定(下)
摘要:一、shell中'>'何时清空文件由于bash虽然功能没有C语言那么强大,但是它同样是有自己特殊语法,它的整个语法文件的解析也是通过一个yacc文件来定义,其中对于我们关心的'>'重定向实现来说,其语法文件的定义为:bash-4.1\parse.yredirection: '>' WORD { so 阅读全文

posted @ 2019-03-06 21:43 tsecer 阅读(235) 评论(0) 推荐(0) 编辑

bash中管道命令返回值如何确定(上)
摘要:一、管道管道是Linux中的一个重要概念,大家经常会使用管道来进行一些操作,比如最为常见的是一些命令输出的分屏显示使用 more来管道。但是在平常交互式操作的时候,很少人会关心一个管道命令是否执行成功,因为成功错误一眼就看到了,如果程序出错,通常的程序都会非常友好的提示错在哪里了。但是对于一些脚本中 阅读全文

posted @ 2019-03-06 21:42 tsecer 阅读(795) 评论(0) 推荐(0) 编辑

网络协议栈(15)超越进程生命期的TCP套接字
摘要:一、套接口超越进程生命期一般来说,当一个进程退出的时候(不论是主动还是被动),它都会关闭自己的文件描述符,但是对于TCP的套接字来说,它的情况比较特殊,具体怎么特殊呢?我们可以想象一下,TCP是一个有连接的链路,当进程关闭的时候,关闭一端应该告诉对方,也就是发送一个FIN消息到对方,从而让对方有所准 阅读全文

posted @ 2019-03-06 21:41 tsecer 阅读(616) 评论(0) 推荐(0) 编辑

Linux下robust互斥锁实现
摘要:一、robust互斥锁这种类型的锁可能不是POSIX标准中规定的锁,但是也有可能是,这个不太确定,暂时不管。这种类型的锁主要是解决当一个持有互斥锁的线程退出之后这个锁成为不可用状态的一个问题来的。可以想象,一个线程可能持有很多的锁,也可能没有,如果此时有一个外部(被其它任务kill)或者内部(出现访 阅读全文

posted @ 2019-03-06 21:41 tsecer 阅读(2296) 评论(0) 推荐(0) 编辑

daemon任务如何主动释放终端控制权--以telnetd为例
摘要:一、后台任务关于后台任务,我就不在这里拷贝一条一条的定义了。所谓的后台任务引起我的注意,是突然想起了telnetd的一个很拉轰的特征,那就是我们在终端里执行telnetd程序,它不像其它的任务(包括几乎我们可以见到的所有程序,例如cat、login等)只要获得了执行,它就毫不客气的抓住整个终端的输入 阅读全文

posted @ 2019-03-06 21:40 tsecer 阅读(445) 评论(0) 推荐(0) 编辑

mutex与semaphore之比较--基于Linux实现讨论
摘要:一、mutex VS semaphore类比于bool VS int在sysv的早期进程间通讯机制中,是没有mutex这个概念的,正如早期的C89中有int类型但是没有bool类型一样,因为mutex只是semaphore的一个特例而已。但是事情的发展往往也是惊人的相似,那就是bool变量在C99中 阅读全文

posted @ 2019-03-06 21:39 tsecer 阅读(755) 评论(0) 推荐(0) 编辑

网络协议栈(13)syn flood攻击防范及部分重传定时器参数分析
摘要:一、syn cookie攻击防御方法在前一篇文章中说明了syn flood的原理,可以看到,该机制会造成服务器的DOS瘫痪而无法提供正常服务,所以在当前的Linux中提供了一种相对比较智能的方法方法,就是使用syn_cookie机制。它的实现原理就是把连接的状态信息体现在自己提议的初始化序列号上,这 阅读全文

posted @ 2019-03-06 21:38 tsecer 阅读(335) 评论(0) 推荐(0) 编辑

网络协议栈(14)TCP中time_wait套接口管理
摘要:一、TCP拆链发起方经历time_wait状态以前只是注意TCP连接建立时经历的经典的“三次握手”,而对于连接的关闭关注较少,最近看了一下关闭的流程,比建立更为复杂。这个其实也不值得大惊小怪,因为free往往要比malloc复杂,因为free可能要处理释放块的合并。其中比较特殊的有一个time_wa 阅读全文

posted @ 2019-03-06 21:38 tsecer 阅读(452) 评论(0) 推荐(0) 编辑

网络协议栈(12)listen的backlog参数及syn flood攻击
摘要:一、listen调用之backlog参数这个系统调用中的第一个参数就是侦听的"父套接口",就好像进程fork时候的"父进程"一样,这个参数是必须的,我想大家应该都没有什么意见。但是后面还有一个容易被人们忽略的参数就是backlog,这个单词不是很常见,所以我第一看到它的时候是不明白它的意义和作用的, 阅读全文

posted @ 2019-03-06 21:37 tsecer 阅读(491) 评论(0) 推荐(0) 编辑

telnet client窗口关闭后服务器端前台任务如何退出
摘要:一、telnet客户端窗口粗暴关闭一般很多共享式系统都会启动telnet服务,特别是在嵌入式系统中,通常除了串口就是telnet来和单板交互了。典型的场景是一个用户可能通过后台的windows或者linux系统的telnet客户端来telnet连接到服务器上,然后执行操作。在理想情况下,这是一个友好 阅读全文

posted @ 2019-03-06 21:36 tsecer 阅读(371) 评论(0) 推荐(0) 编辑

epoll实现:回调、红黑树及file中万能的private_data
摘要:一、epoll实现原理及回调机制epoll是对select系统调用的改善,适用于同时关注文件比较多的时候的一个中优化方法,例如一个具有大量连接的系统。那么select的缺点在哪里呢?当select被唤醒的时候,它并不知道是被哪个或者哪些文件唤醒的,所以它要对位图中所有的文件进行遍历查询(调用该文件的 阅读全文

posted @ 2019-03-06 21:35 tsecer 阅读(697) 评论(0) 推荐(0) 编辑

从clone看Linux系统调用实现
摘要:一、clone调用这里选择clone作为例子来描述这个问题,是因为它的确有比较明显的特征,这个特征就是它的实现比较复杂。首先,用户态的clone并不和内核的sys_clone直接对应,而其它的大部分用户态API和内核的sys_XXX接口的参数是一一对应的,例如select、open等。在glibc中 阅读全文

posted @ 2019-03-06 21:34 tsecer 阅读(1621) 评论(0) 推荐(0) 编辑

为什么/dev/shm中看不到shmget创建的内存文件及其它(上)
摘要:一、共享内存及传统sys v IPC机制这个机制在SYS V系统中最早引入,是为了提高进程间通讯效率的一种新的机制,不同的进程可以通过不同的逻辑地址来操作相同的物理地址,这样相当于在地址空间隔离的基础上大家建立DMZ(非军事化区),不同的进程在这里毫不戒备,大家坦诚交流,直接操作内存,这样一个进程的 阅读全文

posted @ 2019-03-06 21:33 tsecer 阅读(1099) 评论(0) 推荐(0) 编辑

为什么/dev/shm中看不到shmget创建的内存文件及其它(下)
摘要:一、如何看到sysV IPC shm文件名1、file_system_type.get_sb修改正如上篇所说,在用户态无法看到可shm文件的名称,不同的挂载点使用不同的dentry,而对于tmpfs文件,它的readdir的系统实现就是通过dcache_readdir函数来实现的,但是这个dentr 阅读全文

posted @ 2019-03-06 21:33 tsecer 阅读(1140) 评论(0) 推荐(0) 编辑

有时候,goto是唯一选择
摘要:一、goto情节goto或许相当于白垩纪时期的恐龙,曾经横行于整个地球,但是它的命运和和恐龙一样,最后逐渐绝迹。Dijstra老师第一个对goto拍案而起,痛陈该指令的危害,正如我们现在看有些代码的感受:写代码的人爽了,维护的人哭了。曾经抓住BASIC语言的尾巴,见到过早期的BASIC语言写的程序, 阅读全文

posted @ 2019-03-06 21:32 tsecer 阅读(151) 评论(0) 推荐(0) 编辑

任务退出文件自动关闭及tcp socket半关闭行为特征
摘要:一、任务退出时文件关闭大多数时候,程序的执行就像人生一样,并不是一帆风顺,可能刚才还在运行的不亦乐乎,跑的CPU直冒青烟,但是一会有人发个信号过来就把进程杀死了。就像《让子弹飞》里师爷说的:“刚才还在吃着火锅,唱着小曲,突然就被麻匪劫了”。这样程序有很多事情是来得及完成的,例如我们最为关心的就是程序 阅读全文

posted @ 2019-03-06 21:31 tsecer 阅读(590) 评论(0) 推荐(0) 编辑

C/C++如何完成变量main函数之前初始化
摘要:一、gcc对main之前初始化的支持对于变量的初始化,gcc提供了两个相关功能,一个是#pragma init(xxx),另一个是通过__attribute__((constructor))声明的函数。虽然说#pragma这个属性只在soloris系统中有用,但是对于我们研究其实现原理还是很有帮助的 阅读全文

posted @ 2019-03-06 21:30 tsecer 阅读(1293) 评论(0) 推荐(0) 编辑

gdb如何调用被调试任务的特定函数
摘要:一、gdb中函数调用在gdb中,可以通过call function(args……)来调用一个函数,当然也可以使用print之类的函数来间接的调用一个函数,但是不管如何,它们最终都要求gdb来调用一个函数,执行该函数,取函数返回值等基本逻辑处理。现在想一下gdb是如何让被调试进程执行特定函数的,这里包 阅读全文

posted @ 2019-03-06 21:29 tsecer 阅读(2634) 评论(0) 推荐(0) 编辑

从C++虚函数表看链接器对common段处理
摘要:一、虚函数表的多编译单元定义对于C++来说,它是通过虚函数表来实现自己的多态的,在windows下,C++代码的动态类型识别之类的功能也是和这个虚函数表有关,总之是在这个虚函数表附近。具体是什么布局,我记得《Microsoft Journal》中好像有一系列的文章和图片详细的描述了这个结构,这里我们 阅读全文

posted @ 2019-03-06 21:29 tsecer 阅读(451) 评论(0) 推荐(0) 编辑

从gcc局部static变量初始化看C/C++区别
摘要:一、局部/全局变量局部变量在C++中的使用要频繁的多,并且功能也强大的多,但是这些强大功能的背后无疑会引入问题的复杂性,不想让马儿吃草只想让马儿跑的事大家表乱想。这些初始化的实现就需要C++的库执行更多的动作来完成,虽然各种编译器都是像如今开展的“学雷锋”活动一样干了很多好事都没有留名,但是作为一个 阅读全文

posted @ 2019-03-06 21:28 tsecer 阅读(676) 评论(0) 推荐(0) 编辑

linux下进程堆栈下溢出判断及扩展实现
摘要:一、堆栈扩展在进程创建的时候,内核并没有为进程分配太多的堆栈,即使是逻辑地址空间也没有,这样做的好处就是如果说用户态的程序堆栈向下溢出(对386来说,就是访问了更低地址的内存空间),这样内核可以比较容易的检测出这种错误,尽管这种错误出现的可能性要比向上溢出的概率小的多。记得在之前使用VS编译器的时候 阅读全文

posted @ 2019-03-06 21:26 tsecer 阅读(936) 评论(0) 推荐(0) 编辑

多进程/线程select同一文件问题
摘要:一、多进程select这个是一个不太常见的场景,但是作为探讨性话题,大家可以在这里尽情YY一下,就像YY我们达到共产主义一样,想想会是什么情景,当然,还是这里讨论的问题更靠谱一些。根据select的语义,就是进程来同时等待若干个文件可读/可写/错误状态,直到指定时间结束,这个我想大家都是明白的。现在 阅读全文

posted @ 2019-03-06 21:25 tsecer 阅读(1111) 评论(0) 推荐(0) 编辑

fd/pid选择及fd/signal数量限制
摘要:一、资源这些是一个系统级的行为特征,并且可能没啥直接关系,只是比较琐碎,所以放在一起做个总结,以后查询也方便一些。二、fd/pid回收问题这两个是系统中一个重要的handle,区别在于fd是进程内相关,而pid是系统级(据说加入namespace之后系统也可以有相同pid的进程),这些大家都知道,所 阅读全文

posted @ 2019-03-06 21:25 tsecer 阅读(537) 评论(0) 推荐(0) 编辑

从两个程序看Linux下命令行参数及execve内核实现
摘要:一、两个测试程序[tsecer@Harry ArgLayout]$ cat ArgLayout.c/**简单测试程序,创建命令行参数中指定的进程,但是将execve的第二个参数(也就是子进程的argv数组)修改成随机无意义值*/#include <unistd.h>#include <stdio.h 阅读全文

posted @ 2019-03-06 21:24 tsecer 阅读(579) 评论(0) 推荐(0) 编辑

从printXX看tty设备(6)tty框架及串口O_NONBLOCK何时丢失数据
摘要:一、内核tty实现这个模块在内核的实现中占有浓重的一笔,我甚至经常觉得,经常搞的是串口还是网口是嵌入式工程师和网络工程师的一重要区别标志。所以作为一个嵌入式工程师,对这个tty设备接触的比较多,所以感情也比较深一些。在2011年11月份(伟大的圣光棍节月份),我在博客里对tty设备做了一个简单的总结 阅读全文

posted @ 2019-03-06 21:22 tsecer 阅读(517) 评论(0) 推荐(0) 编辑

文件在多大程度、多大范围共享
摘要:一、文件的重要性文件在Unix系统中绝对是一个说之不尽的话题,也是一个非常重要的概念。对于文件,默认是子进程会继承父进程的文件描述符,而内核则负责init进程的三个文件描述符(标准输入、标准输出、标准错误,下同)。我们知道,对于同一个文件描述符,在不同的进程中可能代表不同的内容,但是如果是从init 阅读全文

posted @ 2019-03-06 21:21 tsecer 阅读(185) 评论(0) 推荐(0) 编辑

Linux权限管理(一)—打开权限
摘要:一、打开权限这里其实比较感兴趣的是文件夹的权限,假设对于root用户的一个文件夹,或者另一个不允许其它用户访问的文件夹,如果用户访问这个路径是否可以访问文件夹下的文件?简单的模型是这样的[root@Harry ~]# ll /drwxr-x--x. 2 root root 4096 2012-02- 阅读全文

posted @ 2019-03-06 21:20 tsecer 阅读(1164) 评论(0) 推荐(0) 编辑

高端内存之“走马楼台类转蓬”
摘要:一、高端内存这个是Linux中的一个实现机制,当物理内存大于1G的时候,高于896M之上的内存就属于高端内存。这里的问题是:物理内存大于1G,但是内核可以使用的逻辑地址空间只有1G,所以内存物理地址空间多于内核可以使用的逻辑地址空间,这就相当于有些人钱多的花不完,也苦恼(请让我尽情的苦恼把),或者说 阅读全文

posted @ 2019-03-06 21:19 tsecer 阅读(358) 评论(0) 推荐(0) 编辑

uclibc中LinuxThread模型与nptl线程库一点不同
摘要:一、uclibc中posix thread实现在早期Linux内核对象线程支持不是那么贴心的时候,用户态的posix线程实现也很蹩脚,通俗的说,就是上梁不正下梁歪。对于Unix下重要的posix线程库,libc的实现是通过所谓的LinuxThread模型来实现的,这个是试图在内核不支持线程的基础上模 阅读全文

posted @ 2019-03-06 21:19 tsecer 阅读(462) 评论(0) 推荐(0) 编辑

从glibc中backtrace实现看gcc内联汇编
摘要:一、glibc中powerpc的backtrace实现这个函数是C库提供的堆栈回溯功能,实现原理也不复杂,就是从堆栈中寻找函数返回地址,只是powerpc里使用了内联汇编。int__backtrace (void **array, int size){ struct layout *current; 阅读全文

posted @ 2019-03-06 21:17 tsecer 阅读(797) 评论(0) 推荐(0) 编辑

文件内部修改之后编辑器(vim)写回
摘要:一、文件中间修改写回这个不是问题,只是一个偶尔想起的一个事儿。因为我经常看帖子回帖的时候看到精彩的内容都会记录到一个txt文件中,而且我还有一个好习惯,就是每次把新收集的内容放在文件的开始而不是像论坛的帖子一样后来的回复追加在最后,因为我还有一个习惯,看这个文件都是从后向前看的,所以也没有问题。随着 阅读全文

posted @ 2019-03-06 21:16 tsecer 阅读(190) 评论(0) 推荐(0) 编辑

匿名管道之“第三者插足”
摘要:一、管道管道是unix系统的一个重要特征,也正是管道让shell可以把各种不同功能的程序和谐的连接在一起。匿名管道并不是通过open系统调用来创建的,也不是用mknod创建,使用了自己的一个专用通道pipe系统调用。由于匿名管道没有名字,所以只能在父进程和子进程之间共享,当然进程也可以在多线程中用管 阅读全文

posted @ 2019-03-06 21:16 tsecer 阅读(115) 评论(0) 推荐(0) 编辑

pthread_cancel如何实现及相关信号
摘要:一、杀死线程这个名字并不像中文"杀死"对应的那样暴力,而是使用了一个相对比较糖衣炮弹的名字,pthread_cancel。事实上,这个中文对应的pthread_kill有另外专门的作用,就是向指定特殊线程发送信号。这里比较感兴趣的是pthread_cancel是如何实现的,它发送的信号是什么信号,为 阅读全文

posted @ 2019-03-06 21:14 tsecer 阅读(1672) 评论(0) 推荐(0) 编辑

bash中命令前设置子进程变量的绿色方法
摘要:一、语法这其实是一个比较小的细节问题,但是觉得比较有创意(而且一用就会让人产生“当时我就震惊鸟”了感觉),而且bash的这个功能的实现代码为bash代码的晦涩性也做了不少贡献,所以这里还是看一下这个比较有创意的语法。这个功能和管道一样,感觉是一个绿色环保的命令,说它绿色,就是它"事了拂衣去,深藏身与 阅读全文

posted @ 2019-03-06 21:13 tsecer 阅读(317) 评论(0) 推荐(0) 编辑

char/unsigned char对比较结果的致命影响
摘要:一、字符符号这个问题以前知道char类型有默认有符号和无符号的区分,但是这两种区分到底有什么区别,概念还是比较模糊的,直到今天因为字符符号搞了一个大乌龙,搞的版本无法启动,才算是有了一次刻骨铭心的认识。二、比较语句下面是比较的一个模型,gcc中,char类型在i386/MIPS体系结构默认是有符号的 阅读全文

posted @ 2019-03-06 21:12 tsecer 阅读(358) 评论(0) 推荐(0) 编辑

内存管理(3)---块设备缓冲和文件缓冲独立性验证
摘要:一、块读取和文件读取在前一篇文章的最后,说明了通过/dev/hda1直接访问块设备使用的缓冲区和通过/path/to/file/in/block访问文件并不共享页面缓冲,假设两者中通过一种途径修改了这个设备某个块的内容,然后另一方使用的还是自己缓冲的、未更新的页面内容,此时就会出现不一致。当然这个东 阅读全文

posted @ 2019-03-06 21:10 tsecer 阅读(123) 评论(0) 推荐(0) 编辑

内存管理(1)---匿名页面
摘要:一、匿名页面这些内存页面保存了一些通常所说的机动性最强的内容,或者可以认为是银行的活期存款,这些内存可以随时被使用,随时被归还。例如用户通过malloc-->>mmap申请的内存,或者通过brk/sbrk扩大的堆空间。相对于mmap文件、文件系统元数据之类的内容,这些空间对用户来说最为顺手,也最为常 阅读全文

posted @ 2019-03-06 21:07 tsecer 阅读(289) 评论(0) 推荐(0) 编辑

内存管理(2)---块设备的页面缓冲
摘要:一、块设备这里从文件和页面管理的角度来看块设备。在Linux系统下,根据“一切皆文件”的思想,可以把一个磁盘当做一个文件来读取。为了看一个磁盘,例如第一块硬盘,可以通过hexdump这种通用的工具来显示一个硬盘的原始数据(没有验证是否需要root权限),例如对于一个文件系统来说[root@Harry 阅读全文

posted @ 2019-03-06 21:07 tsecer 阅读(387) 评论(0) 推荐(0) 编辑

文件写入前的读取
摘要:一、写入前可能需要读取在前一篇博客中看ramfs文件的时候想到一个问题:内存缓冲是以page为单位的,而许多磁盘设备是以block(sector)为单位的,当然这都不是重点。重点是现在假设有一个文件,它大概有两个页面,现在我只在文件的开始写入(修改)一点点数据,比方说10个字节,然后再seek到文件 阅读全文

posted @ 2019-03-06 21:05 tsecer 阅读(327) 评论(0) 推荐(0) 编辑

网络协议栈(11)NAT转换
摘要:一、NAT 为了让一个外部IP供多个内部主机使用,经常需要将一个主机配置为NAT服务器,从而对外部来看只有一个IP。或者说对于一些网站,可能开辟了多个服务,这些服务使用不同的服务器端口,此时单个服务器无法有效的完成对用户请求的响应,例如http服务器的80端口,或者说为了进行负荷分担,可以将同一个I 阅读全文

posted @ 2019-03-06 21:04 tsecer 阅读(498) 评论(0) 推荐(0) 编辑

线程退出时如何通知等待者
摘要:一、线程退出在之前的一篇博客(http://tsecer.blog.163.com/blog/static/150181720120175027358/)中说明了一个进程描述符的回收过程,其中可以看到,只有主线程有权利通知父进程整个线程组已经退出,也就宣告整个任务的结束,其它的线程(一般通过pthr 阅读全文

posted @ 2019-03-06 21:04 tsecer 阅读(530) 评论(0) 推荐(0) 编辑

网络协议栈(10)netfilter
摘要:一、机制该工具相当于内核中的车匪路霸,它们在内核网络栈中各处安装关卡,对内核中报文的流动进行监控管理,它是Linux系统下实现防火墙的基础,利用用户态的iptables的实现就是netfilter机制的一个典型应用。该机制直接嵌入内核,在内核生成的时候这些监测点就已经被编译入内核,所以是顽固而可靠的 阅读全文

posted @ 2019-03-06 21:03 tsecer 阅读(643) 评论(0) 推荐(0) 编辑

进程描述符回收
摘要:一、进程消亡一个进程消亡之后,它在内核中的户口task_struct结构需要被回收,这个回收必须是主动的通过系统调用来回收,也就是waitpid或者wait4之类的系统调用。但是很多时候,我们并没有关心这个子进程的退出,比如我写的一些测试程序,如果这些进程没有被wait,那么它们是否真的像僵尸一样在 阅读全文

posted @ 2019-03-06 21:02 tsecer 阅读(267) 评论(0) 推荐(0) 编辑

网络协议栈(8)Bridge设备
摘要:一、应用在很多tap虚拟网卡的使用中,bridge也都是被使用的。至少是在qemu的网络模拟和vpn的bridge实现也依赖于bridge这种虚拟设备,所以在看了tap的使用之后,bridge的使用和原理也不可避免的要弱弱的围观一下。这里的bridge并不是一个物理的网桥,而是一个虚拟的网络设备。它 阅读全文

posted @ 2019-03-06 21:01 tsecer 阅读(526) 评论(0) 推荐(0) 编辑

网络协议栈(9)netlink机制
摘要:一、为什么需要这种通讯机制设想用户态和内核交互数据,主要是通过系统调用read,ioctl,或者是proc文件系统。但是read有一个明显的缺点,它是一个字符流机制,不能定制,也就是无论谁从里面读,读到的内容都是相同的。这种无格式的结构对于网络这种非常繁琐的交互方法来说是不够的。例如,要枚举系统中所 阅读全文

posted @ 2019-03-06 21:01 tsecer 阅读(1366) 评论(0) 推荐(0) 编辑

网络协议栈(7)tun/tap设备
摘要:一、网络设备一般一个系统中如果可以连接外网的话,会有一个物理设备,也就是我们通常意义上所说的网卡。但是除了物理上的网卡,系统中还存在这个其他类型的网络设备,这些设备在网络中有着不同的应用场景。例如最为常见的loopback网卡,还有一些不那么常见的网络设备,例如tun/tap网络设备,bridge网 阅读全文

posted @ 2019-03-06 21:00 tsecer 阅读(1036) 评论(0) 推荐(0) 编辑

C库文件缓存对proc读取的影响
摘要:一、问题有时候,一个用户态的监控任务可能要定期的获得系统的某个状态,例如CPU利用率,进程切换次数、甚至maps的布局等信息,这些信息一般都是通过内核的proc文件系统来获得。由于是周期性的获得这些信息,为了避免临时抱佛脚,可以在模块初始化的时候打开这个文件,然后下次就不同通过open系统调用,进而 阅读全文

posted @ 2019-03-06 20:59 tsecer 阅读(477) 评论(0) 推荐(0) 编辑

网络协议栈(6)RFC793TCP连接时部分异常流程及实现
摘要:一、一些边界及不和谐情况一直以为TCP的connect就是通过三次握手来实现的,但是今天看书看到说有同时打开,这个时候是四次握手。正是印证只有想不到,没有做不到的道理。当然这里不是说这是TCP的bug,而是TCP在自己的RFC中预见并讨论了这种情况,其中说明了这种同时打开出现的场景以及TCP应该表现 阅读全文

posted @ 2019-03-06 20:58 tsecer 阅读(459) 评论(0) 推荐(0) 编辑

网络协议栈(5)sendto/send返回成功意味着什么
摘要:一、有连接与无连接 上层编程的时候我们比较常见的就是UDP使用sendto发送,而TCP使用send发送,前者是无连接的,后者是面向连接的。或者通俗的说,TCP比UDP更靠谱一些。所谓面向连接就是说这个发送协议栈担任了雷锋侠的角色,就是默默地对链路进行了协调和维护,从而让这个链路看起来更加的稳定。例 阅读全文

posted @ 2019-03-06 20:57 tsecer 阅读(4761) 评论(0) 推荐(0) 编辑

网络协议栈(4)路由及网关选择
摘要:一、路由选择 路由选择是IP层最为重要也是最为基本的一个功能,可以说是因特网实现报文交通的基础,所以这个东西还是比较重要的,大部分的网络设备供应商都会提供自己的路由器产品。当然我这里就无缘领教这些东西了,只是从Linux内核的协议栈中看一下一个PC的简单路由功能及实现方法。 之前说过当一个TCP客户 阅读全文

posted @ 2019-03-06 20:56 tsecer 阅读(1318) 评论(0) 推荐(0) 编辑

为什么C++函数调用前必须声明
摘要:一、习惯性问题刚从C++转到C开发的时候,觉得C里面一些函数调用不用声明函数原型,也不用定义,当时觉得很神奇。后来在C语言下开发久了,发现调用的函数没有声明导致编译错误,又觉得很神奇。看来很多东西习惯了就见鬼不怪了。二、测试的代码[tsecer@Harry GccTest]$ cat MustDec 阅读全文

posted @ 2019-03-06 20:55 tsecer 阅读(5125) 评论(0) 推荐(1) 编辑

网络协议栈(3)server与connect的交互
摘要:一、侦听和连接现在暂时不考虑网络拥塞问题,假设我们生活在新闻联播里,网络和谐,网速超快。现在一个好客的server在listen之后通过accept准备接受四面八方的朋友,此时就有一个客户端系统通过connect系统调用来连接这个服务器上的侦听套接口,我们暂时分析一下这个服务器的大致流程。当然,服务 阅读全文

posted @ 2019-03-06 20:54 tsecer 阅读(588) 评论(0) 推荐(0) 编辑

网络协议栈(2)connect超时
摘要:一、网络问题 如果世界都是像童话中描述的那样,那我们就真的和谐了,但是事实上往往是残缺不全。当我们在分析网络协议的时候,如果网络都是想美帝那样流畅,那报文的发送就没有问题了。但是现在如果不幸的是如果网络质量很差,那么此时就会出现TCP的丢包问题,此时大家都觉得网络很卡,比方说,WAR3就没法玩了。 阅读全文

posted @ 2019-03-06 20:51 tsecer 阅读(682) 评论(0) 推荐(0) 编辑

网络协议栈(1)从tcp的connect开始
摘要:一、基本结构 内核中网络模块有眼花缭乱的数据结构,而且从名字和功能上看还没啥差别,所以对代码的理解还是有不小影响的。这里就是一个网络的开始阶段,然后尝试以这个为入口,看看系统中的网络的相关模块和功能实现。 1、socket 根据 毛德操 《linux情景分析》下册863页有一个比较合理的解释:“so 阅读全文

posted @ 2019-03-06 20:50 tsecer 阅读(523) 评论(0) 推荐(0) 编辑

pthread_mutex的任务间同步
摘要:一、说明 在linux下,这个pthread_mutex是posix多线程编程的一个规范,从名字上看,它也是一个线程间的同步机制。狭义上理解就是一个任务内部的多个线程之间的一个同步机制,这一点对于Linux系统下的futex机制实现可以产生很大影响。因为如果是同一进程的线程,那么所有线程使用的都是相 阅读全文

posted @ 2019-03-06 20:49 tsecer 阅读(351) 评论(0) 推荐(0) 编辑

mmap文件修改内容的写回
摘要:一、问题 在Linux下,使用mmap是操作文件内容的一个非常方便的方法,它可以将相对受限的文件操作接口转换为大家喜闻乐见的内存操作。这个本身可以引申出很多方便的操作,比如,我们可以将这个内存地址(也就是对应的文件的某个部分)转换为一个特定的数据结构指针,从而可以方便的进行结构的读取和修改。 大部分 阅读全文

posted @ 2019-03-06 20:48 tsecer 阅读(4054) 评论(0) 推荐(0) 编辑

信号处理之物理信号和软件信号
摘要:一、概述 题目有些绕,因为不知道这两种信号的学名是什么。我想表达的意思就是两种不同来源的信号:一种是实实在在发生的信号,例如程序运行的过程中遇到了一个非法地址访问,最为典型的就是 *(int *) 0 = 0; 此时程序一定会收到一个SIGSEGV信号的,因为此时程序不能再继续运行下去了。用拟人的语 阅读全文

posted @ 2019-03-06 20:47 tsecer 阅读(594) 评论(0) 推荐(0) 编辑

从printXX看tty设备(5)串口终端
摘要:一、引言 在嵌入式系统中,串口几乎是系统操作的唯一途径,所以串口的使用在嵌入式系统中有着重要作用。因为嵌入式是一个爹不亲,娘不爱的苦命娃,它一般成本比较低,当它被制造出来之后,人们就希望它这么安安静静、平平安安、兢兢业业的运行一辈子。也就是这些设备和人(human being)的交互机会比较少,但是 阅读全文

posted @ 2019-03-06 20:46 tsecer 阅读(666) 评论(0) 推荐(0) 编辑

从printXX看tty设备(3)键盘输入处理
摘要:一、键盘输入 根据大量资料的描述,最早的IBM XT PC标准键盘是有83个按键,键盘按键被按下的时候它们向键盘控制器发送的扫描码是合这些按键在键盘上的物理位置相联系的(从左到右,从上到下,ESC扫描码为1,Del为0x53)。我们现在的键盘外观和当时的键盘已经有较大区别,所以这些位置看起来可能不那 阅读全文

posted @ 2019-03-06 20:45 tsecer 阅读(764) 评论(0) 推荐(0) 编辑

从printXX看tty设备(4)伪终端
摘要:一、伪终端的意义 在计算机中,有很多的虚拟技术,使用纯软件的技术来模拟一个硬件设备。例如,使用一个qemu来模拟一个计算机系统、使用tun来模拟一个网卡。归根到底,这些虚拟的原因在于兼容,兼容就是后来的实现要以不修改已有实现为前提。就像intel的指令集和windows的API一样,这里的内容就只能 阅读全文

posted @ 2019-03-06 20:45 tsecer 阅读(687) 评论(0) 推荐(0) 编辑

从printXX看tty设备(2)VGA显示模拟
摘要:一、虚拟终端模拟的问题 前面曾经说过,所谓控制台是对tty设备的一种模拟。tty和主机之间就一根线,所有的交互都在这条串行线上一个bit一个bit的交互,可以看做是“竹筒倒豆子”--直来直去的模式。进一步说,主机不能(也没有义务)直接控制tty设备上的显示设备(比如显示设备对应的内存、显示控制寄存器 阅读全文

posted @ 2019-03-06 20:44 tsecer 阅读(563) 评论(0) 推荐(0) 编辑

从printXX看tty设备(1)tty基础
摘要:一、主题 当定位一个问题的时候,最为直观和简单的方法就是在代码的特定位置加上对我们感兴趣的特定数据的打印,这是不依赖其它外部工具(调试器类工具)最简单和直观的方法,这个方法在用户态和内核态调试中都是适用的,就连最经典的C语言程序也是一个printf(“Hello World\n”),可见这个prin 阅读全文

posted @ 2019-03-06 20:43 tsecer 阅读(410) 评论(0) 推荐(0) 编辑

PowerPC下连接器--relax选项实现
摘要:一、问题 在编译一些大的工程的可执行文件的时候,可以发现如果使用DEBUG版本,代码段加上和代码段放在一起的只读数据(字符串或者常量全局变量等)数量将会比较庞大,而在glibc的crti中会有一个对GLABAL_OFF_TABLE(GOT)表的重定向,这个重定向类型为为,从网络上可以看到这种错误类型 阅读全文

posted @ 2019-03-06 20:42 tsecer 阅读(1006) 评论(0) 推荐(0) 编辑

信号间优先级及线程优先级对信号的影响
摘要:一、问题引出 为了精确定位一个任务退出的时候是何种原因,例如是看门狗复位,或者是受到了某些人为主动复位(kill 指定任务,或者reboot导致的简介SIGTERM+SIGKILL组合),或者是某些第三方库中执行了exit导致了线程的退出等原因。这就需要内核进行介入,记录指定感兴趣任务(之后称为受控 阅读全文

posted @ 2019-03-06 20:41 tsecer 阅读(651) 评论(0) 推荐(0) 编辑

Linux下符号版本原理及实现
摘要:一、问题 这个就是在一些使用了共享目标文件的可执行文件编译时环境和运行时环境不同(比方说,编译的时候在一个较高版本的环境中编译的,此时使用的C库版本较新,然后将生成的可执行文件放在一个较低版本的系统中运行,此时可能会提示符号版本错误,从而可执行文件加载失败)而导致的可执行文件夹加载失败,这种问题在网 阅读全文

posted @ 2019-03-06 20:41 tsecer 阅读(3413) 评论(0) 推荐(0) 编辑

从pthread_self看GNU ld链接器
摘要:一、问题引出 对于主线程(也就是main函数对应的线程),它并不是通过pthread_create创建的线程,所以我们没有这个主线程对应的pthread_t结构,这个结构也就是pthread_create的第一个参数。这当然只是最为直观的一个结论,事实上系统不会这么羸弱,在main函数中通过pthr 阅读全文

posted @ 2019-03-06 20:40 tsecer 阅读(537) 评论(0) 推荐(0) 编辑

从根文件系统制作看loop设备
摘要:一、引出 在Linux系统下,通过 dd + losetup + mkfs 创建一个根文件系统已经是创建一个Linux根文件系统的一个常规方法。由于这个是通过一个loop设备来创建的文件,所以这个loop文件是把一个文件看做是一个设备,这个还是一个相对比较高难度的一个适配,因为上层肯定是使用了块设备 阅读全文

posted @ 2019-03-06 20:38 tsecer 阅读(812) 评论(0) 推荐(0) 编辑

i386 relocatable内核实现
摘要:一、问题的引出 在Linux系统中,当内核发生panic的时候,我们可能希望能够保留内核的现场,就像当用户态程序异常的时候内核对应用程序的“吐核”一样(注意,不是吐槽)。但是应用程序的吐核是由内核来完成的,那么内核自己真正的吐自己该如何完成呢? 二、实现方法 这个实现是和kdump结合来实现的,这个 阅读全文

posted @ 2019-03-06 20:37 tsecer 阅读(612) 评论(0) 推荐(0) 编辑

Linux中多CPU的runqueue及抢占
摘要:一、引出 在在嵌入式操作系统中,很多线程都可以为实时任务,因为毕竟这些线程很少和人接触,而是面向任务的。所有就有一个抢占的时机问题。特别是2.6内核中引入了新的内核态抢占任务,所以就可以说一下这个内核态抢占的实现。 内核态抢占主要发生在两个时机,一个是主动的检测是否需要抢占,另一个就是在异常处理完之 阅读全文

posted @ 2019-03-06 20:36 tsecer 阅读(4472) 评论(0) 推荐(1) 编辑

Linux下386中断处理
摘要:一、中断和异常 这两个概念虽然处理的方式大致相同,但是本质上是有很大差别的,而且在386下它们的处理和语义对系统中最为重要的内容的理解是很重要的。 首先一个最为重要的差别就是: 当中断发生的时候,处理器在执行了Cs IP EFLAGS(可能还由用户态的SS和ESP)这个一气呵成的寄存器保存之后,处理 阅读全文

posted @ 2019-03-06 20:35 tsecer 阅读(461) 评论(0) 推荐(0) 编辑

任务的休眠与唤醒
摘要:一、问题 任务的基本状态就是可运行与不可运行,这是一个任务的基本状态,正是运行的任务完成了真正的内核功能,而非运行的任务实现了任务的同步。所以任务的运行与非运行的转换是内核调度的一个基本功能。 二、设置的时机和方式 1、任务的去活跃 从调度的代码中看,一个线程设置为活跃与不活跃的两个最基本的操作分别 阅读全文

posted @ 2019-03-06 20:34 tsecer 阅读(515) 评论(0) 推荐(0) 编辑

Linux下SIGSTOP的特殊特征和实现
摘要:一、问题的引出 在多线程用户态程序中,为了更加准确详细的从一个线程观察另一个线程的行为,可能有时候需要让目标线程暂时安静下来,从而便于观测和监控。关于这个行为,首先想到的当然就是向一个线程发送一个SIGSTOP信号(注意,不是向进程,就是通过内核的tkill系统调用,或者说pthread_kill) 阅读全文

posted @ 2019-03-06 20:33 tsecer 阅读(3482) 评论(0) 推荐(0) 编辑

内核线程对信号的处理策略
摘要:一、引出 大家都知道,信号是在进程返回用户态的时候触发执行的一种机制,但是对于内核线程来说,它们并不会返回用户态。这就好像《大话西游》里打劫脚底板的时候那位坐轿的官人没有脚底板一样尴尬。另一方面,通过sigprocmask是不能屏蔽掉SIGKILL和SIGSTOP两个信号的,所以如果我们通过kill 阅读全文

posted @ 2019-03-06 20:32 tsecer 阅读(1438) 评论(0) 推荐(2) 编辑

strace如何获得系统调用相关信息
摘要:一、问题的引出 对于很多的Linux下程序,我们有时候并不像详细的知道它执行的每一条指令或者,或者我们不想(或者不能)进行源代码级的调试,而只实现想大致看一下某个程序它执行了哪些核心的API调用,从而判断出程序执行的关键路径。此时使用strace是一个不错的选择,它可以不间断的执行完一个子程序,从而 阅读全文

posted @ 2019-03-06 20:31 tsecer 阅读(552) 评论(0) 推荐(0) 编辑

从pthread中获得tid及pthread_mutex_unlock本身用户态互斥
摘要:一、pthread结构中获取tid 这个问题是由于很多时候我们都是通过gettid来获得一个线程的tid,其实这个是一个非常简单的系统调用,但是即使它非常简单,我们还是要执行进行系统调用而引入的寄存器保存/恢复等操作。但是,在C库的pthread库的实现过程中,我们可以看到,用户态是肯定保存了一个线 阅读全文

posted @ 2019-03-06 20:30 tsecer 阅读(924) 评论(0) 推荐(0) 编辑

2.6内核中动态模块加载时参数设置
摘要:一、问题的引出 在执行modprobe 的时候,发现oprofile这个动态模块可以在加载时指定参数,强制使用timer=1来让内核使用定时器方式来进行系统的监控。从常识上来说,这个timer参数肯定不是在用户态解析出来的,因为模块加载毕竟是一个模块特有的框架性东西,不可能在用户态做专门出来,所以就 阅读全文

posted @ 2019-03-06 20:29 tsecer 阅读(690) 评论(0) 推荐(0) 编辑

I386下Oprofile实现
摘要:一、引入 OProfile是Linux下性能检测的重要工具,对于系统的优化和评估有意义。例如我们的某一个单板发现CPU利用率很低,也就是真正的工作任务执行的时间不长,所以我们要分析一下系统中是哪些任务占用了大量的CPU时间,此时就需要使用OProfile工具了。 二、原理 现在大部分的CPU都在硬件 阅读全文

posted @ 2019-03-06 20:27 tsecer 阅读(193) 评论(0) 推荐(0) 编辑

Linux2.6中启动ramdisk分析
摘要:一、起因 使用busybox制作了一个cpio.gz的文件系统,然后使用这个文件系统作为qemu的启动盘进行启动,最后发现可以识别出是一个cpio文件系统,但是到最后还是出现了panic,说是找不到文件系统。大致的错误类型为"VFS: Cannot open root device \" …… pa 阅读全文

posted @ 2019-03-06 20:26 tsecer 阅读(667) 评论(0) 推荐(0) 编辑

initrd、rootfs及内核root=参数
摘要:一、0号和1号进程 通俗的讲,0号进程就是以start_kernel为入口的一个任务,也就是内核本身,这个任务的task_struct结构就是我们在编译的时候静态初始化的init_task结构,这个结构的位置和地址在可执行文件生成的时候就已经确定,其中的大部分成员都按照所需进行了初始化。 1号任务就 阅读全文

posted @ 2019-03-06 20:25 tsecer 阅读(5229) 评论(0) 推荐(1) 编辑

pthread_cond_XXX的Glibc实现
摘要:一、解决问题和适用范围 主要是用来等待一个条件,这个条件可能需要另一个线程来满足这个条件。这个和我们平常适用的pthread_mutex_lock的最大不同在于后者保护的一般是一个代码段(也就是关键区),或者一个变量,但是由于一般来说这个变量的访问是在一个关键区中,所以可以认为是一个关键区。 但是对 阅读全文

posted @ 2019-03-06 20:23 tsecer 阅读(494) 评论(0) 推荐(0) 编辑

信号对ERESTARTSYS的处理
摘要:一、问题 在看nanosleep的时候,看到这个函数返回的错误码是-ERESTART_RESTARTBLOCK,所以就比较好奇的看了这个地方的代码,然后看到是在do_signal和handle_signal函数中判断了这些错误码的意义。然后就看一下它们具体的意义。 二、信号的发送 sys_kill( 阅读全文

posted @ 2019-03-06 20:22 tsecer 阅读(1279) 评论(0) 推荐(0) 编辑

Complete Fair Schedule
摘要:一、目的和背景 这种实现的方法,就是在一个理想的时间段内,所有的进程都应该获得一次调度的执行机会(但是执行的时间可能要根据优先级不同,由于非实时任务的优先级static_priority只能通过nice修改,所以nice是修改非实时任务优先级的一个基本方法)。这样的好处是“不患寡而患不均”,即使CP 阅读全文

posted @ 2019-03-06 20:20 tsecer 阅读(210) 评论(0) 推荐(0) 编辑

内核中TCP序列号的生成
摘要:一、分层 分层就是一个层尽量的承担比较小的功能,一个层只完成自己的功能,这样的通用性会比较好。当然,如果只是完成一个功能,那么可以同时把所有的功能都在一层实现,这样对某个功能或者协议来说是比较方便的,但是从维护和使用起来就比较混乱。 TCP提供的机制包括 可靠传输 和 流量控制。这两个功能是TCP的 阅读全文

posted @ 2019-03-06 20:20 tsecer 阅读(1354) 评论(0) 推荐(0) 编辑

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示