搞好姓氏源流网站建设,wordpress主题 seo,国家先进制造业集群,苏州哪里做网站1.spinlock原理
为了解决这个spinlock的不公平问题#xff0c;linux 2.6.25内核以后#xff0c;spinlock采用了一种FIFO ticket-based算法的spinlock机制#xff0c;可以很好的实现先来先抢占的思想。具体的做法如下#xff1a;
(1)、spinlock的核心字段有ow…1.spinlock原理
为了解决这个spinlock的不公平问题linux 2.6.25内核以后spinlock采用了一种FIFO ticket-based算法的spinlock机制可以很好的实现先来先抢占的思想。具体的做法如下
(1)、spinlock的核心字段有owner和next在初始时ownernext0 (2)、当第一个进程抢占spinlock时会在进程函数本地保存下next的值也就是next0并将spinlock的next字段加1 (3)、当获取spinlock的进程的本地next和spinlock的owner相等时该进程就获取到spinlock; (4)、由于第一个进程本地的next0并且spinlock的owner为0所以第一个CPU获取到spinlock (5)、接着当第二个进程抢占spinlock此时spinlock的next值为1保存到本地然后将spinlock的next字段加1。而spinlock的owner字段依然为0第二个进程的本地next 不等于spinlock的owner所以一直自旋等待spinlock (6)、第三个进程抢占spinlock得到本地next值为2然后将spinlock的next字段加1。此时spinlock的owner字段还是为0所以第三个进程自旋等待。 (7)、当第一个进程处理完临界区以后就释放spinlock执行的操作是将spinlock的owner字段加1 (8)、由于第二个进程和第三个进程都还在等待spinlock他们会不停第获取spinlock的owner字段并和自己本地的next值进行比较。当第二个进程发现自己的next值和spinlock的owner字段相等时此时next owner 2第二个进程就获取到spinlock。第三个进程的本地next值是3和spinlock的owner字段不相等所以继续等待 (9)、只有在第二个进程释放了spinlock就会将spinlock的owner字段加1第三个进程才有机会获取spinlock。 crashwhatis因为mm_struct的mmap_sem成员的offset就是1040x68 用whatis命令可以查看结构体的声明如 whatis -o mm_structmachcrash mach | grep SIZE MEMORY SIZE: 1 GB PAGE SIZE: 4096 KERNEL STACK SIZE: 16384 IRQ STACK SIZE: 16384 OVERFLOW STACK SIZE: 4096task -R stackPID: 128 TASK: ffff0000034f9b80 CPU: 1 COMMAND: insmod stack 0xffff800012b20000,setset 128 进程128 上下文bt -sS 0x11给一个错误地址,会打印出进程128的实际栈地址bt -T将内核栈的内容都打印出来bt -f/-p(-p) 只打印panic的内核栈,-f 列出堆栈中的所有数据bt -lf(-l)显示每层栈的源码和所在的行数rd打印指针范围的栈内容 rd ffffff8990 -e fffff9ffff mm.txttask pid打印进程的task_struct 内容dis sym|addr参数可以使地址、符号函数名、变量名对其反汇编得到该地址 对应的汇编源码mod -s module加载指定安装模块的符号调试信息mod -d xxxmodule删除指定模块的符号表和调试信息例如 insmod modules_list.ko后,dis 模块中的函数,发现没有反汇编 出源码 要先加载符号表 mod -s module_list.ko,后 dis functionvm [pid] 进程虚拟地址空间help -m查看每个cpu的中断栈irq_stack_size: 16384 irq_stacks[0]: ffff800010000000 irq_stacks[1]: ffff800010008000 irq_stacks[2]: ffff800012688000 irq_stacks[3]: ffff800012690000普通的全局变量普通的全局变量的值很好查看直接p后面接函数名即可 p jiffies_64percup全局变量struct rq.clock,nr_running,cfs.h_nr_running runqueues:0,2,6 冒号后指定 CPU局部变量ATPCS规则可知函数调用时传递的参数当参数数量小于等于8个时 使用x0~x7传递大于8个时多余的参数使用栈传递 函数返回时返回值保存在x0中下面命令对父函数cpu_stopper_thread函数进行反汇编 其中/s参数表示显示汇编在C文件中的行数 disassemble /s cpu_stopper_thread哪些线程正在访问/访问过 指定的变量/内存/锁哪些线程正在访问/访问过指定的变量 再介绍最后一个实用技巧有时候我们在分析dump的时候经常会有这样的需求 已经知道某一把锁在内存中的地址我们想知道有哪些线程在等这把锁 已经知道某个全局变量的地址或名称我们想知道有哪些任务正在访问这个全局变量 已经知道某个函数名称我们想知道有哪些任务的调用栈中会调用到这个函数 这时候我们就可以使用下面命令格式来对系统中所有的任务的调用栈进行搜索了其中-t是对所有的任务进行搜索不区分任务的状态。而-T则表示只对系统中正在running的任务的调用栈进行搜索 search -t/T 变量名|变量地址|函数名|函数地址|内存地址