热门关键字:  ubuntu  分区  Fedora  linux系统进程  函数

当前位置 :| 主页>Linux教程>内核研究>

Linux操作系统的内核重入的分析

来源: 作者: 时间:2007-04-01 Tag: 点击:

对于Linux内核重入我做了一下一些分析。

首先要界定一个范围(代码段,函数)然后才可以讨论重入。

比如以函数A,B分别为一个范围。在运行A的时候发生中断,调用B,B运行完了又返回A,这个时候称B进入A。

如果A=B,那么称A重入A,或者可以说有两个A的实例在运行。

重入导致的问题主要就是由于这两个A可以会几乎同时访问一些堆中的变量而出现不一致。解决这个问题的办法有几个:

干脆不允许某个函数(某段代码)重入,也就是如果A运行,当发生中断的时候,调用A,发现已经有A运行了,则返回,不再运行这个新的A.bottom half采用这个办法。

或者对一些临界区上锁。

或者干脆关中断。

内核的重入,首先界定的范围就是整个处于内核级的代码段。

因此,内核的重入可以说是经常发生的,比如中断发生时。

内核的重入有两种情况:

1与进程无关的中断发生时,CPU已经在内核中运行,也就是中断嵌套。一般内核会做一定的保护,比如关中断,锁临界区等。但是这种中断有一个特点,就是先进后出的栈的模式,因此,用一个栈足矣。

2与进程相关的切换。如果总是在内核返回到用户级代码段时才切换,那么这个意义上的重入就不存在,用一个内核栈就可以了。还有一种可能是在内核中就切换,由于进程执行并不是按照先进先出的模式,因此,每个进程都有一个内核栈。

还有一个问题,上面与进程无关的中断一般访问与进程无关的数据,所以需要保护的数据比较少。在这种重入中,几个进程的内核实例会访问与进程相关的共有数据,会导致不一致,而这种临界区会比较多,所以上锁可能会比较麻烦,Linux采用的是一种非透明的切换,即当前进程的内核部分必须主动放弃CPU,才可能切换。这样使内核同步比较简单。所以Linux内核的重入是一定条件下的重入,非抢占式的重入。




相关文章:
精通initramfs构建step by step
Linux利用kexec迅速切换内核
进程上下文VS中断上下文
内核通知链 学习笔记
linux spi子系统驱动分析
menuconfig 配置选项
《Linux操作系统内核实习》之练习一
udev详解
什么叫微内核,宏内核?
Linux 信号signal处理机制
开发简单的 Linux2.6 内核模块
删除内核的perl脚本
Linux2.6内核usb gadget驱动移植
GCC hacks in the Linux kernel
iomem
kernel学习的想法
让自己的驱动支持udev
linux内核编译步骤
内核的等待队列
Linux内核wait_queue深入分析
升级和删除内核
SD卡驱动分析2
Linux Kernel VDSO本地权限提升漏洞
内核中的TCP的追踪分析-15-TCP(IPV4)的客户端与
linux 2.6内核可加载模块的编译
内核模块HelloWorld
在环回接口上发送一个数据报
ARP初始化
1分钟编译FreeBSD内核
linux设备模型之uart驱动架构分析