上下文及内核同步
1:上下文:context 处于某种状态下所使用的资源集合。比如说进程又可以称为进程上下文,中断处理称为中断上下文,中断处理可以分为两个部分,又可以认为是两个不同的上下文。
在不同的上下文中,可能处理相同的数据。能够被不同上下文访问的数据称为临界资源。
现在内核中的ip转发是在软中断中进行的。
ip转发需要查找Fib表项;而Fib表项的添加删除、维护是在进程上下文进行,所以fib可以称为临界资源。
因为linux内核支持可抢占,且能够支持多核系统。就是说会出现多个上下文中“同时”访问临界资源的情况。而且访问涉及读操作和写操作。所以访问临界资源的时候需要保护,也就是内核同步。还以Fib为例,cpu0上在进行ip转发处理,在软中断上下文对Fib表项进行遍历访问,同时cpu1上Fib维护进程将节点删除,cpu0上的ip转发继续处理是,则可能出现访问已释放内存的问题。
2:如何保护临界资源
要保护临界资源,首先需要考虑临界资源有可能会在那几个上下文中被访问,这是模块设计首先要考虑的问题。
只有明确了临界资源可能所处的上下文,才能进行针对性的保护。linux内核主要涉及下面几种上下文:
1:进程上下文
2:中断上下文
3:中断下半部分
对于多核SMP来说,又涉及到不同核之间的临界资源的保护。A和B进程分别在CPU0和CPU1上运行,同时访问同一个数据,也需要进行
同步保护。
常见的同步方法:
1:关闭内核抢占。
单核系统如何保护不同进程上下文可以访问的临界资源。
1:限制内核抢占。
在线程描述符thread_info结构中,有一个标识是否可以被抢占的标志位:preempt_count 如果此标志位为0,则表示是可以抢占的,如果大于0,则表示不能被抢占。