Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1242216
  • 博文数量: 122
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4004
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-20 08:27
文章分类
文章存档

2016年(1)

2015年(21)

2014年(100)

发布时间:2015-01-05 16:50:08

进程调度时,当被选中的next进程不是current进程时,需要进行上下文切换。
进行上下文切换时,有一些问题不太容易理解,比如:
1、进程上下文切换必然发生在内核态吗?
2、上下文切换后原来的进程(prev)如果恢复执行,从什么地方开始执行?
3、上下文切换后,如何切换到新进程执行?新进程从什么地方开始执行?
5、上下文切换时,堆栈如何切换,如果保证不混乱?
6、A进程执行时被打断调度B进程运行,B进程正常执行过程中被打断调度C进程运行,C运行被打断中调度D运行,以此类推,看似一个无限嵌套,如何恢复到A进程运行,不会一层层返回吧?会不会有问题?
7、上下文切换后,如何恢复到新进程的用户态程序继续执行?
上述问题(可能还有其它疑问~)在理解了进程上下文切换的细节后,就都能回答了。......【阅读全文】

阅读(6402) | 评论(0) | 转发(2)

发布时间:2015-01-05 13:57:45

Linux中有3种栈:
1)用户栈。当进程处于用户态时使用,位于进程地址空间(用户态部分(如:0-0xc0000000))底部,用户态分配局部变量和函数调用时时,使用该栈,跟平时我们见到和理解的一样,就是虚拟地址空间中的一段。
2)内核栈。跟用户栈独立,属于进程,即每个进程都有自己的内核栈,单独分配,大小为8k,跟thread_info结构放在一起,在用户态和内核态切换时,需要进行切换。
3)中断栈。老版本内核中默认认跟内核栈共享,新版本内核中与内核栈独立,且软中断和硬中断单独使用自己的中断栈。中断、异常、软中断使用此栈。
本文主要讲解内核栈、用户栈和内核栈切换的相关实现。......【阅读全文】

阅读(7667) | 评论(0) | 转发(7)

发布时间:2014-12-30 16:51:55

kernel 3.10内核源码分析--进程退出exit_code
进程退出时,有相应的exit_code,可用于判断进程退出的原因。......【阅读全文】

阅读(4270) | 评论(0) | 转发(2)

发布时间:2014-12-30 16:10:44

如何在内核代码中查找系统调用的定义......【阅读全文】

阅读(4281) | 评论(0) | 转发(1)

发布时间:2014-12-30 10:58:15

字符串常量位于进程地址空间的哪个位置?之前没有关注过。。
答案:在代码段。......【阅读全文】

阅读(3200) | 评论(1) | 转发(0)

发布时间:2014-12-29 10:35:57

使用SystemTap调试新增内核模块

关键点:
1)使用SystemTap调试内核模块,探测点的编写格式示例为:
module("ext3").function("ext3_*")
2)需要将新增的helloworld模块cp到/lib/modules/`uname -r`/extra目录中,否则找不到符号。......【阅读全文】

阅读(8127) | 评论(0) | 转发(3)

发布时间:2014-11-21 15:55:48

时钟中断、高精度时钟和nohz相关流程......【阅读全文】

阅读(3791) | 评论(0) | 转发(0)

发布时间:2014-11-19 16:06:19

kernel 3.10内核源码分析--slab原理及相关代码
1、基本原理
我们知道,Linux保护模式下,采用分页机制,内核中物理内存使用buddy system(伙伴系统)进行管理,管理的内存单元大小为一页,也就是说使用buddy system分配内存最少需要分配一页大小。那如果需要分配小于一页的内存该怎么办呢?
另一方面,内核中经常需要大量的数据结构(比如struct task_strcut),这些数据结构的频繁分配和释放对性能影响较大。
Slab正是用于解决上述的两个问题, Slab 分配器源于 Solaris 2.4 的分配算法,工作于buddy system之上,用于管理特定大小对象的缓存,提高小块内存或特定对象内存分配效率。
Slab的两个用途如前面所述:1、缓存和管理内核中经常使用的数据结构对象,内核中使用slab提供的专用的接口,可以实现数据结构对象的快速分配,大大减少相关开销,提升效率。2、缓存和管理小块内存,也称通用缓存,用于kmalloc的底层实现和支撑。......【阅读全文】

阅读(7204) | 评论(3) | 转发(8)

发布时间:2014-10-24 09:59:56

Linux 2.6 中的页面回收与反向映射 ......【阅读全文】

阅读(2898) | 评论(0) | 转发(2)

发布时间:2014-10-23 09:38:50

Linux x86_64 的TLB管理 ......【阅读全文】

阅读(3248) | 评论(0) | 转发(1)

发布时间:2014-10-22 09:47:30

ftrace、kpatch、systemtap的基本原理、联系和区别......【阅读全文】

阅读(4726) | 评论(0) | 转发(2)

发布时间:2014-10-21 15:03:55

MWAIT和HLT的差别......【阅读全文】

阅读(6433) | 评论(0) | 转发(0)

发布时间:2014-09-17 18:29:20

一次用户态进程死循环案例的分析
1、问题现象
业务进程(用户态多线程程序)挂死,操作系统反应迟钝,系统日志没有任何异常。从进程的内核态堆栈看,看似所有线程都卡在了内核态的如下堆栈流程中:
[root@vmc116 ~]# cat /proc/27007/task/11825/stack
[] retint_careful+0x14/0x32
......【阅读全文】

阅读(4671) | 评论(0) | 转发(3)

