Pintos源码学习进度(2)
1.Thread结构
在pintos中,仅有init thread存放在0x0000e000 ~ 0x0000efff空间之内。
其他的thread结构存放在1M空间之后.

2.Thread函数
thread_init (在init.c中调用)
①初始化tid_lock, read_list, all_list
(read_list用于存放状态为ready的thread,all_list存放所有的thread)
②创建init这一个线程,其结构存放在0x0000e000 ~ 0x0000efff之间。
(创建过程中调用init_thread()函数)
init_thread
①将thread的状态设置为block状态
②填入name,stack,priority,magic字段
③将allelem字段链入all_list链表中
thread_start (在init.c中调用)
①创建一个名为idle_started的信号量 (idle thread指的是,当没有线程正在运行时运行的线程)
②创建一个指向idle函数的idle thread。
③开启中断
④对idle_started信号量使用down.
(作用:虽然idle被创建,但idle线程有可能会晚于内核运行,而使用down信号可以保证
idle线程先运行)
thread_create
①为需要创建的thread分配一块page用于存放thread结构
②调用init_thread函数对thread的各个字段进行初始化
③为thread分配一个tid
④为thread创建kernel_thread_frame,switch_entry_frame,switch_threads_frame
(kernel_thread_frame是用于存放thread所对应的func函数与其参数的)
(switch_entry_frame是用于存放kernel_thread函数,用于调用func函数)
(switch_threads_frame是用于存放switch_entry函数,用于schedule)
这些thread_frame是用于第一次运行此进程而添加的.
thread_tick
(与时钟有关,等看了时钟再来看)
thread_block
①将current_thread的状态转化为block
②调用schedule函数
thread_unblock
①将thread.elem字段放入ready_list
②将thread的状态转化为ready
thread_yield
①将current_thread的状态从running转化为ready
②嗲用schedule函数