随笔分类 -  163博客部分迁移

上一页 1 2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

posted @ 2019-03-06 20:20 tsecer 阅读(1357) 评论(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 阅读(571) 评论(0) 推荐(0) 编辑

inet中bindany socket的接受
摘要:一、问题 当我们希望一个套接口能够接收到一个主机上所有网卡上收到的某个端口的数据的报文的时候,我们一般给bind传递的地址是 /* Address to accept any incoming messages. */#define INADDR_ANY ((unsigned long int) 0 阅读全文

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

memmove
摘要:一、函数的引出 首先是这个函数在笔试的时候经常会被问到,另一个就是C库实现的一些技巧以及这个函数本身的一些保证。 二、说明 memmove的说明:将src拷贝到dst,其语义等价于首先将源拷贝到一个和目的、源都不搭的空间中,然后将这个中间空间的内存拷贝到目的空间。 这里最重要的就是当源和目的之间有重 阅读全文

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

从getaddrinfo看Glibc的nss
摘要:一、问题的引入 在使用IPV6转化的过程中,为了兼容IPV4和V6版本,一个兼容的方法就是使用这个getaddrinfo函数,这个函数在windows下同样存在,应该是一个跨平台的接口。 这个接口的一个特殊之处就是这个接口可以传入hostname和servername,这两个变量都是可以为一个字符串 阅读全文

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

跟踪一次网络发送
摘要:一、报文的分层转发 当我们上层通过write来发送消息的时候,会走到socket文件系统的发送接口。 首先,socket是整个系统中所有网络设备在用户态的一个抽象,也就是一个socket可以为appletalk,bluetooth一样,代表不同的协议类型。所以此时首先经过一次协议类型的转发,整个最为 阅读全文

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

Dwarf2结构在gcc中的应用及调试器实现分析
摘要:一、查看方法。 通过gcc -S -g 生成的汇编代码中包含了一些使用树脂表示的调试信息,但是这些信息本身如果我们一个一个看文档的话还是比较麻烦的,所以我们只有通过其它的方法来实现。还要readelf提供了-w功能来显示整个结构中调试信息的格式。我们就可以结合生成的汇编文件和对应的readelf的输 阅读全文

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

sigaltstack函数对线程连续信号堆栈处理
摘要:一、问题 对于多线程的时候,为了避免堆栈被破坏之后堆栈已经不再有效,从而发生二次内存访问违例异常。有些任务会在自己的系统启动的时候注册一个信号专门使用的异常信号,但是对于多线程的时候,理论上就可以应该为每个线程都分配一个私有的信号堆栈。但是这样对于系统内存消耗会特别多,可能系统根本负担不起。有些系统 阅读全文

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

上一页 1 2

导航

< 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

统计

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