- 博客(44)
- 收藏
- 关注
原创 使TLB的所有项失效 --- __flush_tlb_all()
# define __flush_tlb_all() do ...{ if (cpu_has_pge) __flush_tlb_global(); else
2007-01-16 16:04:00
3531
原创 switch_mm()
switch_mm()进行用户空间的切换,更确切地说,是切换地址转换表(pgd),由于pgd包括进程系统空间(0xc000 0000 ~ 0xffff ffff)和用户空间(0x0000 0000 ~ 0xbfff ffff)的地址映射,但是由于所有进程的系统空间的地址映射都是相同的。所以实质上就是进行用户空间的切换。 每个进程都有其自身的页目录表pgd 读者也许会问:进程
2007-01-16 10:03:00
7618
1
原创 alloc_bootmem_low_pages()
从ZONE_DMA分配x数量的字节#define alloc_bootmem_low_pages(x) __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, 0)void * __init __alloc_bootmem_node (pg_data_t *pgdat, unsigned long size, unsig
2007-01-15 17:21:00
2850
原创 one_page_table_init()
pagetable_init() --> kernel_physical_mapping_init() --> one_page_table_init()one_page_table_init(pmd_t *pmd)初始化pmd索引的页表项(将该项索引的物理页面的首地址填写到pmd中),并返回pmd索引的物理页面的首地址(线性地址)static pte_t * __init one_pag
2007-01-15 17:14:00
1964
原创 one_md_table_init()
直接返回pgd所指向的页目录表项static pmd_t * __init one_md_table_init(pgd_t *pgd){ pud_t *pud; pmd_t *pmd_table;#ifdef CONFIG_X86_PAE pmd_table = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE); set_pgd(p
2007-01-15 17:04:00
4442
原创 pgd_index()
pgd_index(PAGE_OFFSET)pgd_index(0xC0000000) = 768根据线性地址address,计算该地址所对应的页目录表项:#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))#define PGDIR_SHIFT 22#define PTRS_PER_P
2007-01-15 16:58:00
4259
原创 pfn_pte()
pfn_pte(pfn, prot)根据prot加工第pfn物理页所对应的页表项内容#define pfn_pte(pfn, prot) __pte(((pfn) #define PAGE_SHIFT 12#define pgprot_val(x) ((x).pgprot)
2007-01-15 16:49:00
3420
原创 set_pte()
将pteval写入pteptr所指的页表项中:#define set_pte(pteptr, pteval) (*(pteptr) = pteval)
2007-01-15 16:44:00
3668
原创 kernel_physical_mapping_init()
pagetable_init() --> kernel_physical_mapping_init()static void __init kernel_physical_mapping_init(pgd_t *pgd_base){ unsigned long pfn; pgd_t *pgd; pmd_t *pmd; pte_t *pte; int pgd_idx,
2007-01-15 16:40:00
3666
2
原创 pagetable_init()
pagetable_init()根据物理内存初始化页目录项及页表项static void __init pagetable_init (void)...{ unsigned long vaddr; pgd_t *pgd_base = swapper_pg_dir;#ifdef CONFIG_X86_PAE int i; //初始化整个页目录项(1024项)
2007-01-15 16:36:00
3497
原创 paging_init()
当RAM小于896MB时,初始化主内核页全局目录表--最终内核页表void __init paging_init(void){#ifdef CONFIG_X86_PAE set_nx(); if (nx_enabled) printk("NX (Execute Disable) protection: active/n");#endif初始化页目录表的高256项及其所对应
2007-01-15 16:32:00
2564
原创 preempt_count()
#define preempt_count() (current_thread_info()->preempt_count)#define PREEMPT_ACTIVE 0x1000000000001 0000 0000 0000 0000 0000 0000 0000 (2)struct thread_info { ... __s32 preempt_count
2007-01-13 09:46:00
2714
原创 NS_MAX_SLEEP_AVG; JIFFIES_TO_NS; MAX_SLEEP_AVG
纳秒级最长睡眠时间为1000 000 000nsNS_MAX_SLEEP_AVG = 1000 * 1000 000 = 1000 000 000ns--------------------------------------#define NS_MAX_SLEEP_AVG (JIFFIES_TO_NS(MAX_SLEEP_AVG))将TIME个滴答转化为纳秒(ns) TIME * 1ms
2007-01-13 09:44:00
2356
原创 list_del()
从entry所在的双向链表中将entry删除:static inline void list_del(struct list_head *entry)...{ __list_del(entry->prev, entry->next); entry->next = LIST_POISON1; entry->prev = LIST_POISON2;}/**//
2007-01-12 20:04:00
7853
原创 dequeue_task()
将进程p从优先级数组array(优先级数组array的某个元素[array->queue + p->prio]所代表的优先级队列)中删除;查看[array->queue + p->prio]所代表的优先级队列中是否还有活跃进程,如果没有将要清除优先级位图bitmap[]static void dequeue_task(struct task_struct *p, prio_array_t
2007-01-12 17:53:00
2662
原创 requeue_task()
将进程p从优先级数组array(优先级数组array的某个元素[array->queue + p->prio]所代表的优先级队列) 中删除,并将其插入该队列的尾部static void requeue_task(struct task_struct *p, prio_array_t *array)...{ list_move_tail(&p->run_list, array->que
2007-01-12 17:48:00
1523
原创 __list_del()
将prev和next之间的list_head从链表中删除:static inline void __list_del(struct list_head * prev, struct list_head * next)...{ next->prev = prev; prev->next = next;} +--prev
2007-01-12 17:36:00
2703
原创 list_add_tail()
将new所代表的list_head插入head所索引的队列的尾部static inline void list_add_tail(struct list_head *new, struct list_head *head)...{ __list_add(new, head->prev, head);}将new所代表的list_head插入到next索引的双链表(next索引双
2007-01-12 17:29:00
33643
原创 NICE_TO_PRIO
用nice计算static_prio:#define NICE_TO_PRIO(nice) (MAX_RT_PRIO + (nice) + 20)#define MAX_RT_PRIO MAX_USER_RT_PRIO#define MAX_USER_RT_PRIO 100
2007-01-12 17:24:00
1849
原创 task_timeslice()
根据进程p的静态优先级static_prio计算该进程的时间片(根据下面公式计算时间片)static inline unsigned int task_timeslice(task_t *p)...{ if (p->static_prio NICE_TO_PRIO(0)) return SCALE_PRIO(DEF_TIMESLICE*4, p->static_pri
2007-01-12 17:20:00
2336
原创 TASK_PREEMPTS_CURR
如果进程p动态优先级高于当前进程current的动态优先级,则返回true,否则返回falseprio小的动态优先级高#define TASK_PREEMPTS_CURR(p, rq) ((p)->prio (rq)->curr->prio)
2007-01-12 17:08:00
1033
原创 set_bit()
将addr的第nr位置为1 假设*addr = 0, nr = 3;则执行结果为1000(二进制数)extern __inline__ int set_bit(int nr,long * addr)...{ int mask, retval; addr += nr >> 5; //(1) mask = 1 (nr & 0x1f);
2007-01-12 14:59:00
16662
2
原创 resched_task()
设置进程p的thread_info中的flag域的TIF_NEED_RESCHED位,表示该进程需要调用调度程序执行进程切换static inline void resched_task(task_t *p)...{ set_tsk_need_resched(p);}static inline void set_tsk_need_resched(struct task
2007-01-12 11:28:00
3972
原创 smp_processor_id()
unsigned int smp_processor_id(void){ unsigned long preempt_count = preempt_count(); int this_cpu = __smp_processor_id(); cpumask_t this_mask; if (likely(preempt_count)) goto out;
2007-01-12 11:07:00
9115
原创 cpus_equal()
检测该进程当前所在处理器是否可以执行该进程,如果可以则返回1,否则返回0#define cpus_equal(src1, src2) __cpus_equal(&(src1), &(src2), NR_CPUS)static inline int __cpus_equal(const cpumask_t *src1p, const cpumask_t *src
2007-01-12 11:01:00
1510
原创 cpumask_of_cpu()
根据处理器编号cpu,将处理器位图的相应位置置为1(其它位为0)#define cpumask_of_cpu(cpu) /({ / typeof(_unused_cpumask_arg_) m; / if (sizeof(m) ==
2007-01-12 10:59:00
5838
原创 activate_task()
更新唤醒进程p的平均睡眠时间sleep_avg和动态优先级prio;记录该进程唤醒前的睡眠状态;将该进程插入活跃优先级数组static void activate_task(task_t *p, runqueue_t *rq, int local){ unsigned long long now; now = sched_clock();如果目标CPU不是本地CPU,就要补偿本地时钟器
2007-01-12 09:53:00
2884
原创 context_switch( )
context_switch( )上下文切换: 调用switch_mm(),把虚拟内存从一个进程映射切换到新进程中 调用switch_to(),从上一个进程的处理器状态切换到新进程的处理器状态。这包括保存、恢复栈信息和寄存器信息 The context_switch( ) function sets up the address space of next.
2007-01-11 11:30:00
7284
1
原创 硬件文境的切换 -- __switch_to()
struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct task_struct *next_p){ struct thread_struct *prev = &prev_p->thread, *next = &next_p->thread;通过当前进程next的t
2007-01-11 11:11:00
3679
原创 硬件文境
为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复执行以前挂起的某个进程。这种行为被称为进程切换(process switch)、任务切换或者文境切换。 To control the execution of processes, the kernel must be able to suspend the execution of the process runn
2007-01-10 19:48:00
2301
原创 获取当前进程描述符地址 -- current
在内核代码中当需要访问当前进程的task_struct结构时使用的指针current实际上是个宏定义,它是根据当前进程的堆栈指针ESP计算出来的。#define current get_current()static inline struct task_struct * get_current(void)...{ return current_thread_info
2007-01-10 16:43:00
4226
原创 switch_to
switch_to()负责从上一个进程的处理器状态切换到新进程的处理器状态15 #define switch_to(prev,next,last) do { 16 unsigned long esi,edi; 17
2007-01-10 12:17:00
3894
1
原创 sched_info_depart()
进程t即将失去CPU控制权汇总进程t占用CPU的时间总和;进程t所在runqueue占用CPU的时间总和static inline void sched_info_depart(task_t *t)...{ struct runqueue *rq = task_rq(t); unsigned long diff = jiffies - t->sched
2007-01-10 11:00:00
1285
原创 sched_info_switch()
进程prev和进程next切换前更新各自的sched_info:static inline void sched_info_switch(task_t *prev, task_t *next){ struct runqueue *rq = task_rq(prev); if (prev != rq->idle) sched_info_depart(prev); if
2007-01-10 10:53:00
1818
原创 sched_info_arrive()
进程t即将获得CPU控制权汇总进程t在可执行队列上所等候时间的综合;更新进程t获得CPU控制权的时间戳static inline void sched_info_arrive(task_t *t){ unsigned long now = jiffies, diff = 0; struct runqueue *rq = task_rq(t); if (t->sched_info.
2007-01-10 10:47:00
1278
原创 task_rq(p)
task_rq(p) 获取进程p所在的runqueue的首地址--------------------------------------------#define task_rq(p) cpu_rq(task_cpu(p))#define cpu_rq(cpu) (&per_cpu(runqueues, (cpu)))task_cpu(p) 获取进程p所在CPU的编号----
2007-01-10 10:36:00
3588
原创 更新平均睡眠时间和动态优先级 -- recalc_task_prio( )
schedule()片段进程next被唤醒后(唤醒前处于TASK_INTERRUPTIBLE状态),现在已经被schedule()选中即将投入运行,在得到CPU控制权之前需要重新计算其sleep_avg和prio: if (!rt_task(next) && next->activated > 0) ...{ unsigned long long d
2007-01-09 14:27:00
2853
原创 计算动态优先级 -- effective_prio()
effective_prio()函数返回进程p的动态优先级static int effective_prio(task_t *p){ int bonus, prio;如果进程p是个实时进程,那么直接返回该实时进程的prio(实时进程的动态优先级prio不依赖于静态优先级static_prio,两者是否相等???)|----------------------------|| if (rt
2007-01-09 11:57:00
2925
原创 rt_task(p)
#define rt_task(p) ( (p)->prio MAX_RT_PRIO )实时优先级范围从0到MAX_RT_PRIO减1。默认情况下,MAX_RT_PRIO为100,所以默认的实时优先级范围是从0到99。SCHED_NORMAL级进程的nice值共享了这个取值空间;它的取值范围是从MAX_RT_PRIO到(MAX_RT_PRIO+40)。也就是说,在默认情况下,nice值从-20到+
2007-01-09 11:34:00
2692
原创 MAX_PRIO MAX_RT_PRIO
MAX_PRIO = 140#define MAX_PRIO (MAX_RT_PRIO + 40) MAX_RT_PRIO = 100#define MAX_RT_PRIO MAX_USER_RT_PRIO #define MAX_USER_RT_PRIO 100
2007-01-09 11:14:00
3146
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人