linux任务响应模型&linux实时化&RTAI 3.2分析&Adeos分析(7)
- UID
- 1029342
- 性别
- 男
|
linux任务响应模型&linux实时化&RTAI 3.2分析&Adeos分析(7)
int __adeos_event_monitors[ADEOS_NR_EVENTS] = { [ 0 ... ADEOS_NR_EVENTS - 1] = 0 };
在文件kernel/adeos.c中定义;此数组中的每个元素对应着Linux中的一个系统事件(例如,进入系统调用事件、退出系统调用事件等),当某个域想要跟踪某个系统事件是,它就调用adeos_catch_event,告诉Adeos它想要跟踪这个系统事件,并将事件的处理函数传递给Adeos。Adeos根据事件的类型将__adeos_event_monitors数组中的某个元素的值加一或减一(当事件处理函数为空时减一,否则加一)。当某个系统事件发生时,Adeos根据事件类型,检查__adeos_event_monitors数组中的相应元素的值是否大于零,如果大于零,则说明某个域想跟踪这个系统事件,那么就将这个事件传递给中断管道处理,处理过程中会调用域的事件处理程序。
static struct irqdesc __adeos_std_irq_desc[NR_IRQS];
在文件adeos/armv.c中定义的,它的赋值是在__adeos_enable_pipeline中进行的,代码段如下:
for (irq = 0; irq < NR_IRQS; irq++)
__adeos_std_irq_desc[irq] = irq_desc[irq];
其中的数组irq_desc[]是标准Linux中用来保存中断描述符的;所以,从这里就可以看出,__adeos_std_irq_desc[]数组保存的是标准的Linux中断描述符;由于Adeos需要接管Linux的中断管理,就要修改irq_desc[]数组的内容,因此,就将修改前的标准的Linux中断描述符保存起来。一方面,在卸载Adeos模块的时候可以恢复(在函数__adeos_disable_pipeline中调用),另一方面,在Adeos的代码中还需要调用标准描述符中的代码(例如,在__adeos_override_irq_mask中)。
unsigned long __adeos_virtual_irq_map = 0;
在文件kernel/adeos.c中定义的;变量__adeos_virtual_irq_map记录着虚拟中断的分配情况,在32位处理器上,共有32个虚拟中断,从0到31;当某一位为1时,表示虚拟中断已经被分配了,为0时,则没有分配;Adeos用虚拟中断来提供域之间的通信,当某个域需要执行另一个域的某些操作时,可以触发一个虚拟中断,当这个虚拟中断沿着中断管道传播时,接收这个虚拟中断的域就会执行相应的操作,这在处理上和硬件中断类似,只不过这个中断是由域触发的而已。
int adp_pipelined = 0;
在文件arch/arm/kernel/adeos.c中定义的;表示Adeos是否已经接管根域的中断管理,也就是说,表示中断管道当前是否有效。很多代码都要通过判断这个标志量来确定应该执行的操作。
----------------------------
3.2.2 域(Domain)相关实体
Adeos中的每个域都由一个域结构变量表示,这个结构变量保存着域的属性和和状态;域结构adomain_t的定义如下:
typedef struct adomain {
/* -- Section: offset-based references are made on these fields
from inline assembly code. Please don't move or reorder. */
void (*dswitch)(void); /* Domain switch hook */
int *esp[ADEOS_NR_CPUS]; /* Domain stack pointers */
/* -- End of section. */
int *estackbase[ADEOS_NR_CPUS];
unsigned domid;
const char *name;
int priority;
struct adcpudata {
unsigned long status;
unsigned long irq_pending_hi;
unsigned long irq_pending_lo[IPIPE_IRQ_IWORDS];
unsigned irq_hits[IPIPE_NR_IRQS];
adevinfo_t event_info;
} cpudata[ADEOS_NR_CPUS];
struct {
int (*acknowledge)(unsigned irq);
void (*handler)(unsigned irq);
unsigned long control;
} irqs[IPIPE_NR_IRQS];
struct {
void (*handler)(adevinfo_t *evinfo);
} events[ADEOS_NR_EVENTS];
int ptd_keymax;
int ptd_keycount;
unsigned long ptd_keymap;
void (*ptd_setfun)(int, void *);
void *(*ptd_getfun)(int);
struct adomain *m_link; /* Link in mutex sleep queue */
struct list_head p_link; /* Link in pipeline */
} adomain_t; |
|
|
|
|
|