掌握信号量的实现与应用 FAQ 二、实验内容 互斥:EPOS运行于单CPU的计算机上,内核可以用开关中断实现互斥。中断的开关由EFLAGS中的IF位决定,使用指令sti令IF=1,中断打开,指令cli令IF=0,中断关闭。但一般不直接用sti/cli,而是用函数save_flags_cli(flags)来保存EFLAGS的值到一个变量flags中,然后设置IF=0,使用函数restore_flags(flags)把变量flags的值恢复到EFLAGS中。 线程的睡眠和唤醒:睡眠函数void sleep_on(struct wait_queue **head),其中参数head是睡眠队列的头指针的指针;唤醒函数void wake_up(struct wait_queue **head, int n),其中参数n表示要唤醒的线程个数,n小于0表示唤醒该队列中的所有线程。需要注意的是sleep_on和wake_up必须在关中断环境中运行,即用save_flags_cli/restore_flags保护。 信号量的实现:编辑文件kernel/sem.c,实现四个函数int sys_sem_create(int value)、int sys_sem_destroy(int semid)、int sys_sem_wait(int semid)、int sys_sem_signal(int semid),把这四个函数做成系统调用,分别是sem_create/destroy/wait/signal。 具体步骤如下:
三、使用仪器、材料 编译器、链接器、调试器 GCC、LD、GDB PC模拟器(虚拟机) Qemu |
四、实验过程原始记录(数据、图表、计算等)
|