发布时间:2014-09-12 17:02:34

kernel 3.10内核源码分析--udp_sendmsg()--UDP发包流程
udp_sendmsg()主要流程如下:
1)前期处理。包括,对数据长度合法性判断、pending数据的判断、目的地址的处理和获取、控制信息的处理、组播处理、connected信息处理、MSG_CONFIRM标志的处理等。
2)调用ip_append_data()接口将其添加到传输控制块(sock)的发送队列中(利用发送队列中的现有skb,或者新创建skb,详细原理和流程请参见ip_append_data()接口的分析)。
3)判断是否有cork标记(MSG_MORE),如果没有,则说明需要立即发送,则调用udp_push_pending_frames()接口发送报文,实际是将包提交至IP层;如果设置了cork,则说明需要阻塞等待直到数据达到MTU大小,则完成本次的udp_sendmsg()处理。......【阅读全文】

阅读(16312) | 评论(0) | 转发(2)

发布时间:2014-09-09 19:53:39

kernel 3.10内核源码分析--ip_append_data--IP层提供的UDP和RAW socket的发包接口
基本原理
UDP发包流程中,当没有cork的情况下,会走过udp_sendmsg到达ip_append_data,该接口是IP层提供的UDP和RAW Socket的发包接口,同时,TCP中用于发送ACK和RST报文的接口ip_send_reply最终也会调用此接口
该接口的主要作用是:将数据拷贝到适合的skb(利用发送队列中现有的或新创建)中,可能有两种情况:
1)放入skb的线性区(skb->data)中;
2)或者放入skb_shared_info的分片(frag)中
另外,还需要考虑MTU对skb数据进行分割,为IP层的分片做准备。......【阅读全文】

阅读(4937) | 评论(0) | 转发(1)

发布时间:2014-09-05 15:00:23

kernel 3.10内核源码分析--Sysrq处理流程、键盘驱动、input子系统相关
1、基本介绍
Sysrq魔术键提供了大量的实用功能,可用户快速获取系统运行状态信息,尤其是在系统出现异常时,收集有用信息,对于疑难问题的分析有极大的帮助。
典型应用场景如:
1)系统进入了挂死状态(如调度出现异常、或系统负荷过重),但仍能响应中断,此时可以通过Sysrq魔术键(c)手工触发panic,结合kdump,就能收集到vmcore信息,用于问题的后续分析定位,非常有用。
2)当系统中某进程出现挂死(可能是D状态,或是死锁),此时需要确认该进程具体挂在什么地方,可以使用Sysrq魔术键(t)打印出系统中所有进程的堆栈信息。
3)当系统出现反应迟钝、交互困难时,难以通过shell或终端交互获取到有用信息,此时可以使用Sysrq魔术键(m,p)打印出系统中内存使用的详细信息和CPU运行上下文信息等。......【阅读全文】

阅读(8176) | 评论(2) | 转发(1)

发布时间:2014-08-29 11:21:00

X86架构中,HLT指令用于使CPU进入HALT状态,在Linux的进程调度模块中,当某CPU较长时间处于idle状态时,可能会执行HLT命令使其进入HALT状态,目的显而易见,是为了节能。CPU的HALT状态,在APCI规范中,对应于CPU的C1状态,属于CPU睡眠状态中的最低级别,即最浅的睡眠。......【阅读全文】

阅读(25092) | 评论(0) | 转发(0)

发布时间:2014-08-22 00:33:44

Crash工具用于解析kdump抓取的vmcore信息,如之前分析,vmcore实际为系统运行当时的内存镜像,其中包括了所有的内存中可以看到的信息,通过Crash工具可以解析vmcore中的详细数据,本文主要以sk_buff数据结构为例简单说明Crash中间中对结构体的解析。
?
?1、基本用法
?Crash中使用struct命令解析结构体,具体用法为:
?[struct] ......【阅读全文】

阅读(9482) | 评论(0) | 转发(1)

发布时间:2014-08-13 18:58:47

kernel 3.10代码分析--KVM相关--KVM_SET_USER_MEMORY_REGION流程
1、基本原理
如之前分析,kvm虚拟机实际运行于qemu-kvm的进程上下文中,因此,需要建立虚拟机的物理内存空间(GPA)与qemu-kvm进程的虚拟地址空间(HVA)的映射关系。
虚拟机的物理地址空间实际也是不连续的,分成不同的内存区域(slot),因为物理地址空间中通常还包括BIOS、MMIO、显存、ISA保留等部分。
qemu-kvm通过ioctl vm指令KVM_SET_USER_MEMORY_REGION来为虚拟机设置内存。主要建立guest物理地址空间中的内存区域与qemu-kvm虚拟地址空间中的内存区域的映射,从而建立其从GVA到HVA的对应关系,该对应关系主要通过kvm_mem_slot结构体保存,所以实质为设置kvm_mem_slot结构体。......【阅读全文】

阅读(7135) | 评论(0) | 转发(2)

发布时间:2014-08-12 19:44:18

kernel 3.10代码分析--KVM相关--虚拟机创建
1、基本原理
如之前分析,kvm虚拟机通过对/dev/kvm字符设备的ioctl的System指令KVM_CREATE_VM进行创建,本文简单解释及分析在3.10版本内核代码中的相关流程,用户态qemu-kvm部分暂不包括。......【阅读全文】

阅读(6865) | 评论(0) | 转发(5)
给主人留下些什么吧!~~

啦哆A梦2014-02-21 11:08

回复  |  举报
留言热议
请登录后留言。

登录 注册