2021-2022-1 20212825 《Linux内核原理与分析》第九周作业

2021-2022-1 20212825 《Linux内核原理与分析》第九周作业

一.基础知识

1.硬中断

硬中断(Interrupt)就是CPU的两根引脚(可屏蔽中断和不可屏蔽中断)。CPU在执行每条指令后检测两根引脚的电平,如果是高电平,说明有中断请求,CPU就会中断当前程序的执行后去处理中断。一般类似时钟/键盘/硬盘等外设都是以这种方式与CPU进行信号传递的。

2.软中断

软中断是包括除零错误/系统调用/调式断点等在CPU执行指令过程中的发生的各种特殊情况,分为故障/退出/陷阱三种。
故障:即出现问题了,但可以恢复到当前指令,eg.除0错误、缺页中断
退出:出现了不可恢复的严重故障,只能退出程序,eg.例如连续发生故障
陷阱:程序主动产生的异常,在执行当前指令后发生,其实际上是程序自己要借用中断这种机制进行转移。

3进程调度时机

3.1 schedule函数
Linux内核通过schedule函数实现进程调度,它在运行队列中找到一个进程,把CPU分配给它。所以调用该函数一次就是调度一次,调用该函数的时机就是进程调度的时机。
调用schedule函数的两种方法如下:

进程主动调用schedule(),如进程调用阻塞的系统调用等待外设或者主动睡眠。
松散调用,内核代码可以随时根据需要调用schedule使当前内核路径让出CPU。

3.2 上下文
一般来说,CPU在任何时刻都处于以下三种情况之一:

运行于用户空间,执行用户进程上下文。
运行于内核空间,处于进程上下文。
运行于内核空间,处理中断上下文。

应用程序通过系统调用陷入内核,或者当外部设备产生中断时,抬高CPU中断引脚电平,CPU就会调用相应的中断处理程序来处理该中(包括系统调用),此时CPU处于中断上下文。
中断上下文代表当前进程执行,所以中断上下文中的get_current可获取一个指向当前进程的指针,是指向被中断进程或即将运行的就绪进程的,相应的硬件上下文件切换信息也存储于该进程的内核堆校中。由于中新的级别不同,有不可屏蔽中断、可屏蔽中断、陷阱(系统调用)、异常等。为了整个系统的运行效率,中断上下文中调用其他内核代码有一定的限制。

3.3 进程调度的时机
进程调度时机就是内核调用schedule 函数的时机。当内核即将返回用户空间时,内核会检查need_resched 标志是否设置。如果设置,则调用schedule 函数,此时是从中断(异常/系统调用)处理程序返回用户空间的时间点作为一个固定的调度时机点。
除了这个固定的调度时机点外。内核线程和中断处理程序中任何需要暂时中止当前执行路径的位置都可以直接调用schedule()。比如等待某个资源就绪。
总的来说,进程调度时机如下

用户进程通过特定的系统调用主动让出CPU。
中断处理程序在内核返回用户态时进行调度。
内核线程主动调用schedule函数让出CPU。
中断处理程序主动调用schedule函数让出CPU

4.linux系统架构与执行过程

在这里插入图片描述

二.运行过程

1.启动内核

cd ~/LinuxKernel
rm menu -rf
unzip menu-master.zip
cd menu-master
make rootfs  

在这里插入图片描述

2.调试gdb

cd ..
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s

在这里插入图片描述

gdb
file linux-3.18.6/vmlinux
target remote:1234

在这里插入图片描述

3.设置断点

b schedule
b pick_next_task
b context_switch
b switch_to

在这里插入图片描述

4.gdb跟踪schedule函数

在这里插入图片描述
在这里插入图片描述

三.总结

1.一般情况:正在运行的用户态进程X切换到运行用户态进程Y的过程

正在运行的用户态进程X
发生中断——save cs:eip/esp/eflags(current) to kernel stack,then load cs:eip(entry of a specific ISR) and ss:esp(point to kernel stack).
SAVE_ALL //保存现场
中断处理过程中或中断返回前调用了schedule(),其中的switch_to做了关键的进程上下文切换
标号1之后开始运行用户态进程Y(这里Y曾经通过以上步骤被切换出去过因此可以从标号1继续执行)
restore_all //恢复现场
iret - pop cs:eip/ss:esp/eflags from kernel stack
继续运行用户态进程Y

2.特殊情况 :
通过中断处理过程中的调度时机,用户态进程与内核线程之间互相切换和内核线程之间互相切换,与最一般的情况非常类似,只是内核线程运行过程中发生中断没有进程用户态和内核态的转换;
内核线程主动调用schedule(),只有进程上下文的切换,没有发生中断上下文的切换,与一般的情况略简略;
创建子进程的系统调用在子进程中的执行起点及返回用户态,如fork;
加载一个新的可执行程序后返回到用户态的情况,如execve;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值