自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 收藏
  • 关注

原创 使TLB的所有项失效 --- __flush_tlb_all()

# define __flush_tlb_all()                  do ...{                                        if (cpu_has_pge)                            __flush_tlb_global();               else                       

2007-01-16 16:04:00 3390

原创 switch_mm()

switch_mm()进行用户空间的切换,更确切地说,是切换地址转换表(pgd),由于pgd包括进程系统空间(0xc000 0000 ~ 0xffff ffff)和用户空间(0x0000 0000 ~ 0xbfff ffff)的地址映射,但是由于所有进程的系统空间的地址映射都是相同的。所以实质上就是进行用户空间的切换。 每个进程都有其自身的页目录表pgd 读者也许会问:进程

2007-01-16 10:03:00 5646 2

原创 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 2757

原创 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 1893

原创 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 4355

原创 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 4093

原创 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 3326

原创 set_pte()

将pteval写入pteptr所指的页表项中:#define set_pte(pteptr, pteval) (*(pteptr) = pteval) 

2007-01-15 16:44:00 3527

原创 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 3571 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 3365

原创 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 2513

原创 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 2620

原创 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 2283

原创 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 7703

原创 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 2575

原创 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 1455

原创 __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 2589

原创 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 33377

原创 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 1771

原创 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 2252

原创 TASK_PREEMPTS_CURR

如果进程p动态优先级高于当前进程current的动态优先级,则返回true,否则返回falseprio小的动态优先级高#define TASK_PREEMPTS_CURR(p, rq)     ((p)->prio  (rq)->curr->prio)

2007-01-12 17:08:00 1006

原创 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 16447 4

原创 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 3867 1

原创 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 8959

原创 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 1453

原创 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 5694

原创 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 2749

原创 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 7167 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 3564

原创 硬件文境

    为了控制进程的执行,内核必须有能力挂起正在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 2201

原创 获取当前进程描述符地址 -- 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 4125

原创 switch_to

switch_to()负责从上一个进程的处理器状态切换到新进程的处理器状态15 #define switch_to(prev,next,last) do {                                  16         unsigned long esi,edi;                                          17       

2007-01-10 12:17:00 3783 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 1206

原创 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 1741

原创 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 1203

原创 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 3485

原创 更新平均睡眠时间和动态优先级 -- 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 2743

原创 计算动态优先级 -- 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 2839

原创 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 2581 1

原创 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 3052

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除