Linux把thread_info(线程描述符)和内核态的线程堆栈存放在一起,这块区域通常是8192K(占两个页框),其实地址必须是8192的整数倍。 在linux/arch/x86/include/asm/page_32_types.h中, #define THREAD_SIZE_ORDER 1 #define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER) 出于效率考虑,内核让这8K空间占据连续...
简而言之就是,对于kernel thread,tsk->mm == NULL表示自己内核线程的身份,而tsk->active_mm是借用上一个用户进程的mm,用mm的page table来访问内核空间。对于用户进程,tsk->mm == tsk->active_mm。 为了支持这个特别,mm_struct里面引入了另外一个counter,mm_count。刚才说过mm_users表示这个进程地址空间被多少...
rss[mm_counter(page)]--; //进程的相关rss 做减1记账 page_remove_rmap(page,false); // page->_mapcount-- if(unlikely(page_mapcount(page) < 0)) print_bad_pte(vma, addr, ptent, page); if(unlikely(__tlb_remove_page(tlb, page))) { //将物理页记录到积聚结构中, 如果分配不到mmu_...
在进程开始运行是被赋为priority的值,以后每隔一个tick(时钟中断)递减1,减到0时引起新一轮调度。重新调度将从run_queue队列选出counter值最大的就绪进程并给予CPU使用权,因此counter起到了进程的动态优先级的作用(priority则是静态优先级)。(6)unsignedlongpolicy;该进程的进程调度策略,可以通过系统调用sys_sched_set...
(5) long counter; 在轮转法调度时表示进程当前还可运行多久。在进程开始运行是被赋为priority的值,以后每隔一个tick(时钟中断)递减1,减到0时引起新一轮调度。重新调度将从run_queue队列选出counter值最大的就绪进程并给予CPU使用权,因此counter起到了进程的动态优先级的作用(priority则是静态优先级)。
fpu_counter FPU使用计数 */ unsigned char fpu_counter; #ifdef CONFIG_BLK_DEV_IO_TRACE /* 11. btrace_seq blktrace是一个针对Linux内核中块设备I/O层的跟踪工具 */ unsigned int btrace_seq; #endif /* 12. policy policy表示进程的调度策略,目前主要有以下五种: 1) #define SCHED_NORMAL 0: 用于...
linux/arch/x86/include/asm/page_32_types.h中, #define THREAD_SIZE_ORDER 1 #define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER) 出于效率考虑,内核让这8K空间占据连续的两个页框并让第一个页框的起始地址是213的倍数。 内核态的进程访问处于内核数据段的栈,这个栈不同于用户态的进程所用的栈。
stack = 0xffff88022be9e000, usage = { counter = 2 }, flags = 2149613632...
long counter 任务运行时间计数(递减)(滴答数),运行时间片。 long priority 运行优先数。任务开始运行时counter = priority,越大运行越长。 long signal 信号。是位图,每个比特位代表一种信号,信号值=位偏移值+1。 struct sigaction sigaction[32] 信号执行属性结构,对应信号将要执行的操作和标志信息。
unsigned char fpu_counter; 1. (7)、 blktrace是一个针对Linux内核中块设备I/O层的跟踪工具。 1. #ifdef CONFIG_BLK_DEV_IO_TRACE unsigned int btrace_seq; #endif 1. 2. 3. (8)、RCU同步原语 1. #ifdef CONFIG_PREEMPT_RCU int rcu_read_lock_nesting; ...