文档库 最新最全的文档下载
当前位置:文档库 › 高通操作系统内核代码分析

高通操作系统内核代码分析

高通操作系统内核代码分析
高通操作系统内核代码分析

REX

操作系统分析

System Group Fu Han gyu 数字签名人 Fu Hangyu DN :cn=Fu Hangyu ,c=CN-中国原因:我是该文档的作者日期:2010.08.2811:54:22 +08'00'

1.数据定义与宏定义(Defines&Macros) (5)

1.1.数据结构 (5)

1.1.1.TCB(任务控制块) (5)

1.1.2. 定时器(timer)数据结构 (7)

1.1.3. 临界区(Critical Section)数据结构 (7)

1.1.4.上下文帧的结构 (7)

1.2. 几个全局变量 (8)

1.2.1.rex_curr_task (8)

1.2.2.rex_best_task (8)

1.2.3.rex_task_list (8)

1.2.4.rex_num_tasks (8)

1.2.5.rex_kernel_tcb (8)

1.2.6.rex_sched_allow (8)

1.2.7.rex_nest_depth (9)

1.2.8.rex_timer_list (9)

1.2.9.rex_null_timer (9)

1.2.10.rex_irq_vector & rex_fiq_vector (9)

1.3.MACROS(几个宏定义) (9)

1.3.1.REX_VERSION_NUMBER (9)

1.3.2.任务链表操作宏 (9)

1.3.3.REX_TASK_RUNNABLE(tcb) (10)

1.3.4.看门狗操作宏 (10)

2.任务(TASK) (10)

2.1. 创建任务 (11)

2.1.1.rex_def_task_internal() (11)

2.2.任务的通用引导函数 (14)

2.2.1.rex_task_preamble() (14)

2.3.任务挂起和继续 (15)

2.3.1.rex_suspend_task() (15)

2.3.2.rex_resume_task() (15)

2.4.删除任务 (16)

2.4.1.rex_remove_task() (16)

2.4.2.rex_kill_task_ext() (16)

2.5.Others (19)

2.5.1.rex_self() (19)

2.5.2.rex_get_pri() (19)

2.5.3.rex_set_pri() (19)

2.5.4.rex_task_pri() (19)

3.调度(Schedule) (21)

3.1.调度代码 (21)

3.1.1.rex_sched() (21)

3.2.设定rex_best_task (23)

3.3.任务调度加锁/解锁 (24)

3.3.1.rex_task_lock() (24)

3.3.2.rex_task_free() (25)

3.3.3.rex_tasks_are_locked() (25)

4.中断(Interrupts) (25)

4.1.设置中断向量 (26)

4.1.1.rex_set_interrupt_vector () (26)

4.2.PIC Trampoline Service(可编程控制弹簧中断服务) (26)

4.2.1.tramp_init() (26)

4.2.2.tramp_set_isr() (27)

4.2.3.tramp_isr() (29)

4.3.IRQ_handler (33)

5.信号量(Signals)和定时器(Timers) (37)

5.1.信号量 (37)

5.1.1.rex_wait() (38)

5.1.2.rex_set_sigs() (39)

5.1.3.rex_get_sigs() (39)

5.1.4.rex_clr_sigs() (40)

5.2.定时器 (40)

5.2.1.rex_init_timer_list() (41)

5.2.2.rex_insert_timer() (41)

5.2.3.rex_def_timer() (42)

5.2.4.rex_set_timer() (43)

5.2.5.rex_timed_wait() (44)

5.2.6.rex_clr_timer() (44)

5.2.7.rex_get_timer() (45)

5.2.8.rex_pause_timer() (46)

5.2.9.rex_resume_timer() (46)

5.2.10.rex_delete_task_timers() (47)

5.2.11.rex_decrement_timers() (47)

5.2.12.rex_tick() (49)

5.3.Others (49)

5.3.1.rex_sleep() (49)

6.临界区(Critical Section) (50)

6.1.rex_init_crit_sect() (51)

6.2.rex_enter_crit_sect() (51)

6.3.rex_leave_crit_sect_internals() (53)

7.APC&DPC (56)

7.1.DPC的实现 (56)

7.1.1.rex_dpc_task() (56)

7.1.2.rex_execute_next_dpc() (57)

7.2.APC的实现 (58)

7.2.1.rex_queue_apc() (58)

7.2.2.rex_queue_apc_internal() (59)

7.2.3.rex_apc_prolog() (60)

7.2.4.rex_call_apc() (62)

7.2.5.rex_apc_epilog (63)

8.REX操作系统的初始化与退出 (63)

8.1.main() (64)

8.2.rex_init() (64)

8.3.rex_exit() (67)

8.4.rex_get_version_number() (67)

9.内存管理 (67)

9.1.rex_mem_init() (67)

9.2.rex_malloc() (67)

9.3.rex_calloc() (68)

9.4.rex_realloc() (68)

9.5.rex_free() (68)

REX(Real Time Executive)是一个面向嵌入式应用的、简单高效的、抢先式、多任务实时操作系统,支持基于优先级的任务调度算法(支持优先级反转)。它提供了任务控制、任务同步、互斥、定时器和中断控制等API。

REX所有的函数都在任务上下文环境里执行。

REX只需要少于5k的ROM空间,需要的RAM空间取决于运行的任务数目加上几k字节的状态数据和堆栈空间。

REX处理了IRQ中断。

1. 数据定义与宏定义(Defines&Macros)

1.1. 数据结构

rex.h中定义了REX中的各种数据结构。

1.1.1.TCB(任务控制块)

用于描述一个REX任务

不能被外部直接访问

由于内核按照排列顺序对其进行访问,结构中数据的排列顺序不能更改

typedef struct rex_tcb_struct {

void*sp; /* 堆栈指针*/

void*stack_limit; /* 堆栈限值*/

unsigned long slices; /* 任务的时间片*/

rex_sigs_type sigs; /* 当前持有的信号量 */

rex_sigs_type wait; /* 等待获得的信号量*/

rex_priority_type pri; /* 任务优先级 */

#if defined FEATURE_REX_PROFILE

unsigned long time_samples; /* Profiling information */

unsigned long max_intlock_time; /* Profiling Info */ #endif

#if defined TIMETEST

word leds; /* TIMETEST val */ #endif

#if defined FEATURE_SOFTWARE_PROFILE

/* 32 bits counter, ~30 usec/tick, ~35 hours */

dword numticks;

#endif

#ifdef FEATURE_REX_APC

long num_apcs; /* APC调用数目 */ #endif

/* 以上数据域的偏移量已在rexarm.h中定义。注意保持两者一致 */

rex_tcb_link_type cs_link; /* 当等待临界区时,为非空 */

rex_crit_sect_type*cs_stack[REX_CRIT_SECT_MAX]; /* 持有和等待临界区的TCB堆栈 */

rex_crit_sect_type**cs_sp; /* 临界区堆栈指针 */

boolean suspended; /* 任务是否挂起 */

char task_name[REX_TASK_NAME_LEN + 1];

#if defined FEATURE_REX_EXTENDED_CONTEXT

void*ext;

#endif

unsigned long thread_id;

unsigned long stack_size;

//检查task堆栈的使用情况,该特性没有打开

#ifdef FEATURE_SI_STACK_WM

unsigned long stack_wm;

#endif

//用于BSD socket数据服务

#if defined FEATURE_DS_SOCKETS_BSD

void*bsdcb_ptr;

#endif

int err_num; /* Error code */ //用于在task被阻塞时,通知Dog停止监视

int dog_report_val; /* Dog Report Id */ int autodog_enabled; /* Dog Report enabled? */

#if defined FEATURE_REX_CREATE_TASK || defined FEATURE_ZREX boolean is_dynamic;

#endif

#ifdef FEATURE_REX_IPC

rex_ipc_info_type ipc_info;

#endif

} rex_tcb_type;

1.1.

2. 定时器(timer)数据结构

描述REX使用的定时器

不能被外部直接访问

typedef struct rex_timer_struct

{

struct

{

struct rex_timer_struct *next_ptr;

struct rex_timer_struct *prev_ptr;

} link;

rex_timer_cnt_type cnt; /* 当前计数值*/

rex_tcb_type*tcb_ptr; /* 指向需要信号的TCB结构 */

rex_sigs_type sigs; /* 关联的信号量*/

#ifdef FEATURE_REX_TIMER_EX

rex_timer_cb_type cb_ptr; /* Function called when timer expires */ unsigned long cb_param; /* Argument to callback function */ #endif

} rex_timer_type;

1.1.3. 临界区(Critical Section)数据结构

提供互斥机制

typedef struct {

byte lock_count; /* > 0 if crit sect is taken */

struct rex_tcb_struct *owner; /* 持有者的TCB指针 */

struct rex_tcb_struct *tcb_link; /* 等待队列的头指针 */

rex_priority_type orig_pri; /* 原始优先级,为支持优先级反转而提供*/ } rex_crit_sect_type;

1.1.4. 上下文帧的结构

任务的上下文,记录了ARM的各个寄存器的数据

