大家看呃ks write的第一个成员。叫什么呢?叫header它的类型呢?叫dispatcher header,我之前跟大家提过了哈,只要你当前因为内核对象可能有很多,比如说进程。是一种内核对象线程,是一种内核对象互斥体,是一种内核对象事件,是一种内核对象等等。很多很多,那么只要是内核对象在内核中呢,都会对应一个结构体就跟进程这个内核对象,它有个进程的结构体呢叫?叫e process线程呢?有个e thread对吧?那么,这些结构体如果是以dispatch hander开头的,只要是以这个开头的。那么都可以称,为什么都可以称为等待对象?这个可等待对象呢?就有一个特点,只要是可等待对象就都可以用wait for single object。这个函数来等待它。那我们后边呢,有专题来讲解。我们继续看,那么在kthread的成员的18、1c和28这几个位置,大家可以看一下dt。case red.幺八。幺八幺c。还有二八这几个位置,这几个位置跟什么呢?跟一个线程零环的堆栈有关系,什么叫一个线程零环的堆栈,
kthread的结构体里边在6c的这个位置呢,也有一个基础的线程的优先级,大家知道这个进程结构体里边有一个优先级了,对吧?那这个呢,叫线程优先级,这个初始值呢,就是所属进程的这个这个值。所属进程的这个值是多少线程里边的这个值它就是多少,如果你要想改这个值呢,就可以通过kesetbaseprioritythread这种函数来重新设定。所以现在大家应该知道这种函数实际上修正的是什么,修正的就是这个kthread结构体里边的这个basepriority成员。那好了,我们再看70的位置,70的位置呢,叫weight block,weight block里边是一个数组,这个数组呢?有四个成员什么意思?大家都写过这个wait for singleobject这种函数对吧?当你的线程当你当你当你的线程里边,你在a线程里边。你调用了wait for single object或者wait for multiple object,等待了另外的一个一个内核对象,比如说是b对象。那okay了,你这个b对象呢,就会被记录到这个位置。那换句话说,我如果想看当前线程,一共等待了几个对象,我只要找到k three的70的位置看看这个_KWAIT_BLOCK里边的成员,我就知道你现在在等待谁。对吧,你在等待哪个对象?这是它七零的位置。然后e0的位置,我们已经很熟悉了,之前我们做API进流环的时候,大家已经了解过了e0,指向的是service table,就是指向系统服务表的基址。
k thread的134的这个位置叫trap frame,trap frame是干什么的?当我们的程序,当我们的线程执行的时候,从三环进到零环的时候。那三环原来的那些寄存器存在哪里了?对吧?都存到一个叫trap frame的一个结构体里了,那你想一想,我现在有十个线程,十个线程,一个结构体够吗?肯定不够啊,那肯定是一个线程,有需要有这样的一个结构体对吧?所以呢?k thread的幺三四的这个位置指向的实际上就是你当前线程自己的trap frame,这个里边这个结构体的作用就是保留当前线程进入零环时的三环的那些寄存器的值。幺四零的位置是先前模式,先切模式,我之前跟大家已经讲过了,对吧?就是某些内核函数呢,它会判断调用我的这个程序,调用我的这个线程是零环调用还是三环调用,通过什么来判断呢?就是通过这个先前模式。呃,看一下幺b0幺b0,它是一个双向链表,大家回想在进程结构体里边呢,有一个双向链表,这个双向链表呢,穿着当前操作系统里边所有活动中的进程。那么一个进程呢?可能有多个线程。那这个链表呢?就是它也是一个双向链表啊,这个双向链表就是圈着当前进程里边所有的线程。大家想一想呃,一个进程,我如果得到了进程结构体,就意味着我得到了,我已经知道了你这个进程里边到底有多少个线程了,对不对?我通过这块遍历一下。就可以了,看这个图: