Linux 0.11版 进程调度文本解说
0.11核中进程的调度主要由四个部分数组成:调度初始化、调度、睡眠、唤醒。
一、调度初始化:sched_init()
我们知道在内核初始化(main)过程中,要将任务0转换到用户态下执行,也就是建立Linux中的第一个用户程序。既然任务0之前是在内核态下执行的,所以用的是系统的ldt、和tss,要在用户态下执行,就要使用用户态下的ldt、tss,那么,调度初始化的其中一个任务就是建立任务0的ldt和gdt。下面说一下sched_init()的具体工作过程:
1)在gdt中设置ldt、gdt:ldt和gdt的定义在sched.h中。
2)将eflags中的NT置位:记得在前面关于任务切换的说明中,我提到在main的中sched_init()之后,要调用move_to_user_mode()实现核心态到用户态的转换,而在move_to_user_mode()中,最后调用了iret,如果将NT为0,就不会引起进程的切换了。
3)加载tss和ldt:手动加载仅这一次,以后都是通过任务的切换CPU自动加载的。在这里,因为是第一个用户任务,所以需要手动设置。
4)初始化8253定时器。
5)在IDT中设置时钟的中断门和系统调用的中断门。
二、调度:schedule()
这个函数的主要工作就是从所有处在就绪状态的进程中选择下一个要运行的进程。具体工作过程是这样的:它首先检查在处在可中断睡眠状态下的进程是否除了阻塞信号以外别的信号,如果存在,则将它置成就绪状态。然后循环检查任务数组中的所有处在就绪状态的任务,挑选出剩余执行时间值最大的一个任务,利用switch_to()函数切换到该任务。如果发现所有就绪进程的时间片都是0,则根据任务的优先级,重新计算每个任务的时间片,在重新执行循环检查所有就绪任务的执行剩余时间。
其中,这个函数的核心之一就是switch_to()函数,它能实现任务的切换,它的定义在sched.h中,主要原理就是利用如果ljmp的操作数是任务门描述符就会引起任务的切换。
三、睡眠sleep_on()、interruptible_sleep_on()
在接收这个函数的工作原理之前,先了解一个数据结构:等待队列。等待队列其
其实就是一个进程指针链表,所有由于等待同一个资源的睡眠进程组成一个等待队列。这个链表的连接并不是通常意义上
相关文档:
http://www.linuxjournal.com/
Linux Kernel Newbies
一方适合内核开发初级黑客的乐土——该网站几乎能够满足所有磨刀霍霍向内核的新手的需求。
http://kernelnewbies.org/
http://vger.kernel.org/
了解如何使用linux内核列表
http://www.tux.org/lkml/
Linux
新闻周刊,它有一个专区报道有关内核的重要 ......
linux网络连接配置通过命令ifconfig来完成,也就是interface configuration。
!!友情提醒:下面用的命令有些需要root权限
查看网络连接
ifconfig
eth0 Link encap:以太网 硬件地址 00:e0:61:02:af:ba
&n ......
Written by shine
on 2009, April 23, 12:29 PM. Linux
Webmin是目前功能最强大的基于Web的Unix系统管理工具。管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理动作。目前 Webmin支持绝大多数的Unix系统,这些系统除了各种版本的linux
以为还包括:AIX、HPUX、Solaris、Unixware、Irix 和FreeBSD等。
Webmin ......
Linux驱动程序入门—Hello World
来源:
ChinaUnix博客 日期:
2009.11.19 21:17 (共有0
条评论) 我要评论
1、引言
记得在学习VC++和C语言的时候,一开始都会以一个HELLO
WORLD的例子作为演示,将学者逐渐引入殿堂,这个几乎成了计算机编程语言学习必经的一个入门之路。
......
在现行的linux发布版本中,软件包管理工具使用最多的是rpm和dpkg,但是这两者都不能解决软件之间的依赖关系,所以又有了yum和apt,yum其实是对rpm的封装,而apt是对dkpg的封装,两者都在封装的同时,很好的解决了软件依赖问题,使用起来非常方便。下面是一些软件管理常用的命令:
更新软件列表:
......