typedef PACKED struct {

rex_cpu_register_type spsr;

rex_cpu_register_type r[13]; /* r0-r7,r8-r12 */

rex_cpu_register_type lr; /* r14 */

rex_cpu_register_type pc; /* r15 */

} rex_context_frame_type;

1.2. 几个全局变量

1.2.1. rex_curr_task

当前任务的控制块TCB指针

rex_tcb_type* rex_curr_task;

1.2.2. rex_best_task

处于ready状态、优先级最高的task

将想要成为rex_curr_task的任务设为rex_best_task,再调用rex_sched()进行任务的上下文切换

有些情况下,由于任务调度被加锁、或处于ISR中断模式,rex_sched()不会马上进行任务切换。因此,在rex_sched()真正进行调度之前,rex_best_task可能在不同地方被多次更改。所以在确定是否rex_best_task时,应该将需要切换的任务与rex_best_task进行比较(而不是rex_curr_task)。只有当该任务处于ready状态,且优先级比rex_best_task更高时,才允许更新rex_best_task

rex_tcb_type* rex_best_task;

1.2.3. rex_task_list

任务链表的头节点

rex_tcb_type rex_task_list;

1.2.4. rex_num_tasks

任务个数

int rex_num_tasks = 0;

1.2.5. rex_kernel_tcb

任务链表的最末尾的节点、及其堆栈

一般指向Idle task

static rex_tcb_type rex_kernel_tcb;

rex_stack_word_type rex_kernel_stack[ REX_KERNEL_STACK_SIZE/ sizeof(rex_stack_word_type) ];

1.2.6. rex_sched_allow

任务调度是否加锁的标志位

int rex_sched_allow = TRUE; /* turns sched on/off */

1.2.7. rex_nest_depth

用于支持任务调度的嵌套加锁,记录嵌套层数

unsigned int rex_nest_depth = 0; /* supports nesting of TASKLOCK/

* FREE.*/

1.2.8. rex_timer_list

定时器链表的头节点

static rex_timer_type rex_timer_list;

1.2.9. rex_null_timer

空定时器

定时器链表的最末尾节点

static rex_timer_type rex_null_timer;

1.2.10. rex_irq_vector & rex_fiq_vector

包含用户定义的ISR中断服务函数的入口点

void(* rex_irq_vector) (void);

void(* rex_fiq_vector) (void);

1.3. MACROS(几个宏定义)

1.3.1. REX_VERSION_NUMBER

#define REX_VERSION_NUMBER ((unsigned long) 403)

1.3.

2. 任务链表操作宏

REX_TASK_LIST_FRONT() 获得任务链表的头节点,多用于链表循环 REX_TASK_LIST_NEXT( tcb_ptr ) 获得指定任务的下一个任务

REX_TASK_LIST_PREV( tcb_ptr ) 获得指定任务的前一个任务

REX_TASK_LIST_POP( tcb_ptr ) 将指定任务从任务链表中移除

#define REX_TASK_LIST_FRONT() (&rex_task_list)

#define REX_TASK_LIST_NEXT( tcb_ptr ) ((rex_tcb_type *)

tcb_ptr->link.next_ptr )

#define REX_TASK_LIST_PREV( tcb_ptr ) ((rex_tcb_type *)

tcb_ptr->link.prev_ptr )

#define REX_TASK_LIST_POP( tcb_ptr )\

tcb_ptr->link.next_ptr->link.prev_ptr = tcb_ptr->link.prev_ptr;\

tcb_ptr->link.prev_ptr->link.next_ptr = tcb_ptr->link.next_ptr;

1.3.3. REX_TASK_RUNNABLE(tcb)

判断指定任务是否处于ready状态。

判据:1、任务是否挂起;2、任务是否在等待进入临界区;3、任务是否在等待信号量;

4、是否有APC队列需要处理。

#define REX_TASK_RUNNABLE(tcb) ((tcb->suspended == FALSE) && \

(tcb->cs_link.next_ptr == NULL) && \

((tcb->wait== 0) || \

(tcb->num_apcs > 0)))

1.3.4. 看门狗操作宏

REX_PAUSE_DOG_MONITOR( tcb_ptr ) 通知DOG停止监视该任务

REX_RESUME_DOG_MONITOR( tcb_ptr ) 通知DOG恢复对该任务的监视

#define REX_PAUSE_DOG_MONITOR( tcb_ptr ) \

{ \

if ( ( tcb_ptr->autodog_enabled ) && ( tcb_ptr->dog_report_val >= 0 ) )\ { \

dog_monitor_pause( tcb_ptr->dog_report_val ); \

} \

}

#define REX_RESUME_DOG_MONITOR( tcb_ptr ) \

{ \

if ( tcb_ptr->dog_report_val >= 0 ) \

{ \

dog_monitor_resume( tcb_ptr->dog_report_val ); \

} \

}

2. 任务(TASK)

REX把task当作一个个独立的入口函数,每个task都拥有各自的堆栈、优先级,这些共同构成了任务的上下文。每个任务都有一个相关联的数据结构,称为TCB(任务控制块)。

REX允许在执行任意时刻创建任意数目的task。实际上,每增加一个任务,由于遍历更长的任务链表,REX的性能会有轻微的下降。需要小心控制任务的数目。

任务堆栈:

每个任务都拥有自己的堆栈,在运行时被使用。当任务挂起时(如运行其他任务或进行

中断服务),任务的寄存器会被压入任务堆栈中,并将栈顶指针保存在任务TCB里。等到任务被选中再次运行时,从TCB里获取栈顶指针,将任务的寄存器值从其堆栈中弹出,任务于是从上次被中断的位置继续运行。这些任务切换的处理对于任务来说是透明的(可以参考【第三章调度】)。

2.1. 创建任务

2.1.1. rex_def_task_internal()

定义和创建一个任务

定义初始的任务上下文,初始化TCB结构信息

将任务按优先级顺序插入到rex_task_list中

若是该任务优先级比rex_best_task更高且没有挂起,则进行任务调度

void rex_def_task_internal(

rex_tcb_type*p_tcb, /* valid tcb for new task */ unsigned char* p_stack, /* stack for new task */ rex_stack_size_type p_stksiz, /* stack size in bytes */ rex_priority_type p_pri, /* priority for new task */ rex_task_func_type p_task, /* task startup function */ dword p_param, /* parameter for new task */ char*p_tskname, /* A/N string for task name */ boolean p_susp, /* is task initially suspended? */ void*p_parent, /* opaque handle to container */ boolean p_dynamic, /* stack/tcb alloc'd via dyna mem */ int dog_report_val/* Dog report value */ )

{

word index= 0;

byte*stack_ptr = NULL;

rex_context_frame_type *cf_ptr= NULL;

/*-------------------------------------------------------

** Task stack pointer points to the bottom of allocated

** stack memory. p_stksiz is the number of 8-bit bytes.

**-----------------------------------------------------*/

stack_ptr = (byte *)((unsigned long)p_stack + (unsigned long)p_stksiz - sizeof(unsigned long) );

/*-------------------------------------------------------

** Creates room for the context.

** sp points to the top of the context frame.

**-----------------------------------------------------*/

stack_ptr -= sizeof( rex_context_frame_type );

/*-------------------------------------------------------

** Defines the initial context.

** 设置任务的pc、lr为通用任务入口函数rex_task_preamble(),其参数为** p_task、p_param。

**-----------------------------------------------------*/

cf_ptr= (rex_context_frame_type*)stack_ptr;

cf_ptr->spsr.val = PSR_Supervisor | PSR_Thumb;

cf_ptr->r[0].task= p_task;

cf_ptr->r[1].arg= p_param;

cf_ptr->r[10].arg= (unsigned long)p_stack;

cf_ptr->lr.preamble = rex_task_preamble;

cf_ptr->pc.preamble = rex_task_preamble;

/* ------------------------------------------------------

** Initialize the task control block (TCB)

** ------------------------------------------------------ */

p_tcb->sp= stack_ptr;

p_tcb->stack_limit= p_stack;

p_tcb->stack_size= p_stksiz;

p_tcb->slices= 0;

p_tcb->sigs= 0;

p_tcb->wait= 0;

p_tcb->pri= p_pri;

p_tcb->cs_link.next_ptr = NULL;

p_tcb->cs_link.prev_ptr = NULL;

p_tcb->cs_sp= p_tcb->cs_stack; - -p_tcb->cs_sp;

p_tcb->suspended= p_susp;

#ifdef FEATURE_SI_STACK_WM

rex_swm_init( p_tcb );

#endif /* FEATURE_SI_STACK_WM */

p_tcb->task_name[REX_TASK_NAME_LEN] = '\0';

if (p_tskname != NULL) /* copy task name if one was supplied */

{

/* copy bytes until /0 received or enough chars have been copied */ while ( (p_tcb->task_name[index] = p_tskname[index] ) &&

( index++ < REX_TASK_NAME_LEN ) );;

}

#if defined FEATURE_REX_APC

p_tcb->num_apcs = 0; /* Number of queued APCs */ #endif

#if defined FEATURE_REX_PROFILE

p_tcb->time_samples = 0; /* Profiling information */

#endif

#if defined FEATURE_DS_SOCKETS_BSD

p_tcb->bsdcb_ptr = NULL;

#endif

#if defined FEATURE_SOFTWARE_PROFILE

p_tcb->numticks= 0;

#endif

p_tcb->err_num = 0;

p_tcb->dog_report_val= dog_report_val;

p_tcb->autodog_enabled = FALSE;

#if defined FEATURE_REX_CREATE_TASK && !defined FEATURE_ZREX p_tcb->is_dynamic = TRUE;

#endif

/*-------------------------------------------------------

** We are done if this is the idle task (kernel task) defined.

**-------------------------------------------------------*/

if (p_pri == 0) {

return;

}

/*-------------------------------------------------------

** Find the first task whose priority is lower than the

** new task and insert the new task in front of the

** lower priority task.

** rex_idle_task (the kernel task) is at the end of the list

** with priority 0 and therefore no need to check for null ptrs.

**-----------------------------------------------------*/

REX_INTLOCK();

{

rex_tcb_type *tcb_ptr;

tcb_ptr = rex_task_list.link.next_ptr;

while ((tcb_ptr->pri > p_pri) && (tcb_ptr != &rex_kernel_tcb)) { tcb_ptr = tcb_ptr->link.next_ptr;

}

p_tcb->link.prev_ptr = tcb_ptr->link.prev_ptr;

p_tcb->link.next_ptr = tcb_ptr;

tcb_ptr->link.prev_ptr->link.next_ptr = p_tcb;

tcb_ptr->link.prev_ptr = p_tcb;

}

#ifdef FEATURE_REX_IPC

if (ipcns_node_register(p_tcb) == FALSE)

{

return;

}

#endif

/*---------------------------------------------------

** Make this task the best task if it is higher

** priority than the present best task.

**---------------------------------------------------*/

/* Always compare with REX_BEST_TASK, not REX_CURR_TASK */

if( (p_pri > rex_best_task->pri) && (p_tcb->suspended == FALSE) ) {

rex_best_task = p_tcb;

/* swap the task in */

rex_sched();

}

rex_num_tasks++;

REX_INTFREE();

return;

}

