2019年3月6日

摘要: 一、coredump文件这种文件通俗的说法叫进程转储,其中比较洋气的“转储”就是dump的翻译,这个词在计算机中用的比较多,所以建议大家多用,显得比较专业。在windows下可以通过MiniDumpWriteDump这个API来直接生成一个运行进程的转储文件。这个API的名字集成了windows A 阅读全文
posted @ 2019-03-06 21:52 tsecer 阅读(920) 评论(0) 推荐(0)
摘要: 一、动态链接工具ldd和ldconfig是动态链接的两个重要辅助工具,所谓“辅助”,是相对于真正的主角动态链接器ld.so,说它是工具,是只它相对于配置文件/etc/ld.so.conf文件。ldd不直接参与链接过程,它依赖于ld.so,但是ld.so不依赖于这个工具,事实上,ldd只是一个脚本,它 阅读全文
posted @ 2019-03-06 21:51 tsecer 阅读(1351) 评论(0) 推荐(0)
摘要: 一、动态搜索与静态搜索这里的动态搜索是指通过dlopen+dlsym来搜索动态库符号的过程,而静态搜索则是指程序在运行的过程中的惰性链接实现。这里其实又是一个比较边界的问题,但是也是可能存在的,另外这些问题可以促使感兴趣的同学看一下真正的实现代码。问题是这样的:假设说一个静态链接的文件通过dlope 阅读全文
posted @ 2019-03-06 21:51 tsecer 阅读(684) 评论(0) 推荐(0)
摘要: 一、so文件的加载地址so文件一般在程序刚启动的时候由动态连接器映射入可执行程序的地址空间,也可以通过dl库中的dlopen来映射入可执行程序的地址空间中,它的底层实现都是通过mmap来实现,这个没有什么好说的。通常来说,我们自己使用的so文件是很少主动确定so文件加载入内存的地址,所以so文件运行 阅读全文
posted @ 2019-03-06 21:50 tsecer 阅读(1462) 评论(0) 推荐(0)
摘要: 一、so文件和exe文件这两种文件其实具有很多相似自出,或者说so文件是介于obj文件和exe文件的一种中间过渡形式,它虽然不能直接运行(但是经过特殊编写的so文件内核是支持加载运行的,例如ld.so),但是具有了自己的一些更为高级的内容,例如一些初始化节,got表等内容,虽然孱弱,但是它具有了更加 阅读全文
posted @ 2019-03-06 21:49 tsecer 阅读(1944) 评论(0) 推荐(0)
摘要: 一、动态链接在Linux(unix族谱)下,共享目标文件称为so文件,它和windows下的DLL机制对应,该功能在节省物理内存使用量上有重要意义,但是更重要的它还是一种扩展框架,也就是很多所谓的“插件”的实现基础。从它的出现频率上来看,它和Linux下的多线程具有同等重要的地位,甚至更高。因为很多 阅读全文
posted @ 2019-03-06 21:48 tsecer 阅读(407) 评论(0) 推荐(0)
摘要: 一、信号发送方式:片发VS点发通常信号发送都是使用kill系统调用来实现,这个功能其实相对粗糙一些,它的第一个参数指明了接受者,但是这个接受者在多线程中并不总是最终的处理者。那么通过这个现象可以解释这个参数的意义:那就是首选(prefer)这个线程,但是如果这个线程实在是有些难言之隐,那么它所在的线 阅读全文
posted @ 2019-03-06 21:47 tsecer 阅读(877) 评论(0) 推荐(0)
摘要: 一、被调试任务所有so文件如何枚举在前一篇博客中,大致说明了gdb是通过一个动态库提供的回调函数(_dl_debug_state)处埋伏断点,然后通过约定好的_r_debug全局变量来得到exe程序对应的link_map,然后以该结构为队列头来遍历被调试任务中所有的so文件。当时也说了这个地方比较模 阅读全文
posted @ 2019-03-06 21:46 tsecer 阅读(421) 评论(0) 推荐(0)
摘要: 一、测不准原则我大学物理学的不太好,特别是高等物理,这个概念是在很多科普性的读物中都可以见到,就像”罗素悖论“、哥德尔的”不完备理论“、爱因斯坦的”相对论“等,大家都是一知半解,然后根据这个概念大家自由发挥,所以就有千奇百怪的场景和理解了,最后以讹传讹,倒也不清楚这个东西原始真正意义,这种现象在很多 阅读全文
posted @ 2019-03-06 21:46 tsecer 阅读(415) 评论(0) 推荐(0)
摘要: 一、gdb对共享库符号的支持当使用gdb调试一些动态链接生成的可执行文件时,我们可能会有意或者无意的在一些不存在的函数上打断点,此时gdb并不是提示错误,而是提示是否在之后加载的动态库中添加该断点,也就是pending断点,下面是一个典型的提示:(gdb) b noexistingFunction 阅读全文
posted @ 2019-03-06 21:45 tsecer 阅读(2487) 评论(0) 推荐(0)
摘要: 一、和子进程同步在linux系统中,父进程通常需要通过waitpid来等待/获取子进程状态变化情况,而这个主要就是通过waitXXX函数族来实现的,例如常见的init函数实现的respawn类配置进程(例如getty)、调试器中对子进程状态的获取,shell对同步子进程状态的监控和获取,以及通常我们 阅读全文
posted @ 2019-03-06 21:44 tsecer 阅读(708) 评论(0) 推荐(0)
摘要: 一、shell中'>'何时清空文件由于bash虽然功能没有C语言那么强大,但是它同样是有自己特殊语法,它的整个语法文件的解析也是通过一个yacc文件来定义,其中对于我们关心的'>'重定向实现来说,其语法文件的定义为:bash-4.1\parse.yredirection: '>' WORD { so 阅读全文
posted @ 2019-03-06 21:43 tsecer 阅读(245) 评论(0) 推荐(0)
摘要: 一、管道管道是Linux中的一个重要概念,大家经常会使用管道来进行一些操作,比如最为常见的是一些命令输出的分屏显示使用 more来管道。但是在平常交互式操作的时候,很少人会关心一个管道命令是否执行成功,因为成功错误一眼就看到了,如果程序出错,通常的程序都会非常友好的提示错在哪里了。但是对于一些脚本中 阅读全文
posted @ 2019-03-06 21:42 tsecer 阅读(832) 评论(0) 推荐(0)
摘要: 一、套接口超越进程生命期一般来说,当一个进程退出的时候(不论是主动还是被动),它都会关闭自己的文件描述符,但是对于TCP的套接字来说,它的情况比较特殊,具体怎么特殊呢?我们可以想象一下,TCP是一个有连接的链路,当进程关闭的时候,关闭一端应该告诉对方,也就是发送一个FIN消息到对方,从而让对方有所准 阅读全文
posted @ 2019-03-06 21:41 tsecer 阅读(658) 评论(0) 推荐(0)
摘要: 一、robust互斥锁这种类型的锁可能不是POSIX标准中规定的锁,但是也有可能是,这个不太确定,暂时不管。这种类型的锁主要是解决当一个持有互斥锁的线程退出之后这个锁成为不可用状态的一个问题来的。可以想象,一个线程可能持有很多的锁,也可能没有,如果此时有一个外部(被其它任务kill)或者内部(出现访 阅读全文
posted @ 2019-03-06 21:41 tsecer 阅读(2399) 评论(0) 推荐(0)
摘要: 一、后台任务关于后台任务,我就不在这里拷贝一条一条的定义了。所谓的后台任务引起我的注意,是突然想起了telnetd的一个很拉轰的特征,那就是我们在终端里执行telnetd程序,它不像其它的任务(包括几乎我们可以见到的所有程序,例如cat、login等)只要获得了执行,它就毫不客气的抓住整个终端的输入 阅读全文
posted @ 2019-03-06 21:40 tsecer 阅读(469) 评论(0) 推荐(0)
摘要: 一、mutex VS semaphore类比于bool VS int在sysv的早期进程间通讯机制中,是没有mutex这个概念的,正如早期的C89中有int类型但是没有bool类型一样,因为mutex只是semaphore的一个特例而已。但是事情的发展往往也是惊人的相似,那就是bool变量在C99中 阅读全文
posted @ 2019-03-06 21:39 tsecer 阅读(801) 评论(0) 推荐(0)
摘要: 一、syn cookie攻击防御方法在前一篇文章中说明了syn flood的原理,可以看到,该机制会造成服务器的DOS瘫痪而无法提供正常服务,所以在当前的Linux中提供了一种相对比较智能的方法方法,就是使用syn_cookie机制。它的实现原理就是把连接的状态信息体现在自己提议的初始化序列号上,这 阅读全文
posted @ 2019-03-06 21:38 tsecer 阅读(349) 评论(0) 推荐(0)
摘要: 一、TCP拆链发起方经历time_wait状态以前只是注意TCP连接建立时经历的经典的“三次握手”,而对于连接的关闭关注较少,最近看了一下关闭的流程,比建立更为复杂。这个其实也不值得大惊小怪,因为free往往要比malloc复杂,因为free可能要处理释放块的合并。其中比较特殊的有一个time_wa 阅读全文
posted @ 2019-03-06 21:38 tsecer 阅读(477) 评论(0) 推荐(0)
摘要: 一、listen调用之backlog参数这个系统调用中的第一个参数就是侦听的"父套接口",就好像进程fork时候的"父进程"一样,这个参数是必须的,我想大家应该都没有什么意见。但是后面还有一个容易被人们忽略的参数就是backlog,这个单词不是很常见,所以我第一看到它的时候是不明白它的意义和作用的, 阅读全文
posted @ 2019-03-06 21:37 tsecer 阅读(523) 评论(0) 推荐(0)
摘要: 一、telnet客户端窗口粗暴关闭一般很多共享式系统都会启动telnet服务,特别是在嵌入式系统中,通常除了串口就是telnet来和单板交互了。典型的场景是一个用户可能通过后台的windows或者linux系统的telnet客户端来telnet连接到服务器上,然后执行操作。在理想情况下,这是一个友好 阅读全文
posted @ 2019-03-06 21:36 tsecer 阅读(403) 评论(0) 推荐(0)
摘要: 一、epoll实现原理及回调机制epoll是对select系统调用的改善,适用于同时关注文件比较多的时候的一个中优化方法,例如一个具有大量连接的系统。那么select的缺点在哪里呢?当select被唤醒的时候,它并不知道是被哪个或者哪些文件唤醒的,所以它要对位图中所有的文件进行遍历查询(调用该文件的 阅读全文
posted @ 2019-03-06 21:35 tsecer 阅读(719) 评论(0) 推荐(0)
摘要: 一、clone调用这里选择clone作为例子来描述这个问题,是因为它的确有比较明显的特征,这个特征就是它的实现比较复杂。首先,用户态的clone并不和内核的sys_clone直接对应,而其它的大部分用户态API和内核的sys_XXX接口的参数是一一对应的,例如select、open等。在glibc中 阅读全文
posted @ 2019-03-06 21:34 tsecer 阅读(1714) 评论(0) 推荐(0)
摘要: 一、共享内存及传统sys v IPC机制这个机制在SYS V系统中最早引入,是为了提高进程间通讯效率的一种新的机制,不同的进程可以通过不同的逻辑地址来操作相同的物理地址,这样相当于在地址空间隔离的基础上大家建立DMZ(非军事化区),不同的进程在这里毫不戒备,大家坦诚交流,直接操作内存,这样一个进程的 阅读全文
posted @ 2019-03-06 21:33 tsecer 阅读(1149) 评论(0) 推荐(0)
摘要: 一、如何看到sysV IPC shm文件名1、file_system_type.get_sb修改正如上篇所说,在用户态无法看到可shm文件的名称,不同的挂载点使用不同的dentry,而对于tmpfs文件,它的readdir的系统实现就是通过dcache_readdir函数来实现的,但是这个dentr 阅读全文
posted @ 2019-03-06 21:33 tsecer 阅读(1171) 评论(0) 推荐(0)
摘要: 一、goto情节goto或许相当于白垩纪时期的恐龙,曾经横行于整个地球,但是它的命运和和恐龙一样,最后逐渐绝迹。Dijstra老师第一个对goto拍案而起,痛陈该指令的危害,正如我们现在看有些代码的感受:写代码的人爽了,维护的人哭了。曾经抓住BASIC语言的尾巴,见到过早期的BASIC语言写的程序, 阅读全文
posted @ 2019-03-06 21:32 tsecer 阅读(173) 评论(0) 推荐(0)
摘要: 一、任务退出时文件关闭大多数时候,程序的执行就像人生一样,并不是一帆风顺,可能刚才还在运行的不亦乐乎,跑的CPU直冒青烟,但是一会有人发个信号过来就把进程杀死了。就像《让子弹飞》里师爷说的:“刚才还在吃着火锅,唱着小曲,突然就被麻匪劫了”。这样程序有很多事情是来得及完成的,例如我们最为关心的就是程序 阅读全文
posted @ 2019-03-06 21:31 tsecer 阅读(619) 评论(0) 推荐(0)
摘要: 一、gcc对main之前初始化的支持对于变量的初始化,gcc提供了两个相关功能,一个是#pragma init(xxx),另一个是通过__attribute__((constructor))声明的函数。虽然说#pragma这个属性只在soloris系统中有用,但是对于我们研究其实现原理还是很有帮助的 阅读全文
posted @ 2019-03-06 21:30 tsecer 阅读(1348) 评论(0) 推荐(0)
摘要: 一、gdb中函数调用在gdb中,可以通过call function(args……)来调用一个函数,当然也可以使用print之类的函数来间接的调用一个函数,但是不管如何,它们最终都要求gdb来调用一个函数,执行该函数,取函数返回值等基本逻辑处理。现在想一下gdb是如何让被调试进程执行特定函数的,这里包 阅读全文
posted @ 2019-03-06 21:29 tsecer 阅读(2802) 评论(0) 推荐(0)
摘要: 一、虚函数表的多编译单元定义对于C++来说,它是通过虚函数表来实现自己的多态的,在windows下,C++代码的动态类型识别之类的功能也是和这个虚函数表有关,总之是在这个虚函数表附近。具体是什么布局,我记得《Microsoft Journal》中好像有一系列的文章和图片详细的描述了这个结构,这里我们 阅读全文
posted @ 2019-03-06 21:29 tsecer 阅读(472) 评论(0) 推荐(0)
摘要: 一、局部/全局变量局部变量在C++中的使用要频繁的多,并且功能也强大的多,但是这些强大功能的背后无疑会引入问题的复杂性,不想让马儿吃草只想让马儿跑的事大家表乱想。这些初始化的实现就需要C++的库执行更多的动作来完成,虽然各种编译器都是像如今开展的“学雷锋”活动一样干了很多好事都没有留名,但是作为一个 阅读全文
posted @ 2019-03-06 21:28 tsecer 阅读(733) 评论(0) 推荐(0)
摘要: 一、堆栈扩展在进程创建的时候,内核并没有为进程分配太多的堆栈,即使是逻辑地址空间也没有,这样做的好处就是如果说用户态的程序堆栈向下溢出(对386来说,就是访问了更低地址的内存空间),这样内核可以比较容易的检测出这种错误,尽管这种错误出现的可能性要比向上溢出的概率小的多。记得在之前使用VS编译器的时候 阅读全文
posted @ 2019-03-06 21:26 tsecer 阅读(973) 评论(0) 推荐(0)
摘要: 一、多进程select这个是一个不太常见的场景,但是作为探讨性话题,大家可以在这里尽情YY一下,就像YY我们达到共产主义一样,想想会是什么情景,当然,还是这里讨论的问题更靠谱一些。根据select的语义,就是进程来同时等待若干个文件可读/可写/错误状态,直到指定时间结束,这个我想大家都是明白的。现在 阅读全文
posted @ 2019-03-06 21:25 tsecer 阅读(1174) 评论(0) 推荐(0)
摘要: 一、资源这些是一个系统级的行为特征,并且可能没啥直接关系,只是比较琐碎,所以放在一起做个总结,以后查询也方便一些。二、fd/pid回收问题这两个是系统中一个重要的handle,区别在于fd是进程内相关,而pid是系统级(据说加入namespace之后系统也可以有相同pid的进程),这些大家都知道,所 阅读全文
posted @ 2019-03-06 21:25 tsecer 阅读(559) 评论(0) 推荐(0)
摘要: 一、两个测试程序[tsecer@Harry ArgLayout]$ cat ArgLayout.c/**简单测试程序,创建命令行参数中指定的进程,但是将execve的第二个参数(也就是子进程的argv数组)修改成随机无意义值*/#include <unistd.h>#include <stdio.h 阅读全文
posted @ 2019-03-06 21:24 tsecer 阅读(624) 评论(0) 推荐(0)
摘要: 一、内核tty实现这个模块在内核的实现中占有浓重的一笔,我甚至经常觉得,经常搞的是串口还是网口是嵌入式工程师和网络工程师的一重要区别标志。所以作为一个嵌入式工程师,对这个tty设备接触的比较多,所以感情也比较深一些。在2011年11月份(伟大的圣光棍节月份),我在博客里对tty设备做了一个简单的总结 阅读全文
posted @ 2019-03-06 21:22 tsecer 阅读(559) 评论(0) 推荐(0)
摘要: 一、文件的重要性文件在Unix系统中绝对是一个说之不尽的话题,也是一个非常重要的概念。对于文件,默认是子进程会继承父进程的文件描述符,而内核则负责init进程的三个文件描述符(标准输入、标准输出、标准错误,下同)。我们知道,对于同一个文件描述符,在不同的进程中可能代表不同的内容,但是如果是从init 阅读全文
posted @ 2019-03-06 21:21 tsecer 阅读(191) 评论(0) 推荐(0)
摘要: 一、打开权限这里其实比较感兴趣的是文件夹的权限,假设对于root用户的一个文件夹,或者另一个不允许其它用户访问的文件夹,如果用户访问这个路径是否可以访问文件夹下的文件?简单的模型是这样的[root@Harry ~]# ll /drwxr-x--x. 2 root root 4096 2012-02- 阅读全文
posted @ 2019-03-06 21:20 tsecer 阅读(1199) 评论(0) 推荐(0)
摘要: 一、高端内存这个是Linux中的一个实现机制,当物理内存大于1G的时候,高于896M之上的内存就属于高端内存。这里的问题是:物理内存大于1G,但是内核可以使用的逻辑地址空间只有1G,所以内存物理地址空间多于内核可以使用的逻辑地址空间,这就相当于有些人钱多的花不完,也苦恼(请让我尽情的苦恼把),或者说 阅读全文
posted @ 2019-03-06 21:19 tsecer 阅读(375) 评论(0) 推荐(0)
摘要: 一、uclibc中posix thread实现在早期Linux内核对象线程支持不是那么贴心的时候,用户态的posix线程实现也很蹩脚,通俗的说,就是上梁不正下梁歪。对于Unix下重要的posix线程库,libc的实现是通过所谓的LinuxThread模型来实现的,这个是试图在内核不支持线程的基础上模 阅读全文
posted @ 2019-03-06 21:19 tsecer 阅读(492) 评论(0) 推荐(0)
摘要: 一、glibc中powerpc的backtrace实现这个函数是C库提供的堆栈回溯功能,实现原理也不复杂,就是从堆栈中寻找函数返回地址,只是powerpc里使用了内联汇编。int__backtrace (void **array, int size){ struct layout *current; 阅读全文
posted @ 2019-03-06 21:17 tsecer 阅读(891) 评论(0) 推荐(0)
摘要: 一、管道管道是unix系统的一个重要特征,也正是管道让shell可以把各种不同功能的程序和谐的连接在一起。匿名管道并不是通过open系统调用来创建的,也不是用mknod创建,使用了自己的一个专用通道pipe系统调用。由于匿名管道没有名字,所以只能在父进程和子进程之间共享,当然进程也可以在多线程中用管 阅读全文
posted @ 2019-03-06 21:16 tsecer 阅读(120) 评论(0) 推荐(0)
摘要: 一、文件中间修改写回这个不是问题,只是一个偶尔想起的一个事儿。因为我经常看帖子回帖的时候看到精彩的内容都会记录到一个txt文件中,而且我还有一个好习惯,就是每次把新收集的内容放在文件的开始而不是像论坛的帖子一样后来的回复追加在最后,因为我还有一个习惯,看这个文件都是从后向前看的,所以也没有问题。随着 阅读全文
posted @ 2019-03-06 21:16 tsecer 阅读(202) 评论(0) 推荐(0)
摘要: 一、杀死线程这个名字并不像中文"杀死"对应的那样暴力,而是使用了一个相对比较糖衣炮弹的名字,pthread_cancel。事实上,这个中文对应的pthread_kill有另外专门的作用,就是向指定特殊线程发送信号。这里比较感兴趣的是pthread_cancel是如何实现的,它发送的信号是什么信号,为 阅读全文
posted @ 2019-03-06 21:14 tsecer 阅读(1789) 评论(0) 推荐(0)
摘要: 一、语法这其实是一个比较小的细节问题,但是觉得比较有创意(而且一用就会让人产生“当时我就震惊鸟”了感觉),而且bash的这个功能的实现代码为bash代码的晦涩性也做了不少贡献,所以这里还是看一下这个比较有创意的语法。这个功能和管道一样,感觉是一个绿色环保的命令,说它绿色,就是它"事了拂衣去,深藏身与 阅读全文
posted @ 2019-03-06 21:13 tsecer 阅读(331) 评论(0) 推荐(0)
摘要: 一、字符符号这个问题以前知道char类型有默认有符号和无符号的区分,但是这两种区分到底有什么区别,概念还是比较模糊的,直到今天因为字符符号搞了一个大乌龙,搞的版本无法启动,才算是有了一次刻骨铭心的认识。二、比较语句下面是比较的一个模型,gcc中,char类型在i386/MIPS体系结构默认是有符号的 阅读全文
posted @ 2019-03-06 21:12 tsecer 阅读(374) 评论(0) 推荐(0)
摘要: 一、块读取和文件读取在前一篇文章的最后,说明了通过/dev/hda1直接访问块设备使用的缓冲区和通过/path/to/file/in/block访问文件并不共享页面缓冲,假设两者中通过一种途径修改了这个设备某个块的内容,然后另一方使用的还是自己缓冲的、未更新的页面内容,此时就会出现不一致。当然这个东 阅读全文
posted @ 2019-03-06 21:10 tsecer 阅读(133) 评论(0) 推荐(0)
摘要: 一、匿名页面这些内存页面保存了一些通常所说的机动性最强的内容,或者可以认为是银行的活期存款,这些内存可以随时被使用,随时被归还。例如用户通过malloc-->>mmap申请的内存,或者通过brk/sbrk扩大的堆空间。相对于mmap文件、文件系统元数据之类的内容,这些空间对用户来说最为顺手,也最为常 阅读全文
posted @ 2019-03-06 21:07 tsecer 阅读(317) 评论(0) 推荐(0)
摘要: 一、块设备这里从文件和页面管理的角度来看块设备。在Linux系统下,根据“一切皆文件”的思想,可以把一个磁盘当做一个文件来读取。为了看一个磁盘,例如第一块硬盘,可以通过hexdump这种通用的工具来显示一个硬盘的原始数据(没有验证是否需要root权限),例如对于一个文件系统来说[root@Harry 阅读全文
posted @ 2019-03-06 21:07 tsecer 阅读(412) 评论(0) 推荐(0)
摘要: 一、写入前可能需要读取在前一篇博客中看ramfs文件的时候想到一个问题:内存缓冲是以page为单位的,而许多磁盘设备是以block(sector)为单位的,当然这都不是重点。重点是现在假设有一个文件,它大概有两个页面,现在我只在文件的开始写入(修改)一点点数据,比方说10个字节,然后再seek到文件 阅读全文
posted @ 2019-03-06 21:05 tsecer 阅读(339) 评论(0) 推荐(0)
摘要: 一、NAT 为了让一个外部IP供多个内部主机使用,经常需要将一个主机配置为NAT服务器,从而对外部来看只有一个IP。或者说对于一些网站,可能开辟了多个服务,这些服务使用不同的服务器端口,此时单个服务器无法有效的完成对用户请求的响应,例如http服务器的80端口,或者说为了进行负荷分担,可以将同一个I 阅读全文
posted @ 2019-03-06 21:04 tsecer 阅读(536) 评论(0) 推荐(0)
摘要: 一、线程退出在之前的一篇博客(http://tsecer.blog.163.com/blog/static/150181720120175027358/)中说明了一个进程描述符的回收过程,其中可以看到,只有主线程有权利通知父进程整个线程组已经退出,也就宣告整个任务的结束,其它的线程(一般通过pthr 阅读全文
posted @ 2019-03-06 21:04 tsecer 阅读(550) 评论(0) 推荐(0)
摘要: 一、机制该工具相当于内核中的车匪路霸,它们在内核网络栈中各处安装关卡,对内核中报文的流动进行监控管理,它是Linux系统下实现防火墙的基础,利用用户态的iptables的实现就是netfilter机制的一个典型应用。该机制直接嵌入内核,在内核生成的时候这些监测点就已经被编译入内核,所以是顽固而可靠的 阅读全文
posted @ 2019-03-06 21:03 tsecer 阅读(685) 评论(0) 推荐(0)
摘要: 一、进程消亡一个进程消亡之后,它在内核中的户口task_struct结构需要被回收,这个回收必须是主动的通过系统调用来回收,也就是waitpid或者wait4之类的系统调用。但是很多时候,我们并没有关心这个子进程的退出,比如我写的一些测试程序,如果这些进程没有被wait,那么它们是否真的像僵尸一样在 阅读全文
posted @ 2019-03-06 21:02 tsecer 阅读(285) 评论(0) 推荐(0)
摘要: 一、应用在很多tap虚拟网卡的使用中,bridge也都是被使用的。至少是在qemu的网络模拟和vpn的bridge实现也依赖于bridge这种虚拟设备,所以在看了tap的使用之后,bridge的使用和原理也不可避免的要弱弱的围观一下。这里的bridge并不是一个物理的网桥,而是一个虚拟的网络设备。它 阅读全文
posted @ 2019-03-06 21:01 tsecer 阅读(593) 评论(0) 推荐(0)
摘要: 一、为什么需要这种通讯机制设想用户态和内核交互数据,主要是通过系统调用read,ioctl,或者是proc文件系统。但是read有一个明显的缺点,它是一个字符流机制,不能定制,也就是无论谁从里面读,读到的内容都是相同的。这种无格式的结构对于网络这种非常繁琐的交互方法来说是不够的。例如,要枚举系统中所 阅读全文
posted @ 2019-03-06 21:01 tsecer 阅读(1469) 评论(0) 推荐(0)
摘要: 一、网络设备一般一个系统中如果可以连接外网的话,会有一个物理设备,也就是我们通常意义上所说的网卡。但是除了物理上的网卡,系统中还存在这个其他类型的网络设备,这些设备在网络中有着不同的应用场景。例如最为常见的loopback网卡,还有一些不那么常见的网络设备,例如tun/tap网络设备,bridge网 阅读全文
posted @ 2019-03-06 21:00 tsecer 阅读(1323) 评论(0) 推荐(0)
摘要: 一、问题有时候,一个用户态的监控任务可能要定期的获得系统的某个状态,例如CPU利用率,进程切换次数、甚至maps的布局等信息,这些信息一般都是通过内核的proc文件系统来获得。由于是周期性的获得这些信息,为了避免临时抱佛脚,可以在模块初始化的时候打开这个文件,然后下次就不同通过open系统调用,进而 阅读全文
posted @ 2019-03-06 20:59 tsecer 阅读(514) 评论(0) 推荐(0)
摘要: 一、一些边界及不和谐情况一直以为TCP的connect就是通过三次握手来实现的,但是今天看书看到说有同时打开,这个时候是四次握手。正是印证只有想不到,没有做不到的道理。当然这里不是说这是TCP的bug,而是TCP在自己的RFC中预见并讨论了这种情况,其中说明了这种同时打开出现的场景以及TCP应该表现 阅读全文
posted @ 2019-03-06 20:58 tsecer 阅读(503) 评论(0) 推荐(0)
摘要: 一、有连接与无连接 上层编程的时候我们比较常见的就是UDP使用sendto发送,而TCP使用send发送,前者是无连接的,后者是面向连接的。或者通俗的说,TCP比UDP更靠谱一些。所谓面向连接就是说这个发送协议栈担任了雷锋侠的角色,就是默默地对链路进行了协调和维护,从而让这个链路看起来更加的稳定。例 阅读全文
posted @ 2019-03-06 20:57 tsecer 阅读(4883) 评论(0) 推荐(0)
摘要: 一、路由选择 路由选择是IP层最为重要也是最为基本的一个功能,可以说是因特网实现报文交通的基础,所以这个东西还是比较重要的,大部分的网络设备供应商都会提供自己的路由器产品。当然我这里就无缘领教这些东西了,只是从Linux内核的协议栈中看一下一个PC的简单路由功能及实现方法。 之前说过当一个TCP客户 阅读全文
posted @ 2019-03-06 20:56 tsecer 阅读(1377) 评论(0) 推荐(0)
摘要: 一、习惯性问题刚从C++转到C开发的时候,觉得C里面一些函数调用不用声明函数原型,也不用定义,当时觉得很神奇。后来在C语言下开发久了,发现调用的函数没有声明导致编译错误,又觉得很神奇。看来很多东西习惯了就见鬼不怪了。二、测试的代码[tsecer@Harry GccTest]$ cat MustDec 阅读全文
posted @ 2019-03-06 20:55 tsecer 阅读(5202) 评论(0) 推荐(1)
摘要: 一、侦听和连接现在暂时不考虑网络拥塞问题,假设我们生活在新闻联播里,网络和谐,网速超快。现在一个好客的server在listen之后通过accept准备接受四面八方的朋友,此时就有一个客户端系统通过connect系统调用来连接这个服务器上的侦听套接口,我们暂时分析一下这个服务器的大致流程。当然,服务 阅读全文
posted @ 2019-03-06 20:54 tsecer 阅读(600) 评论(0) 推荐(0)
摘要: 一、网络问题 如果世界都是像童话中描述的那样,那我们就真的和谐了,但是事实上往往是残缺不全。当我们在分析网络协议的时候,如果网络都是想美帝那样流畅,那报文的发送就没有问题了。但是现在如果不幸的是如果网络质量很差,那么此时就会出现TCP的丢包问题,此时大家都觉得网络很卡,比方说,WAR3就没法玩了。 阅读全文
posted @ 2019-03-06 20:51 tsecer 阅读(701) 评论(0) 推荐(0)
摘要: 一、基本结构 内核中网络模块有眼花缭乱的数据结构,而且从名字和功能上看还没啥差别,所以对代码的理解还是有不小影响的。这里就是一个网络的开始阶段,然后尝试以这个为入口,看看系统中的网络的相关模块和功能实现。 1、socket 根据 毛德操 《linux情景分析》下册863页有一个比较合理的解释:“so 阅读全文
posted @ 2019-03-06 20:50 tsecer 阅读(547) 评论(0) 推荐(0)
摘要: 一、说明 在linux下,这个pthread_mutex是posix多线程编程的一个规范,从名字上看,它也是一个线程间的同步机制。狭义上理解就是一个任务内部的多个线程之间的一个同步机制,这一点对于Linux系统下的futex机制实现可以产生很大影响。因为如果是同一进程的线程,那么所有线程使用的都是相 阅读全文
posted @ 2019-03-06 20:49 tsecer 阅读(398) 评论(0) 推荐(0)
摘要: 一、问题 在Linux下,使用mmap是操作文件内容的一个非常方便的方法,它可以将相对受限的文件操作接口转换为大家喜闻乐见的内存操作。这个本身可以引申出很多方便的操作,比如,我们可以将这个内存地址(也就是对应的文件的某个部分)转换为一个特定的数据结构指针,从而可以方便的进行结构的读取和修改。 大部分 阅读全文
posted @ 2019-03-06 20:48 tsecer 阅读(4167) 评论(0) 推荐(0)
摘要: 一、概述 题目有些绕,因为不知道这两种信号的学名是什么。我想表达的意思就是两种不同来源的信号:一种是实实在在发生的信号,例如程序运行的过程中遇到了一个非法地址访问,最为典型的就是 *(int *) 0 = 0; 此时程序一定会收到一个SIGSEGV信号的,因为此时程序不能再继续运行下去了。用拟人的语 阅读全文
posted @ 2019-03-06 20:47 tsecer 阅读(623) 评论(0) 推荐(0)
摘要: 一、引言 在嵌入式系统中,串口几乎是系统操作的唯一途径,所以串口的使用在嵌入式系统中有着重要作用。因为嵌入式是一个爹不亲,娘不爱的苦命娃,它一般成本比较低,当它被制造出来之后,人们就希望它这么安安静静、平平安安、兢兢业业的运行一辈子。也就是这些设备和人(human being)的交互机会比较少,但是 阅读全文
posted @ 2019-03-06 20:46 tsecer 阅读(713) 评论(0) 推荐(0)
摘要: 一、键盘输入 根据大量资料的描述,最早的IBM XT PC标准键盘是有83个按键,键盘按键被按下的时候它们向键盘控制器发送的扫描码是合这些按键在键盘上的物理位置相联系的(从左到右,从上到下,ESC扫描码为1,Del为0x53)。我们现在的键盘外观和当时的键盘已经有较大区别,所以这些位置看起来可能不那 阅读全文
posted @ 2019-03-06 20:45 tsecer 阅读(880) 评论(0) 推荐(0)
摘要: 一、伪终端的意义 在计算机中,有很多的虚拟技术,使用纯软件的技术来模拟一个硬件设备。例如,使用一个qemu来模拟一个计算机系统、使用tun来模拟一个网卡。归根到底,这些虚拟的原因在于兼容,兼容就是后来的实现要以不修改已有实现为前提。就像intel的指令集和windows的API一样,这里的内容就只能 阅读全文
posted @ 2019-03-06 20:45 tsecer 阅读(721) 评论(0) 推荐(0)
摘要: 一、虚拟终端模拟的问题 前面曾经说过,所谓控制台是对tty设备的一种模拟。tty和主机之间就一根线,所有的交互都在这条串行线上一个bit一个bit的交互,可以看做是“竹筒倒豆子”--直来直去的模式。进一步说,主机不能(也没有义务)直接控制tty设备上的显示设备(比如显示设备对应的内存、显示控制寄存器 阅读全文
posted @ 2019-03-06 20:44 tsecer 阅读(600) 评论(0) 推荐(0)
摘要: 一、主题 当定位一个问题的时候,最为直观和简单的方法就是在代码的特定位置加上对我们感兴趣的特定数据的打印,这是不依赖其它外部工具(调试器类工具)最简单和直观的方法,这个方法在用户态和内核态调试中都是适用的,就连最经典的C语言程序也是一个printf(“Hello World\n”),可见这个prin 阅读全文
posted @ 2019-03-06 20:43 tsecer 阅读(431) 评论(0) 推荐(0)
摘要: 一、问题 在编译一些大的工程的可执行文件的时候,可以发现如果使用DEBUG版本,代码段加上和代码段放在一起的只读数据(字符串或者常量全局变量等)数量将会比较庞大,而在glibc的crti中会有一个对GLABAL_OFF_TABLE(GOT)表的重定向,这个重定向类型为为,从网络上可以看到这种错误类型 阅读全文
posted @ 2019-03-06 20:42 tsecer 阅读(1072) 评论(0) 推荐(0)
摘要: 一、问题引出 为了精确定位一个任务退出的时候是何种原因,例如是看门狗复位,或者是受到了某些人为主动复位(kill 指定任务,或者reboot导致的简介SIGTERM+SIGKILL组合),或者是某些第三方库中执行了exit导致了线程的退出等原因。这就需要内核进行介入,记录指定感兴趣任务(之后称为受控 阅读全文
posted @ 2019-03-06 20:41 tsecer 阅读(707) 评论(0) 推荐(0)
摘要: 一、问题 这个就是在一些使用了共享目标文件的可执行文件编译时环境和运行时环境不同(比方说,编译的时候在一个较高版本的环境中编译的,此时使用的C库版本较新,然后将生成的可执行文件放在一个较低版本的系统中运行,此时可能会提示符号版本错误,从而可执行文件加载失败)而导致的可执行文件夹加载失败,这种问题在网 阅读全文
posted @ 2019-03-06 20:41 tsecer 阅读(3798) 评论(0) 推荐(0)
摘要: 一、问题引出 对于主线程(也就是main函数对应的线程),它并不是通过pthread_create创建的线程,所以我们没有这个主线程对应的pthread_t结构,这个结构也就是pthread_create的第一个参数。这当然只是最为直观的一个结论,事实上系统不会这么羸弱,在main函数中通过pthr 阅读全文
posted @ 2019-03-06 20:40 tsecer 阅读(567) 评论(0) 推荐(0)
摘要: 一、引出 在Linux系统下,通过 dd + losetup + mkfs 创建一个根文件系统已经是创建一个Linux根文件系统的一个常规方法。由于这个是通过一个loop设备来创建的文件,所以这个loop文件是把一个文件看做是一个设备,这个还是一个相对比较高难度的一个适配,因为上层肯定是使用了块设备 阅读全文
posted @ 2019-03-06 20:38 tsecer 阅读(870) 评论(0) 推荐(0)
摘要: 一、问题的引出 在Linux系统中,当内核发生panic的时候,我们可能希望能够保留内核的现场,就像当用户态程序异常的时候内核对应用程序的“吐核”一样(注意,不是吐槽)。但是应用程序的吐核是由内核来完成的,那么内核自己真正的吐自己该如何完成呢? 二、实现方法 这个实现是和kdump结合来实现的,这个 阅读全文
posted @ 2019-03-06 20:37 tsecer 阅读(632) 评论(0) 推荐(0)
摘要: 一、引出 在在嵌入式操作系统中,很多线程都可以为实时任务,因为毕竟这些线程很少和人接触,而是面向任务的。所有就有一个抢占的时机问题。特别是2.6内核中引入了新的内核态抢占任务,所以就可以说一下这个内核态抢占的实现。 内核态抢占主要发生在两个时机,一个是主动的检测是否需要抢占,另一个就是在异常处理完之 阅读全文
posted @ 2019-03-06 20:36 tsecer 阅读(4611) 评论(0) 推荐(1)
摘要: 一、中断和异常 这两个概念虽然处理的方式大致相同,但是本质上是有很大差别的,而且在386下它们的处理和语义对系统中最为重要的内容的理解是很重要的。 首先一个最为重要的差别就是: 当中断发生的时候,处理器在执行了Cs IP EFLAGS(可能还由用户态的SS和ESP)这个一气呵成的寄存器保存之后,处理 阅读全文
posted @ 2019-03-06 20:35 tsecer 阅读(518) 评论(0) 推荐(0)
摘要: 一、问题 任务的基本状态就是可运行与不可运行,这是一个任务的基本状态,正是运行的任务完成了真正的内核功能,而非运行的任务实现了任务的同步。所以任务的运行与非运行的转换是内核调度的一个基本功能。 二、设置的时机和方式 1、任务的去活跃 从调度的代码中看,一个线程设置为活跃与不活跃的两个最基本的操作分别 阅读全文
posted @ 2019-03-06 20:34 tsecer 阅读(548) 评论(0) 推荐(0)
摘要: 一、问题的引出 在多线程用户态程序中,为了更加准确详细的从一个线程观察另一个线程的行为,可能有时候需要让目标线程暂时安静下来,从而便于观测和监控。关于这个行为,首先想到的当然就是向一个线程发送一个SIGSTOP信号(注意,不是向进程,就是通过内核的tkill系统调用,或者说pthread_kill) 阅读全文
posted @ 2019-03-06 20:33 tsecer 阅读(3598) 评论(0) 推荐(0)
摘要: 一、引出 大家都知道,信号是在进程返回用户态的时候触发执行的一种机制,但是对于内核线程来说,它们并不会返回用户态。这就好像《大话西游》里打劫脚底板的时候那位坐轿的官人没有脚底板一样尴尬。另一方面,通过sigprocmask是不能屏蔽掉SIGKILL和SIGSTOP两个信号的,所以如果我们通过kill 阅读全文
posted @ 2019-03-06 20:32 tsecer 阅读(1511) 评论(0) 推荐(2)
摘要: 一、问题的引出 对于很多的Linux下程序,我们有时候并不像详细的知道它执行的每一条指令或者,或者我们不想(或者不能)进行源代码级的调试,而只实现想大致看一下某个程序它执行了哪些核心的API调用,从而判断出程序执行的关键路径。此时使用strace是一个不错的选择,它可以不间断的执行完一个子程序,从而 阅读全文
posted @ 2019-03-06 20:31 tsecer 阅读(566) 评论(0) 推荐(0)
摘要: 一、pthread结构中获取tid 这个问题是由于很多时候我们都是通过gettid来获得一个线程的tid,其实这个是一个非常简单的系统调用,但是即使它非常简单,我们还是要执行进行系统调用而引入的寄存器保存/恢复等操作。但是,在C库的pthread库的实现过程中,我们可以看到,用户态是肯定保存了一个线 阅读全文
posted @ 2019-03-06 20:30 tsecer 阅读(969) 评论(0) 推荐(0)
摘要: 一、问题的引出 在执行modprobe 的时候,发现oprofile这个动态模块可以在加载时指定参数,强制使用timer=1来让内核使用定时器方式来进行系统的监控。从常识上来说,这个timer参数肯定不是在用户态解析出来的,因为模块加载毕竟是一个模块特有的框架性东西,不可能在用户态做专门出来,所以就 阅读全文
posted @ 2019-03-06 20:29 tsecer 阅读(731) 评论(0) 推荐(0)
摘要: 一、引入 OProfile是Linux下性能检测的重要工具,对于系统的优化和评估有意义。例如我们的某一个单板发现CPU利用率很低,也就是真正的工作任务执行的时间不长,所以我们要分析一下系统中是哪些任务占用了大量的CPU时间,此时就需要使用OProfile工具了。 二、原理 现在大部分的CPU都在硬件 阅读全文
posted @ 2019-03-06 20:27 tsecer 阅读(199) 评论(0) 推荐(0)
摘要: 一、起因 使用busybox制作了一个cpio.gz的文件系统,然后使用这个文件系统作为qemu的启动盘进行启动,最后发现可以识别出是一个cpio文件系统,但是到最后还是出现了panic,说是找不到文件系统。大致的错误类型为"VFS: Cannot open root device \" …… pa 阅读全文
posted @ 2019-03-06 20:26 tsecer 阅读(704) 评论(0) 推荐(0)
摘要: 一、0号和1号进程 通俗的讲,0号进程就是以start_kernel为入口的一个任务,也就是内核本身,这个任务的task_struct结构就是我们在编译的时候静态初始化的init_task结构,这个结构的位置和地址在可执行文件生成的时候就已经确定,其中的大部分成员都按照所需进行了初始化。 1号任务就 阅读全文
posted @ 2019-03-06 20:25 tsecer 阅读(5648) 评论(0) 推荐(1)
摘要: 一、解决问题和适用范围 主要是用来等待一个条件,这个条件可能需要另一个线程来满足这个条件。这个和我们平常适用的pthread_mutex_lock的最大不同在于后者保护的一般是一个代码段(也就是关键区),或者一个变量,但是由于一般来说这个变量的访问是在一个关键区中,所以可以认为是一个关键区。 但是对 阅读全文
posted @ 2019-03-06 20:23 tsecer 阅读(548) 评论(0) 推荐(0)
摘要: 一、问题 在看nanosleep的时候,看到这个函数返回的错误码是-ERESTART_RESTARTBLOCK,所以就比较好奇的看了这个地方的代码,然后看到是在do_signal和handle_signal函数中判断了这些错误码的意义。然后就看一下它们具体的意义。 二、信号的发送 sys_kill( 阅读全文
posted @ 2019-03-06 20:22 tsecer 阅读(1356) 评论(0) 推荐(0)
摘要: 一、目的和背景 这种实现的方法,就是在一个理想的时间段内,所有的进程都应该获得一次调度的执行机会(但是执行的时间可能要根据优先级不同,由于非实时任务的优先级static_priority只能通过nice修改,所以nice是修改非实时任务优先级的一个基本方法)。这样的好处是“不患寡而患不均”,即使CP 阅读全文
posted @ 2019-03-06 20:20 tsecer 阅读(225) 评论(0) 推荐(0)
摘要: 一、分层 分层就是一个层尽量的承担比较小的功能,一个层只完成自己的功能,这样的通用性会比较好。当然,如果只是完成一个功能,那么可以同时把所有的功能都在一层实现,这样对某个功能或者协议来说是比较方便的,但是从维护和使用起来就比较混乱。 TCP提供的机制包括 可靠传输 和 流量控制。这两个功能是TCP的 阅读全文
posted @ 2019-03-06 20:20 tsecer 阅读(1390) 评论(0) 推荐(0)
摘要: 一、内核中路由表 在ip_rt_init函数中,初始化了一个缓冲结构: if (!rt_hash_table) panic("Failed to allocate IP route cache hash table\n"); 注意:这个并不是内核中我们创建的静态路由表,这个静态路由表是我们通过 ip 阅读全文
posted @ 2019-03-06 20:18 tsecer 阅读(622) 评论(0) 推荐(0)
摘要: 一、问题 当我们希望一个套接口能够接收到一个主机上所有网卡上收到的某个端口的数据的报文的时候,我们一般给bind传递的地址是 /* Address to accept any incoming messages. */#define INADDR_ANY ((unsigned long int) 0 阅读全文
posted @ 2019-03-06 20:16 tsecer 阅读(310) 评论(0) 推荐(0)
摘要: 一、函数的引出 首先是这个函数在笔试的时候经常会被问到,另一个就是C库实现的一些技巧以及这个函数本身的一些保证。 二、说明 memmove的说明:将src拷贝到dst,其语义等价于首先将源拷贝到一个和目的、源都不搭的空间中,然后将这个中间空间的内存拷贝到目的空间。 这里最重要的就是当源和目的之间有重 阅读全文
posted @ 2019-03-06 20:15 tsecer 阅读(5291) 评论(0) 推荐(0)
摘要: 一、问题的引入 在使用IPV6转化的过程中,为了兼容IPV4和V6版本,一个兼容的方法就是使用这个getaddrinfo函数,这个函数在windows下同样存在,应该是一个跨平台的接口。 这个接口的一个特殊之处就是这个接口可以传入hostname和servername,这两个变量都是可以为一个字符串 阅读全文
posted @ 2019-03-06 20:14 tsecer 阅读(890) 评论(0) 推荐(0)
摘要: 一、报文的分层转发 当我们上层通过write来发送消息的时候,会走到socket文件系统的发送接口。 首先,socket是整个系统中所有网络设备在用户态的一个抽象,也就是一个socket可以为appletalk,bluetooth一样,代表不同的协议类型。所以此时首先经过一次协议类型的转发,整个最为 阅读全文
posted @ 2019-03-06 20:13 tsecer 阅读(141) 评论(0) 推荐(0)
摘要: 一、查看方法。 通过gcc -S -g 生成的汇编代码中包含了一些使用树脂表示的调试信息,但是这些信息本身如果我们一个一个看文档的话还是比较麻烦的,所以我们只有通过其它的方法来实现。还要readelf提供了-w功能来显示整个结构中调试信息的格式。我们就可以结合生成的汇编文件和对应的readelf的输 阅读全文
posted @ 2019-03-06 20:12 tsecer 阅读(814) 评论(0) 推荐(0)

导航