- 论坛徽章:
- 0
|
/*mem init */
setup_arch()->prom_init()->prom_meminit()->add_memory_region()
add_memory_region 修改boot_mem_map
linux->arch->mips->init.c:
void __init bootmem_init(void) 根据 boot_mem_map 标记物理内存:
start_kernel()-->setup_arch()-->arch_mem_init()->bootmem_init 标记物理内存
boot_mem_map.nr_map记录所有内存
//MIPS 34K SMP_MT 模式
//init TC&VPE
start_kernel()->
rest_init()->kernel_init()->smp_prepare_cpus()->msmtc_prepare_cpus()
msmtc_prepare_cpus()->smtc_prepare_cpus()->
->emt(EMT_ENABLE); evpe(EVPE_ENABLE);
(/* Arm multithreading and enable other VPEs - but all TCs are Halted */)
/*启用各个CPU 并初始化后 进入idle*/
kernel_init->()smp_init()->cpu_up->_cpu_up _cpu_up->__cpu_up()->
msmtc_boot_secondary()->smtc_boot_secondary():
set "tc_restart:" register ->
head.s:smp_bootstrap()->start_secondary()->cpu_idle()
smtc_boot_secondary()->write_tc_c0_tcrestart()
|->write_tc_c0_tchalt()
//个TC优先级时间设置
TCSCHEDULE_MT_WRITE
#define TCSCHEDULE_MT_READ() mftc0(2,6)
#define TCSCHEDULE_MT_WRITE(val) mttc0(2,6,(val))
//except_vector
void __init trap_init(void)
{
.....
if (cpu_has_mipsmt)
//set_except_vector(25, handle_mt);
set_except_vector(25, smtc_thread_exception_handler);
smtc_thread_exception()->smtc_do_pending_irqs()->smtc_handle_pending_ipis()
->smp_call_function_interrupt()
//调度 schedule获取当前 cpu ID 选择process
schedule()->context_switch()->switch_to()
linux/include/asm-mips/system.h:
#define switch_to(prev,next,last)->
extern asmlinkage void *resume(void *last, void *next, void *next_ti);
(r4k_switch.s)
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/39383/showart_2106729.html |
|