2021-2022-1 20212803《Linux内核原理与分析》第九周作业
1.知识积累
硬中断与软中断
硬中断(Interrupt)就是CPU的两根引脚(可屏蔽中断和不可屏蔽中断)。CPU在执行每条指令后检测两根引脚的电平,如果是高电平,说明有中断请求,CPU就会中断当前程序的执行后去处理中断。一般类似时钟/键盘/硬盘等外设都是以这种方式与CPU进行信号传递的。
软中断(Exception)也被称为异常,其包括除零错误/系统调用/调式断点等在CPU执行指令过程中的发生的各种特殊情况统称为异常,异常会导致程序无法继续执行,而跳转到CPU预设的处理函数。
异常包括故障,退出,陷阱三种。
进程调度时机
1.schedule函数
Linux内核通过schedule函数实现进程调度,它在运行队列中找到一个进程,把CPU分配给它。所以调用该函数一次就是调度一次,调用该函数的时机就是进程调度的时机。
调用schedule函数的两种方法如下:
1.进程主动调用schedule(),如进程调用阻塞的系统调用等待外设或者主动睡眠。
2.松散调用,内核代码可以随时根据需要调用schedule使当前内核路径让出CPU。
2.上下文
一般来说,CPU在任何时刻都处于以下三种情况之一:
运行于用户空间,执行用户进程上下文
运行于内核空间,处于进程上下文
运行于内核空间,处理中断上下文
3.进程调度的时机
用户进程通过特定的系统调用主动让出CPU
中断处理程序在内核返回用户态时进行调度
内核线程主动调用schedule函数让出CPU
中断处理程序主动调用schedule函数让出CPU
2.实验过程
配置实验系统
cd ~/LinuxKernel
rm menu -rf
git clone git://github.com/mengning/menu.git
cd menu
make rootfs
开始调试
cd ..
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
新建shell,进行gdb调试
gdb
file linux-3.18.6/vmlinux
target remote:1234
b schedule
b context_switch
b switch_to
b pick_next_task
c
运行至schedule()函数处
运行至context_switch函数处。
pich_next_task函数负责根据调度策略和调度算法选择下一个进程。
3.实验总结
本次课程学习了操作系统如何进行进程的切换以及系统的一般执行过程。其中还是脱离不出中断的使用,进程切换最主要的时机就在于中断的过程,对关键函数switch_to的跟踪分析以及函数解读清晰地展示了堆栈如何变化的。
schedule()函数用来选择一个新的进程来运行,并调用context_switch()进行上下文的切换,这个宏调用switch_to()来进行关键上下文切换,其中pick_next_task()函数封装了进程调度算法。