相关的API:

rex_def_task()、rex_def_task_ext()、rex_def_task_ext2()

2.2. 任务的通用引导函数

2.2.1. rex_task_preamble()

每个新创建的任务在第一次运行时,都会首先执行这个函数。这样做的好处是可以处理任务入口函数返回的情况(在这里,会将该任务直接删除)。

只能由REX内部调用

void rex_task_preamble(

void (*func_ptr)( dword arg ),

dword arg

)

{

func_ptr( arg );

/* if we return, kill the task */

rex_kill_task( rex_self() );

} /* END rex_task_preamble */

2.3. 任务挂起和继续

2.3.1. rex_suspend_task()

挂起一个任务,使其不再接受调度

如果挂起的是当前任务,则要进行一次任务调度

void rex_suspend_task( rex_tcb_type *p_tcb)

{

p_tcb->suspended = TRUE;

REX_INTLOCK();

if ( ( p_tcb == rex_curr_task ) && !rex_is_in_irq_mode( ) )

{

rex_set_best_task( REX_TASK_LIST_FRONT() );

rex_sched( );

}

REX_INTFREE();

return;

} /* END rex_suspend_task */

2.3.2. rex_resume_task()

使任务重新接受调度

若该任务优先级比rex_best_task更高,则进行任务调度

void rex_resume_task( rex_tcb_type*p_tcb)

{

REX_INTLOCK();

/* basic sanity check to see if we should even be here or not */ if (p_tcb->suspended == TRUE)

{

p_tcb->suspended = FALSE;

if ((p_tcb->pri > rex_best_task->pri) &&

REX_TASK_RUNNABLE(p_tcb))

{

rex_best_task = p_tcb;

rex_sched();

}

}

REX_INTFREE();

return;

} /* END rex_resume_task */

2.4. 删除任务

2.4.1. rex_remove_task()

将一个任务控制块TCB从任务列表rex_task_list从移除

void rex_remove_task( rex_tcb_type *tcb_ptr/* pointer to tcb */)

{

rex_tcb_type *prev_tcb_ptr;

rex_tcb_type *next_tcb_ptr;

prev_tcb_ptr = REX_TASK_LIST_PREV( tcb_ptr );

next_tcb_ptr = REX_TASK_LIST_NEXT( tcb_ptr );

if ( ( prev_tcb_ptr == NULL||

prev_tcb_ptr->pri != tcb_ptr->pri ) &&

next_tcb_ptr != NULL&&

next_tcb_ptr->pri == tcb_ptr->pri)

{

/* 若该任务是当前优先级别的代表(最靠前的任务),寻找下一个同一优先级别的任务,作为代表(并未使用) */

rex_tcb_type *temp_tcb_ptr = next_tcb_ptr;

while ( temp_tcb_ptr->pri == tcb_ptr->pri )

{

temp_tcb_ptr->pri_rep_ptr = next_tcb_ptr;

temp_tcb_ptr = REX_TASK_LIST_NEXT( temp_tcb_ptr );

}

}

REX_TASK_LIST_POP( tcb_ptr );

tcb_ptr->link.prev_ptr = NULL;

tcb_ptr->link.next_ptr = NULL;

return;

} /* END rex_remove_task */

2.4.2. rex_kill_task_ext()

首先将任务从rex_task_list从移除

移除与其相关的定时器

通知DOG停止对其的监视

如果持有临界区,则需要释放它

如果需要任务调度,先检查该任务是否持有任务调度锁定,若有则需释放锁定,再进行任务调度

void rex_kill_task_ext(

rex_tcb_type *p_tcb,

boolean schedule_new_task

)

{

REX_INTLOCK();

TASKLOCK();

/* Task is alive only if it is still linked into TCB list.

*/

if ( (p_tcb->link.prev_ptr != NULL ) || (p_tcb->link.next_ptr != NULL) ) {

/* Remove TCB from the task list.

*/

rex_remove_task( p_tcb );

/* Remove REX timers associated with the task from the timer list.

*/

rex_delete_task_timers( p_tcb );

/* Tell Dog to stop monitoring this task.

*/

REX_PAUSE_DOG_MONITOR( p_tcb );

/* Check if we were holding or waiting on a critical section */

while (p_tcb->cs_sp >= p_tcb->cs_stack)

{

if ( p_tcb->cs_link.next_ptr == NULL) /* holding crit section */

{

/* free the crit section, but don't call rex_sched() yet */

rex_leave_crit_sect_internals( *p_tcb->cs_sp, p_tcb, FALSE);

}

else/* we were waiting on the list */

{

/* if item is first on the list, fix up list head */

if (p_tcb->cs_link.prev_ptr == REX_CRIT_SECT_FLAG)

{

(*p_tcb->cs_sp)->tcb_link = p_tcb->cs_link.next_ptr;

}

else/* fix up previous item on list */

{

p_tcb->cs_link.prev_ptr->cs_link.next_ptr =

p_tcb->cs_link.next_ptr;

}

/* if item is NOT the last on the list */

if (p_tcb->cs_link.next_ptr != REX_CRIT_SECT_FLAG)

{

p_tcb->cs_link.next_ptr->cs_link.prev_ptr =

p_tcb->cs_link.prev_ptr;

}

--p_tcb->cs_sp;

}

} /* END we needed to deal with crit section */

rex_num_tasks--;

if( schedule_new_task )

{

/* 如果任务是想杀死自身,并且持有任务锁定,则要释放任务锁定*/

if (p_tcb == rex_curr_task)

{

if (rex_nest_depth > 0)

{

rex_nest_depth = 0;

rex_sched_allow = TRUE;

}

} /* end-if task was killing itself */

rex_set_best_task( REX_TASK_LIST_FRONT() );

rex_sched();

} /* END needed to reschedule */

} /* END TCB was still in active list */

TASKFREE();

REX_INTFREE();

return;

} /* END rex_kill_task_ext */

相关的API:

rex_kill_task()

2.5. Others

2.5.1. rex_self()

获得当前任务的控制块TCB

rex_tcb_type *rex_self( void )

{

/*-------------------------------------------------------

** The currently running task is in rex_curr_task

**-----------------------------------------------------*/

return rex_curr_task;

} /* END rex_self */

2.5.2. rex_get_pri()

获得当前任务的优先级

rex_priority_type rex_get_pri( void )

{

/*-------------------------------------------------------

** Just return the priority field of the current task

**-----------------------------------------------------*/

return rex_curr_task->pri;

} /* END rex_get_pri */

2.5.

3. rex_set_pri()

设置任务的优先级

rex_priority_type rex_set_pri(

rex_priority_type p_pri/* the new priority */

)

{

/*-------------------------------------------------------

** A wrapper function that just calls rex_task_pri with ** the current task

**-----------------------------------------------------*/

return rex_task_pri(rex_curr_task, p_pri);

} /* END rex_set_pri */

