网易云课堂学习:
在实验楼的学习中,这次的实验是利用mykernel实验模拟计算机硬件平台
首先进入linux-3.9.4,
$cd LinuxKernel/linux-3.9.4
如下图所示
接下来是利用如下命令执行
$qemn -kernel arch/x86/boot/bzImage
结果如图所示
进入mykernel,查看文件,结果如图所示
进入mymain.c,如图所示
前面是头文件,该函数是整个操作系统的入口,my-start-kernel,之前都是硬件初始化的操作,if循环是执行10万次打印一次,也可以修改if的条件使打印更慢一些
接下来进入myinterrupt.c
同样前面是头文件,每次时钟中断都调用一次printk()输出,进入时钟中断的处理入口都由linux内核代码处理好了,这里只需要在时钟中断的中断发生时进行操作
模拟硬件平台的工作包括初始化的动作就完成了。
进程切换:
处理器总处于以下状态中的一种:
1、内核态,运行于进程上下文,内核代表进程运行于内核空间;
2、内核态,运行于中断上下文,内核代表硬件运行于内核空间;
3、用户态,运行于用户空间。
所谓的“进程上下文”,就是一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈上的内容,当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。
一个进程的上下文可以分为三个部分:用户级上下文、寄存器上下文以及系统级上下文。
用户级上下文: 正文、数据、用户堆栈以及共享存储区;
寄存器上下文: 通用寄存器、程序寄存器(IP)、处理器状态寄存器(EFLAGS)、栈指针(ESP);
系统级上下文: 进程控制块task_struct、内存管理信息(mm_struct、vm_area_struct、pgd、pte)、内核栈
内核可以处于两种上下文:进程上下文和中断上下文。在系统调用之后,用户应用程序进入内核空间,此后内核空间针对用户空间相应进程的代表就运行于进程上下文。异步发生的中断会引发中断处理程序被调用,中断处理程序就运行于中断上下文。中断上下文和进程上下文不可能同时发生。
当发生进程调度时,进行进程切换就是上下文切换(context switch).操作系统必须对上面提到的全部信息进行切换,新调度的进程才能运行。而系统调用进行的是模式切换(mode switch)。模式切换与进程切换比较起来,容易很多,而且节省时间,因为模式切换最主要的任务只是切换进程寄存器上下文的切换。
参见:http://blog.csdn.net/yapian8/article/details/41809837
进程管理:
下图是进程状态转换图
TASK_RUNNING(运行)—进程是可执行的。
TASK_INTERRURUPTIBLE(可中断)—进程正在睡眠(也就是说它被阻塞),等待某些条件的达成。
TASK_UNINTERRUPTIBLE(不可中断)—除了就算是接收信号也不会被唤醒或准备投入运行外,这个状态与可打断状态相同。
TASK_TRACED—被其他进程跟踪的进程。
TASK_STOPPED(停止)—进程停止执行。