2.5.4. rex_task_pri()

设置指定任务的优先级

从任务链表中移除

改变该任务的优先级

将该任务按照新优先级插入任务链表中

若满足调度条件,则进行任务调度

rex_priority_type rex_task_pri(

rex_tcb_type*p_tcb, /* tcb to set priority on */

rex_priority_type p_pri/* the new priority */

)

{

rex_priority_type prev_pri= p_tcb->pri; /* the priority before the set */ boolean comp = FALSE; /* Comparator */

REX_INTLOCK();

comp = (p_pri == p_tcb->pri);

REX_INTFREE();

/* Return if the priority is the same */

if( comp )

{

return prev_pri;

}

REX_INTLOCK();

/* 先从链表中移除,在根据新优先级将其重新插入到一个新位置 */

p_tcb->link.next_ptr->link.prev_ptr = p_tcb->link.prev_ptr;

p_tcb->link.prev_ptr->link.next_ptr = p_tcb->link.next_ptr;

p_tcb->pri = p_pri;

/* 按照优先级大小,将任务插入任务链表;rex_idle_task(the kernel task)优先级为0,处于链表末尾 */

search_ptr = rex_task_list.link.next_ptr;

while(search_ptr->pri > p_pri) {

search_ptr = search_ptr->link.next_ptr;

}

p_tcb->link.prev_ptr = search_ptr->link.prev_ptr;

p_tcb->link.next_ptr = search_ptr;

search_ptr->link.prev_ptr->link.next_ptr = p_tcb;

search_ptr->link.prev_ptr = p_tcb;

/* 如果任务处于ready状态,且优先级比rex_best_task更高,则进行任务切换 */ if ( (p_pri > rex_best_task->pri) && ( REX_TASK_RUNNABLE(p_tcb) ) ) {

操作系统考试重点及答案

Chap-1绪论 理解操作系统设计的目标 方便性、有效性、可扩充性、开放性 掌握操作系统的特性及含义 并发:在一个时间段上来看,每一道作业都能不同程度地向前推进(并行) 。但在任何 一个时间点上只能有一道占用 CPU 。(串行) ------------ 并发性引入进程、线程 共享:系统中的资源可供多个并发的进程共同使用。根据资源属性的不同,有两种资源 共享方式: 互斥共享方式(临界/独占资源) 同时访问方式 虚拟:通过某种技术将一个物理实体映射为若干个逻辑上对应物(如 可看成多个屏幕-窗口)。或将多个物理实体映射为一个逻辑实体 外存的虚拟)。 异步性:操作系统必须随时对以不可预测的次序发生的事件进行响应。 速度不可预知。2、难以重现系统在某个时刻的状态 (并发和共享是 OS 的两个最基本的特性,二者互为条件! ) 理解操作系统的作用 OS 是用户与硬件系统之间的接口 ;0S 是计算机系统资源的管理者;0S 是扩充机/虚拟机 理解不种类型操作系统的定义 (1) 无操作系统的计算机系统: 先把程序纸带装上输入机, 启动输入机把程序和数据送 入计算机,然后通过控制台开关启动程序运行,计算完毕后,用户拿走打印结果, 并卸下纸带。 (2) 单道批处理系统:在内存中只有一道程序。 (3)多道批处理系统:在内存中放多道程序 ,使它们在管理程序的控制下相互穿插地运行。 (4 )分时系统:划分时间片 (3) 实时系统:系统能及时响应外部事件的请求, 在规定的时间内完成对该事件的处理, 并控制所有实时任务协调一致地运行。 (4) 微机操作系统: 批处理、分时、实时系统是三种基本的操作系统类型。一个实际的操作系统可能兼有三者 或其中两者的功能。 1、 2、 3、 4、 CPU ; —个屏幕 (如虚拟存储是内存和 1、进程的运行 Chap-2进程管理 5、 进程的定义 进程是指进程实体的运行过程,是可并发执行的程序在一个数据集合上的运行过程。 6、 理解进程的三状态及其转换和典型原因

计算机操作系统(第四版)课后答案第一,二,三章

第一章 1.设计现代OS的主要目标是什么? 答:(1)有效性(2)方便性(3)可扩充性(4)开放性 2.OS的作用可表现在哪几个方面? 答:(1)OS作为用户与计算机硬件系统之间的接口(2)OS作为计算机系统资源的管理者(3)OS实现了对计算机资源的抽象 3.为什么说OS实现了对计算机资源的抽象? 答:OS首先在裸机上覆盖一层I/O设备管理软件,实现了对计算机硬件操作的第一层次抽象;在第一层软件上再覆盖文件管理软件,实现了对硬件资源操作的第二层次抽象。OS 通过在计算机硬件上安装多层系统软件,增强了系统功能,隐藏了对硬件操作的细节,由它们共同实现了对计算机资源的抽象。 4.试说明推劢多道批处理系统形成和収展的主要劢力是什么? 答:主要动力来源于四个方面的社会需求与技术发展:(1)不断提高计算机资源的利用率;(2)方便用户;(3)器件的不断更新换代;(4)计算机体系结构的不断发展。5.何谓脱机I/O和联机I/O? 答:脱机I/O 是指事先将装有用户程序和数据的纸带或卡片装入纸带输入机或卡片机,在外围机的控制下,把纸带或卡片上的数据或程序输入到磁带上。该方式下的输入输出由外围机控制完成,是在脱离主机的情况下进行的。而联机I/O方式是指程序和数据的输入输出都是在主机的直接控制下进行的。 6.试说明推劢分时系统形成和収展的主要劢力是什么? 答:推动分时系统形成和发展的主要动力是更好地满足用户的需要。主要表现在:CPU 的分时使用缩短了作业的平均周转时间;人机交互能力使用户能直接控制自己的作业;主机的共享使多用户能同时使用同一台计算机,独立地处理自己的作业。 7.实现分时系统的关键问题是什么?应如何解决? 答:关键问题是当用户在自己的终端上键入命令时,系统应能及时接收并及时处理该命令,在用户能接受的时延内将结果返回给用户。解决方法:针对及时接收问题,可以在系统中设臵多路卡,使主机能同时接收用户从各个终端上输入的数据;为每个终端配臵缓冲区,暂存用户键入的命令或数据。针对及时处理问题,应使所有的用户作业都直接进入内存,并且为每个作业分配一个时间片,允许作业只在自己的时间片内运行,这样在不长的时间内,能使每个作业都运行一次。 8.为什么要引入实时OS? 答:实时操作系统是指系统能及时响应外部事件的请求,在规定的时间内完成对该事件的处理,并控制所有实时任务协调一致地运行。引入实时OS 是为了满足应用的需求,更好地满足实时控制领域和实时信息处理领域的需要。 9.什么是硬实时任务和软实时任务?试举例说明。 答:硬实时任务是指系统必须满足任务对截止时间的要求,否则可能出现难以预测的结果。举例来说,运载火箭的控制等。软实时任务是指它的截止时间并不严格,偶尔错过了任务的截止时间,对系统产生的影响不大。举例:网页内计算机操作系统第三版答案 2 / 47 容的更新、火车售票系统。 10.试从交互性、及时性以及可靠性方面,将分时系统不实时系统迚行比较。答:(1)及时性:实时信息处理系统对实时性的要求与分时系统类似,都是以人所能接受的等待时间来确定;而实时控制系统的及时性,是以控制对象所要求的开始截止时间或完成截止时间来确定的,一般为秒级到毫秒级,甚至有的要低于100微妙。(2)交互性:实时信息处理系统具有交互性,但人与系统的交互仅限于访问系统中某些特定的专用服务程序。不像分时系统那样能向终端用户提供数据和资源共享等服务。(3)可靠性:分时系统也要求系统可靠,但相比之下,实时系统则要求系统具有高度的可靠性。因为任何差错都可能带来巨大的经济损失,甚至是灾难性后果,所以在实时系统中,往往都采取了多级容错措施保障系统的安全性及数据的安全性。 11.OS有哪几大特征?其最基本的特征是什么? 答:并发性、共享性、虚拟性和异步性四个基本特征;最基本的特征是并发性。14.是什么原因使操作系统具有异步性特征? 答:操作系统的异步性体现在三个方面:一是进程的异步性,进程以人们不可预知的速度向前推进,二是程序的不可再现性,即程序执行的结果有时是不确定的,三是程序执行时间的不可预知性,即每个程序何时执行,执行顺序以及完成时间是不确定的。15.处理机管理有哪些主要功能?它们的主要任务是什么? 答:处理机管理的主要功能是:进程管理、进程同步、进程通信和处理机调度;进程管理:为作业创建进程,撤销已结束进程,控制进程在运行过程中的状态转换。进程同步:为多个进程(含线程)的运行进行协调。通信:用来实现在相互合作的进程之间的信息交换。处理机调度:(1)作业调度。从后备队里按照一定的算法,选出若干个作业,为他们分配运行所需的资源(首选是分配内存)。(2)进程调度:从进程的就绪队列中,按照一定算法选出一个进程,把处理机分配给它,并设臵运行现场,使进程投入执行。 16.内存管理有哪些主要功能?他们的主要任务是什么? 答:内存管理的主要功能有:内存分配、内存保护、地址映射和内存扩充。内存分配:为每道程序分配内存。内存保护:确保每道用户程序都只在自己的内存空间运行,彼此互不干扰。计算机操作系统第三版答案 3 / 47 地址映射:将地址空间的逻辑地址

操作系统内核的动态可信度量模型

操作系统内核的动态可信度量模型 摘要:动态可信度量是可信计算的研究热点和难点,针对由操作系统内核动态性所引起的可信度量困难问题,提出一种操作系统内核的动态可信度量模型,使用动态度量变量描述和构建系统动态数据对象及其关系,对内核内存进行实时数据采集,采用语义约束描述内核动态数据的动态完整性,通过语义约束检查验证内核动态数据是否维持其动态完整性。给出了模型的动态度量性质分析与证明,模型能够有效地对操作系统内核的动态数据进行可信度量,识别对内核动态数据的非法篡改。 关键词:可信计算;可信度量;动态度量;操作系统内核;远程证明 dynamic trusted measurement model of operating system kernel xin si.yuan1*, zhao yong2, liao jian.hua3, wang ting4 1.institute of electronic technology, information engineering university, zhengzhou henan 450004,china;2.college of computer science,beijing university of technology,beijing 100124,china; 3.school of electronics engineering and computer science, peking university, beijing 100871, china; 4. unit 65047 of pla,shenyang liaoning 100805,

计算机操作系统有哪几种分类

计算机操作系统有哪几种分类 目前操作系统种类繁多,关于计算机的操作系统又分为哪几种呢?下面由小编为大家搜集整理了计算机操作系统有哪些分类的相关知识,希望对大家有帮助! 计算机操作系统有哪些分类 计算机操作系统分类一 根据操作系统的使用环境和对作业处理方式来考虑,可分为批处理系统(MVX、DOS/VSE)、分时系统(WINDOWS、UNIX、XENIX、Mac OS)、实时系统(iEMX、VRTX、RTOS,RT Linux); 计算机操作系统分类二 根据所支持的用户数目,可分为单用户(MSDOS、OS/2)、多用户系统(UNIX、MVS、Windows); 计算机操作系统分类三

根据硬件结构,可分为网络操作系统(Netware、Windows NT、OS/2 warp)、分布式系统(Amoeba)、多媒体系统(Amiga)等。 操作系统的五大类型是:批处理操作系统、分时操作系统、实时操作系统、网络操作系统、分布式操作系统。 扩展资料:常见的计算机操作系统简介 CP/M CP/M其实就是第一个微机操作系统,享有指挥主机、内存、磁鼓、磁带、磁盘、打印机等硬设备的特权。通过控制总线上的程序和数据,操作系统有条不紊地执行着人们的指令…… 主设计人:Gary Kildall博士 出现年月:1974年>>>>>详细内容 MS-DOS DOS系统是1981年由微软公司为IBM个人电脑开发的,即MS-DOS。它是一个单用户单任务的操作系统。在1985年到1995

年间DOS占据操作系统的统治地位。 主设计人:Tim Paterson 出现年月:1981年>>>>>详细内容 特点 文件管理方便 外设支持良好 小巧灵活 应用程序众多 Windows Windows是一个为个人电脑和服务器用户设计的操作系统。它的第一个版本由微软公司发行于1985年,并最终获得了世界个人电脑操作系统软件的垄断地位。所有最近的Windows都是完全独立的操作系统。

Linux操作系统源代码详细分析

linux源代码分析:Linux操作系统源代码详细分析 疯狂代码 https://www.wendangku.net/doc/4a12755868.html,/ ?:http:/https://www.wendangku.net/doc/4a12755868.html,/Linux/Article28378.html 内容介绍: Linux 拥有现代操作系统所有功能如真正抢先式多任务处理、支持多用户内存保护虚拟内存支持SMP、UP符合POSIX标准联网、图形用户接口和桌面环境具有快速性、稳定性等特点本书通过分析Linux内核源代码充分揭示了Linux作为操作系统内核是如何完成保证系统正常运行、协调多个并发进程、管理内存等工作现实中能让人自由获取系统源代码并不多通过本书学习将大大有助于读者编写自己新 第部分 Linux 内核源代码 arch/i386/kernel/entry.S 2 arch/i386/kernel/init_task.c 8 arch/i386/kernel/irq.c 8 arch/i386/kernel/irq.h 19 arch/i386/kernel/process.c 22 arch/i386/kernel/signal.c 30 arch/i386/kernel/smp.c 38 arch/i386/kernel/time.c 58 arch/i386/kernel/traps.c 65 arch/i386/lib/delay.c 73 arch/i386/mm/fault.c 74 arch/i386/mm/init.c 76 fs/binfmt-elf.c 82 fs/binfmt_java.c 96 fs/exec.c 98 /asm-generic/smplock.h 107 /asm-i386/atomic.h 108 /asm- i386/current.h 109 /asm-i386/dma.h 109 /asm-i386/elf.h 113 /asm-i386/hardirq.h 114 /asm- i386/page.h 114 /asm-i386/pgtable.h 115 /asm-i386/ptrace.h 122 /asm-i386/semaphore.h 123 /asm-i386/shmparam.h 124 /asm-i386/sigcontext.h 125 /asm-i386/siginfo.h 125 /asm-i386/signal.h 127 /asm-i386/smp.h 130 /asm-i386/softirq.h 132 /asm-i386/spinlock.h 133 /asm-i386/system.h 137 /asm-i386/uaccess.h 139 //binfmts.h 146 //capability.h 147 /linux/elf.h 150 /linux/elfcore.h 156 /linux/errupt.h 157 /linux/kernel.h 158 /linux/kernel_stat.h 159 /linux/limits.h 160 /linux/mm.h 160 /linux/module.h 164 /linux/msg.h 168 /linux/personality.h 169 /linux/reboot.h 169 /linux/resource.h 170 /linux/sched.h 171 /linux/sem.h 179 /linux/shm.h 180 /linux/signal.h 181 /linux/slab.h 184 /linux/smp.h 184 /linux/smp_lock.h 185 /linux/swap.h 185 /linux/swapctl.h 187 /linux/sysctl.h 188 /linux/tasks.h 194 /linux/time.h 194 /linux/timer.h 195 /linux/times.h 196 /linux/tqueue.h 196 /linux/wait.h 198 init/.c 198 init/version.c 212 ipc/msg.c 213 ipc/sem.c 218 ipc/shm.c 227 ipc/util.c 236 kernel/capability.c 237 kernel/dma.c 240 kernel/exec_do.c 241 kernel/exit.c 242 kernel/fork.c 248 kernel/info.c 255 kernel/itimer.c 255 kernel/kmod.c 257 kernel/module.c 259 kernel/panic.c 270 kernel/prk.c 271 kernel/sched.c 275 kernel/signal.c 295 kernel/softirq.c 307 kernel/sys.c 307 kernel/sysctl.c 318 kernel/time.c 330 mm/memory.c 335 mm/mlock.c 345 mm/mmap.c 348 mm/mprotect.c 358 mm/mremap.c 361 mm/page_alloc.c 363 mm/page_io.c 368 mm/slab.c 372 mm/swap.c 394 mm/swap_state.c 395 mm/swapfile.c 398 mm/vmalloc.c 406 mm/vmscan.c 409

计算机操作系统(第三版-汤小丹等)课后习题答案(全)整理后

第一章操作系统引论 1.设计现代OS的主要目标是什么 答:(1)有效性(2)方便性(3)可扩充性(4)开放性 2.OS的作用可表现在哪几个方面 答:(1)OS作为用户与计算机硬件系统之间的接口;(2)OS作为计算机系统资源的管理者;(3)OS实现了对计算机资源的抽象。 3.为什么说OS实现了对计算机资源的抽象 答:OS首先在裸机上覆盖一层I/O设备管理软件,实现了对计算机硬件操作的第一层次抽象;在第一层软件上再覆盖文件管理软件,实现了对硬件资源操作的第二层次抽象。OS 通过在计算机硬件上安装多层系统软件,增强了系统功能,隐藏了对硬件操作的细节,由它们共同实现了对计算机资源的抽象。 4.试说明推动多道批处理系统形成和发展的主要动力是什么 答:主要动力来源于四个方面的社会需求与技术发展:(1)不断提高计算机资源的利用率;(2)方便用户;(3)器件的不断更新换代;(4)计算机体系结构的不断发展。 5.何谓脱机I/O和联机I/O 答:脱机I/O 是指事先将装有用户程序和数据的纸带或卡片装入纸带输入机或卡片机,在外围机的控制下,把纸带或卡片上的数据或程序输入到磁带上。该方式下的输入输出由外围机控制完成,是在脱离主机的情况下进行的。而联机I/O方式是指程序和数据的输入输出都是在主机的直接控制下进行的。 6.试说明推动分时系统形成和发展的主要动力是什么 答:推动分时系统形成和发展的主要动力是更好地满足用户的需要。主要表现在:CPU 的分时使用缩短了作业的平均周转时间;人机交互能力使用户能直接控制自己的作业;主机的共享使多用户能同时使用同一台计算机,独立地处理自己的作业。 7.实现分时系统的关键问题是什么应如何解决 答:关键问题是当用户在自己的终端上键入命令时,系统应能及时接收并及时处理该命令,在用户能接受的时延内将结果返回给用户。解决方法:针对及时接收问题,可以在系统中设置多路卡,使主机能同时接收用户从各个终端上输入的数据;为每个终端配置缓冲区,暂存用户键入的命令或数据。针对及时处理问题,应使所有的用户作业都直接进入内存,并且为每个作业分配一个时间片,允许作业只在自己的时间片内运行,这样在不长的时间内,能使每个作业都运行一次。

操作系统简答题(含答案)

1.OS的主要功能 操作系统的基本功能:处理机管理、存储管理、设备管理、信息管理(文件系统管理)、用户接口。 2.OS有哪三种类型?各有什么特点? 操作系统一般可分为三种基本类型,即批处理系统、分时系统和实时系统。 批处理操作系统的特点是:多道和成批处理。 分时系统具有多路性、交互性、“独占”性和及时性的特征。 实时系统特点:及时响应和高可靠性 3.OS的基本特征是什么? 并发性、共享性、虚拟技术、异步性 4.OS一般为用户提供了哪三种接口?各有什么特点? 1.联机命令接口 提供一组命令供用户直接或间接操作。根据作业的方式不同,命令接口又分为联机命令接口和脱机命令接口。 2.程序接口 程序接口由一组系统调用命令组成,提供一组系统调用命令供用户程序使用。3.图形界面接口 通过图标窗口菜单对话框及其他元素,和文字组合,在桌面上形成一个直观易懂使用方便的计算机操作环境. 5.OS主要有那些类型的体系结构? 单体结构、层次结构、微内核结构与客户机-服务器模型、虚拟机结构 6.多道程序设计的主要特点是什么? 多道程序设计技术是指在内存同时放若干道程序,使它们在系统中并发执行,共享系统中的各种资源。当一道程序暂停执行时,CPU立即转去执行另一道程序。 [特点]:多道、宏观上并行(不同的作业分别在CPU和外设上执行)、微观上串行(在单CPU上交叉运行)。 7.OS在计算机系统中处于什么地位? 操作系统在计算机系统中占有特殊重要的位置,所有其他软件都建立在操作系统基础上,并得到其支持和服务;操作系统是支撑各种应用软件的平添。用户利用操作系统提供的命令和服务操纵和使用计算机。可见,操作系统实际上是一个计算机系统硬件、软件资源的总指挥部。操作系统的性能决定了计算机系统的安全性和可靠性。 8.解释一下术语:进程、进程控制块、进程映像、线程、进程的互斥和同步、临界区和临 界资源、竞争条件、原语、信号量、管程、死锁、饥饿 进程:进程是程序在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立的基本单位。 进程控制块(Procedure Control Block):使一个在多道程序环境下不能独立运行的程序(含

linux内核IMQ源码实现分析

本文档的Copyleft归wwwlkk所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性,严禁用于任何商业用途。 E-mail: wwwlkk@https://www.wendangku.net/doc/4a12755868.html, 来源: https://www.wendangku.net/doc/4a12755868.html,/?business&aid=6&un=wwwlkk#7 linux2.6.35内核IMQ源码实现分析 (1)数据包截留并重新注入协议栈技术 (1) (2)及时处理数据包技术 (2) (3)IMQ设备数据包重新注入协议栈流程 (4) (4)IMQ截留数据包流程 (4) (5)IMQ在软中断中及时将数据包重新注入协议栈 (7) (6)结束语 (9) 前言:IMQ用于入口流量整形和全局的流量控制,IMQ的配置是很简单的,但很少人分析过IMQ的内核实现,网络上也没有IMQ的源码分析文档,为了搞清楚IMQ的性能,稳定性,以及借鉴IMQ的技术,本文分析了IMQ的内核实现机制。 首先揭示IMQ的核心技术: 1.如何从协议栈中截留数据包,并能把数据包重新注入协议栈。 2.如何做到及时的将数据包重新注入协议栈。 实际上linux的标准内核已经解决了以上2个技术难点,第1个技术可以在NF_QUEUE机制中看到,第二个技术可以在发包软中断中看到。下面先介绍这2个技术。 (1)数据包截留并重新注入协议栈技术

(2)及时处理数据包技术 QoS有个技术难点:将数据包入队,然后发送队列中合适的数据包,那么如何做到队列中的数

激活状态的队列是否能保证队列中的数据包被及时的发送吗?接下来看一下,激活状态的队列的 证了数据包会被及时的发送。 这是linux内核发送软中断的机制,IMQ就是利用了这个机制,不同点在于:正常的发送队列是将数据包发送给网卡驱动,而IMQ队列是将数据包发送给okfn函数。

简述单内核操作系统及其优缺点

简述单内核操作系统及其优缺点 单内核也叫集中式操作系统。整个系统是一个大模块,可以被分为若干逻辑模块,即 处理器管理、存储器管理、设备管理和文件管理,其模块间的交互是通过直接调用其他模 块中的函数实现的。 优点: 单内核模型以提高系统执行效率为设计理念,因为整个系统是一个统一的内核,所以 其内部调用效率很高。 缺点: 单内核的缺点也正是由于其源代码是一个整体而造成的,通常各模块之间的界限并不 特别清晰,模块间的调用比较随意,所以进行系统修改或升级时,往往“牵一发而动全身”,导致工作量加大,使其难于维护。 补充:1.微内核操作系统及其优缺点 微内核是指把操作系统结构中的内存管理、设备管理、文件系统等高级服务功能尽可 能地从内核中分离出来,变成几个独立的非内核模块,而在内核只保留少量最基本的功能,使内核变得简洁可靠,因此叫微内核。 微内核实现的基础是操作系统理论层面的逻辑功能划分。几大功能模块在理论上是相 互独立的,形成比较明显的界限,其优点如下: · 充分的模块化,可独立更换任一模块而不会影响其他模块,从而方便第三方开发、设计模块。 · 未被使用的模块功能不必运行,因而能大幅度减少系统的内存需求。 · 具有很高的可移植性,理论上讲只需要单独对各微内核部分进行移植修改即可。 由于微内核的体积通常很小,而且互不影响,因此工作量很小。 不出:2.操作系统其它两种内核系统简述 外内核 外内核系统,也被称为纵向结构操作系统,是一种比较极端的设计方法。 外内核这种内核不提供任何硬件抽象操作,但是允许为内核增加额外的运行库,通过 这些运行库应用程序可以直接地或者接近直接地对硬件进行操作。它的设计理念是让用户

读Linux内核源代码

Linux内核分析方法 Linux的最大的好处之一就是它的源码公开。同时,公开的核心源码也吸引着无数的电脑爱好者和程序员;他们把解读和分析Linux的核心源码作为自己的最大兴趣,把修改Linux源码和改造Linux系统作为自己对计算机技术追求的最大目标。 Linux内核源码是很具吸引力的,特别是当你弄懂了一个分析了好久都没搞懂的问题;或者是被你修改过了的内核,顺利通过编译,一切运行正常的时候。那种成就感真是油然而生!而且,对内核的分析,除了出自对技术的狂热追求之外,这种令人生畏的劳动所带来的回报也是非常令人着迷的,这也正是它拥有众多追随者的主要原因: ?首先,你可以从中学到很多的计算机的底层知识,如后面将讲到的系统的引导和硬件提供的中断机制等;其它,象虚拟存储的实现机制,多任务机制,系统保护机制等等,这些都是非都源码不能体会的。 ?同时,你还将从操作系统的整体结构中,体会整体设计在软件设计中的份量和作用,以及一些宏观设计的方法和技巧:Linux的内核为上层应用提供一个与具体硬件不相关的平台; 同时在内核内部,它又把代码分为与体系结构和硬件相关的部分,和可移植的部分;再例如,Linux虽然不是微内核的,但他把大部分的设备驱动处理成相对独立的内核模块,这样减小了内核运行的开销,增强了内核代码的模块独立性。 ?而且你还能从对内核源码的分析中,体会到它在解决某个具体细节问题时,方法的巧妙:如后面将分析到了的Linux通过Botoom_half机制来加快系统对中断的处理。 ?最重要的是:在源码的分析过程中,你将会被一点一点地、潜移默化地专业化。一个专业的程序员,总是把代码的清晰性,兼容性,可移植性放在很重要的位置。他们总是通过定义大量的宏,来增强代码的清晰度和可读性,而又不增加编译后的代码长度和代码的运行效率; 他们总是在编码的同时,就考虑到了以后的代码维护和升级。甚至,只要分析百分之一的代码后,你就会深刻地体会到,什么样的代码才是一个专业的程序员写的,什么样的代码是一个业余爱好者写的。而这一点是任何没有真正分析过标准代码的人都无法体会到的。 然而,由于内核代码的冗长,和内核体系结构的庞杂,所以分析内核也是一个很艰难,很需要毅力的事;在缺乏指导和交流的情况下,尤其如此。只有方法正确,才能事半功倍。正是基于这种考虑,作者希望通过此文能给大家一些借鉴和启迪。 由于本人所进行的分析都是基于2.2.5版本的内核;所以,如果没有特别说明,以下分析都是基于i386单处理器的2.2.5版本的Linux内核。所有源文件均是相对于目录/usr/src/linux的。 方法之一:从何入手 要分析Linux内核源码,首先必须找到各个模块的位置,也即要弄懂源码的文件组织形式。虽然对于有经验的高手而言,这个不是很难;但对于很多初级的Linux爱好者,和那些对源码分析很

计算机操作系统(第四版)1-8章 课后答案(全)

第一章操作系统引论 1.设计现代OS的主要目标是什么?答:方便性,开放性,有效性,可扩充性 2.OS的作用可表现在哪几个方面?答:OS作为用户与计算机硬件系统之间的接口;OS作为计算机系统资的管理者;OS实现了对计算机资源的抽象。 3.为什么说操作系统实现了对计算机资源的抽象?答:OS首先在裸机上覆盖一层1/0设备管理软件,实现了对计算机硬件操作的第一层次抽象;在第一层软件上再覆盖文件管理软件,实现了对硬件资源操作的第二层次抽象。0s通过在计算机硬件上安装多层系统软件,增强了系统功能,隐藏了对硬件操作的细节,由它们共同实现了对计算机资源的抽象。 4·说明推动分时系统形成和发展的主要动力是什么?答:主要动力是提高资源利用率和系统吞吐里,为了满足用户对人一机交互的需求和共享主机。 5.何谓脱机I/O和联机I/O?答:脱机1/0是指事先将装有用户程序和数据的纸带或卡片装入纸带输入机或卡片机,在外围机的控制下,把纸带或一片上的数据或程序输入到殖带上。该方式下的输入输出由外围机控制完成,是在脱离主机的情况下进行的。而耽机1/0方式是指程序和数据的輸入输出都是在主机的直接控制下进行的。 6.试说明推动分时系统形成和发展的主要动力是什么?答:推动分时系统形成和发展的主要动力是更好地满足用户的需要。主要表现在:CPU的分时使用缩短了作业的平均周转时间;人机交互能力使用户能直接控制自己的作业;主机的共享使多用户能同时使用同一台计算机,独立地处理自己的作业。 7.实现分时系统的关键问题是什么?应如何解决?答:关键问题是当用户在自己的终端上键入命令时,系统应能及寸接收并及时处理该命令,在用户能接受的时采内将结果返回给用户。解决方法:针对及时接收问题,可以在系统中设路多路卡,健主机能同时接收用户从各个终端上轮入的数据;为每个终端配路缓冲区,暂存用户捷入的命令或教据。针对反时处理问题,应便所有的用户作业都直接进入内存,并且为每个作业分配一个时间片,允许作业只在自己的时间片内运行,这样在不长的时间内,能使每个作业都运行一次。 8.为什么要引入实时OS?答:实时操作系统是指系统能及时响应外部事件的请求,在规定的时间内完成对该事件的处理,并控制所有实时任务协调一致地运行。引入实时OS是为了满足应用的需求,熏好地满足实时控制领域和实时信息处涯领域的需要。 9.什么是硬实时任务和款实时任务?试举例说明。答:硬实时任务是指系统必须满足任务对截止时间的要求,否则可能出现难以预测的结是。举例来说,运载火箭的控制等。软实时任务是指它的截止时间并不严格,偶尔错过了任务的截止时间,对系统产生的影响不大。举例:网页内容的更新、火车售票系统。 10.试从交互性、及时性以及可靠性方面,将分时系统与实时系统进行比较。答:(1)及时性:实时信息处理系统对实时性的要求与分时系统类似,都是以人所能受的等待时间来确定;而实时控制系统的及时性,是以控制对象所要求的开始截止时间或完成截止时间来确定的,一般为秒级到毫秒级,甚至有的要低于100微妙。(2)交互性:实时信息处理系统具有交互性,但人与系统的交互仅限于访问系统中某些特定的专用服务程序。不像分时系统那样能向终端用户提供数据和资源共享等服务。(3)可靠性:分时系统也要求系统可靠,但相比之下,实时系统则要求系统具有高度的可靠性。因为任何差错都可能带未巨大的经济损失,甚至是灾难性后,,所以在实时系统中,往往都采取了

操作系统复习题及答案

1操作系统概述自测题1 选择题 1.以下_____操作系统中的技术是用“时间”来换取“空间”的。 A.虚拟存储器 B.缓冲技术 C.SPOOLing技术 D.快表 2.设计实时操作系统必须首先考虑系统的______。 A.效率 B.可移植性 C.可靠性 D.使用的方便性 3.一个作业第一次执行时用了5min,而第二次执行时用了6min,这说明了操作系统的______特点。 A.并发性 B.共享性 C.虚拟性 D.不确定性 4.下述操作系统类型中,哪个操作系统一定是由多台计算机组成的系统? A.实时 B.批处理 C.分时 D.分布式 5.操作系统中,以下______采用了以“空间”换“时间”的技术。 A.终端技术 B.缓冲技术 C.通道技术 D.虚拟存储技术 6.按照所起的作用和需要的运行环境,操作系统属于_______。 A.支撑软件 B.用户软件 C.应用软件 D.系统软件 7.操作系统的主要功能是存储器管理、设备管理、文件管理、用户接口和 ______。 A.进程管理 B.用户管理 C.信息管理 D.操作系统管理 8.操作系统的最基本的两个特征是资源共享和_______。 A.多道程序设计 B.程序的并发执行 C. 中断 D.程序顺序执行 9.采用多道程序设计技术可以提高CPU和外部设备的______。

A.稳定性 B.可靠性 C.利用率 D.兼容性 10.在计算机系统中,操作系统是_______。 A.处于裸机之上的第一层软件 B.处于硬件之下的底层软件 C.处于应用软件之上的系统软件 D.处于系统软件之上的用户软件 11.操作系统是对_____进行管理的软件。 A.软件 B.硬件 C.计算机资源 D.程序 12.从用户的观点,操作系统是______。 A.用户与计算机之间的接口 B.控制和管理计算机资源的软件 C.合理地组织计算机工作流程的软件 D.是扩充裸机功能的软件,是比裸机功能更强、使用方便的虚拟机 13.操作系统的基本类型是_____。 A.批处理系统、分时系统和多任务系统 B.实时系统、分时系统和批处理系统 C.单用户系统、多用户系统和批处理系统 D.实时系统、分时系统和多用户系统 14.为了使系统中的所有用户都得到及时的响应,操作系统应该是___. A.实时系统 B.批处理系统 C.分时系统 D.网络系统 15.如果分时系统的时间片一定,那么____会使响应时间越长。 A.用户数越少 B.用户数越多 C.内存越少 D.内存越多 16._______类型的操作系统允许在一台主机上同时连接多台终端,多个用户可以通过多台终端同时交互地使用计算机。

Linux内核源代码阅读与工具介绍

Linux的内核源代码可以从很多途径得到。一般来讲,在安装的linux系统下,/usr/src/linux 目录下的东西就是内核源代码。另外还可以从互连网上下载,解压缩后文件一般也都位于linux目录下。内核源代码有很多版本,目前最新的版本是2.2.14。 许多人对于阅读Linux内核有一种恐惧感,其实大可不必。当然,象Linux内核这样大而复杂的系统代码,阅读起来确实有很多困难,但是也不象想象的那么高不可攀。只要有恒心,困难都是可以克服的。任何事情做起来都需要有方法和工具。正确的方法可以指导工作,良好的工具可以事半功倍。对于Linux内核源代码的阅读也同样如此。下面我就把自己阅读内核源代码的一点经验介绍一下,最后介绍Window平台下的一种阅读工具。 对于源代码的阅读,要想比较顺利,事先最好对源代码的知识背景有一定的了解。对于linux内核源代码来讲,基本要求是:⑴操作系统的基本知识;⑵对C语言比较熟悉,最好要有汇编语言的知识和GNU C对标准C的扩展的知识的了解。另外在阅读之前,还应该知道Linux内核源代码的整体分布情况。我们知道现代的操作系统一般由进程管理、内存管理、文件系统、驱动程序、网络等组成。看一下Linux内核源代码就可看出,各个目录大致对应了这些方面。Linux内核源代码的组成如下(假设相对于linux目录): arch这个子目录包含了此核心源代码所支持的硬件体系结构相关的核心代码。如对于X86平台就是i386。 include这个目录包括了核心的大多数include文件。另外对于每种支持的体系结构分别有一个子目录。 init此目录包含核心启动代码。 mm此目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下,如对应于X86的就是arch/i386/mm/fault.c。 drivers系统中所有的设备驱动都位于此目录中。它又进一步划分成几类设备驱动,每一种也有对应的子目录,如声卡的驱动对应于drivers/sound。 ipc此目录包含了核心的进程间通讯代码。 modules此目录包含已建好可动态加载的模块。 fs Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext2文件系统对应的就是ext2子目录。 kernel主要核心代码。同时与处理器结构相关代码都放在arch/*/kernel目录下。 net核心的网络部分代码。里面的每个子目录对应于网络的一个方面。 lib此目录包含了核心的库代码。与处理器结构相关库代码被放在arch/*/lib/目录下。

操作系统复习整理

一、三大操作系统的工作原理和任务(P7) 批处理(单道批处理和多道批处理)、分时、实时系统是三种基本的操作系统类型。 多道批处理:用户所提交的作业都先存放在外存并排成一个队列,该队列被称为“后备队列”;然后,由作业调度程序按一定的算法从后备队列中选择若干个作业调入内存,使它们共享CPU和系统中的各种资源。 优缺点:(1)资源利用率高;(2)系统吞吐量大;(3)平均周转时间长;(4)无交互能力 分时:多个用户分时使用主机,每一用户分得一个时间片,用完时间片后操作系统将处理机分给另一用户。使处理机能够及时响应用户请求。 实时:系统能及时响应外部事件的请求,在规定时间内完成对该事件的处理,并控制所有实时任务协调一致地的运行。 二、操作系统的四个主要特征:并发性(两个或多个事件在同一时间间隔内发生)、共享性、虚拟、异步性 三、什么是微内核?微内核的工作原理及工作模式?(27) (1)足够小的内核(2)基于客户/服务器模式(3)应用机制与策略分离原理(4)采用面向对象技术 优点:提高可扩展性、增强可靠性、可移植性强、提供对分布式系统支持、融入面向对象技术 四、什么是多道程序技术?(填空)在内存中放多道程序,使它们在管理程序的控制下相互穿插地运行。 五、操作系统主要功能:处理机管理功能、存储器、设备、文件 一、区别:进程和程序、进程和线程、用户级线程和核心级线程(估计考其中一个) 1、进程和程序(1)进程由程序段和数据段这两个部分组成,因此说进程与程序是紧密相关的。但从结构上看,进程实体中除了程序段和数据段外,还必须包含一个数据结构,即进程控制块PCB(进程存在标志)。(2)进程是程序的一次执行过程,因此是动态的;动态性还表现在进程由创建而产生、由调度而执行、由撤消而消亡,即它具有—定的生命周期。而程序则只是一组指令的有序集合,并可永久地存放在某种介质上,其本身不具有运动的含义,因此是静态的。(3)多个进程实体可同时存放在内存中并发地执行,其实这正是引入进程的目的。而程序(在没有为它创建进程时)的并发执行具有不可再现性,因此程序不能正确地并发执行。(4)进程是一个能够独立运行、独立分配资源和独立接受调度的基本单位。而因程序(在没有为它创建进程时)不具有PCB,所以它是不可能在多道程序环境下独立运行的。(5)进程与程序不—一对应。 3、用户级线程和核心级线程(1)内核支持线程即核心级线程。它们是依赖于内核的,即无论是用户进程中的线程,还是系统进程中的线程,它们的创建、撤消、切换都由内核实现。(2)用户级线程,对于这种线程的创建、撤消、和切换,都不用系统调用来实现。内核并不知道用户级线程的存在。 进程特征:动态()独立()异步()并发(指多个进程实体同存于内存中,且能在一段时间内同时运行) 二、进程的状态转换的条件三状态:就绪状态、执行状态、阻塞状态五状态:创建、就绪、阻塞、执行、终止 七状态:创建、终止、执行、活动就绪、静止就绪、活动堵塞、静止堵塞 三、什么是信号量机制及作用 P操作对信号量进行减1操作和检查信号量 V操作对信号量进行加1操作和检查信号量 (1)Wait(P操作)/ wait(s){s.value = s.value -1 ;if (s.value < 0) block(S.L);} 2)Signal(V操作)signal(s){s.value = s.value +1;if (s.value < = 0) wakeup(S.L);} 记录型信号量:typedef struct{int value;struct process_control_block*list;}semaphore;wait(semaphore*s) {S->value--;if(->value<0)block(S->list);}signal(semaphore*s){S->value++;if(S->value<=0)wakeup(S->list)} 四、什么是原语?列举不少于6个原语原语就是由若干条指令组成的,用于完成一定功能的一个过程,他们是原子操作,对于操作中的所有操作要么全做,要么全不做,原语执行过程中不允许中断。 原语举例:阻塞原语block 唤醒原语wakeup 挂起原语suspend 激活原语active AND型信号量集P原语为Swait AND型信号量集V原语为Ssignal Send 原语Receive原语 临界资源:一次仅允许一个进程访问的共享资源临界区:每个进程中访问临界资源的那段程序称为临界区,每次只准许一个进程进入临界区,进入后不允许其他进程进入。 五、进程通讯方式共享存储器系统管道通讯系统消息传递系统:直接通信方式;间接通信方式。客户机-服务器系统 三种调度(填空题)作业调度:后备队列上的作业进入内存,创建进程,分配资源并进入就绪队列。也称为作业调度或长程调度,一般在批处理系统中有作业调度中级调度:为了提高内存利用率和系统吞吐量。涉及进程在内外存间的交换从存储器资源管理的角度来看,把进程的部分或全部换出到外存上,可为当前运行进程的执行提供所需内存空间。进程调度:也称微观调度、进程调度,从处理机资源分配的角度来看,处理机需要经常选择就绪进程或线程进入运行状态。由于低级调度算法的频繁使用,要求在实现时做到高效低级调度分两种方式:抢占、非抢占 三、死锁:一组进程中,每个进程都无限等待被该组进程中另一进程所占有的资源,因而永远无法得到该资源,这种现象称为进程死锁。产生死锁四个必要条件:互斥条件:涉及的资源是非共享的。不剥夺条件:不能强行剥夺进程拥有的资源。请求和保持(部分分配)条件:进程在等待一新资源时继续占有已分配的资源。环路条件:存在一种进程的循环链,链中的每一个进程已获得的资源同时被链中的下一个进程所请求。 处理死锁的四个基本方法:预防死锁:避免死锁:检测死锁:解除死锁:

linux源代码分析实验报告格式

linux源代码分析实验报告格式

Linux的fork、exec、wait代码的分析 指导老师:景建笃 组员:王步月 张少恒 完成日期:2005-12-16

一、 设计目的 1.通过对Linux 的fork 、exec 、wait 代码的分析,了解一个操作系统进程的创建、 执行、等待、退出的过程,锻炼学生分析大型软件代码的能力; 2.通过与同组同学的合作,锻炼学生的合作能力。 二、准备知识 由于我们选的是题目二,所以为了明确分工,我们必须明白进程的定义。经过 查阅资料,我们得知进程必须具备以下四个要素: 1、有一段程序供其执行。这段程序不一定是进程专有,可以与其他进程共用。 2、有起码的“私有财产”,这就是进程专用的系统堆栈空间 3、有“户口”,这就是在内核中有一个task_struct 结构,操作系统称为“进程控制 块”。有了这个结构,进程才能成为内核调度的一个基本单位。同时,这个结构又 是进程的“财产登记卡”,记录着进程所占用的各项资源。 4、有独立的存储空间,意味着拥有专有的用户空间:进一步,还意味着除前述的 系统空间堆栈外,还有其专用的用户空间堆栈。系统为每个进程分配了一个 task_struct 结构,实际分配了两个连续的物理页面(共8192字节),其图如下: Struct task_struct (大约1K) 系统空间堆栈 (大约7KB )两个 连续 的物 理页 面 对这些基本的知识有了初步了解之后,我们按老师的建议,商量分工。如下: 四、 小组成员以及任务分配 1、王步月:分析进程的创建函数fork.c ,其中包含了get_pid 和do_fork get_pid, 写出代码分析结果,并画出流程图来表示相关函数之间的相互调用关系。所占工作 比例35%。 2、张少恒:分析进程的执行函数exec.c,其中包含了do_execve 。写出代码分析结 果,并画出流程图来表示相关函数之间的相互调用关系。所占工作比例35% 。 3、余波:分析进程的退出函数exit.c,其中包含了do_exit 、sys_wait4。写出代码 分析结果,并画出流程图来表示相关函数之间的相互调用关系。所占工作比例30% 。 五、各模块分析: 1、fork.c 一)、概述 进程大多数是由FORK 系统调用创建的.fork 能满足非常高效的生灭机制.除了 0进程等少数一,两个进程外,几乎所有的进程都是被另一个进程执行fork 系统调 用创建的.调用fork 的进程是父进程,由fork 创建的程是子进程.每个进程都有一

相关文档
相关文档 最新文档