'전체 글'에 해당되는 글 54건

  1. 2009.10.02 [ cpu_init ] arch/arm/kernel/setup.c
  2. 2009.10.02 [ devicemaps_init ] arch/arm/mm/mmu.c
  3. 2009.10.02 [ bootmem_bootmap_pages ] mm/bootmem.c
struct stack {
    u32 irq[3];
    u32 abt[3];
    u32 und[3];
} ____cacheline_aligned;
static struct stack stacks[NR_CPUS];
CPU 갯수만큼 stacks 이 만들어 진다.
IRQ_MODE, ABT_MODE, UND_MODE 의 sp 를 지정한다.
irq[0] <- IRQ_MODE 의 sp 시작
irq[1]
irq[2]
abt[0] <- ABT_MODE 의 sp 시작
abt[1]
abt[2]
und[0] <- UND_MODE 의 sp 시작
und[1]
und[2]

[ setup_per_cpu_areas ] init/main.c
 
DEFINE_PER_CPU 로 정의된 것들이 컴파일 되면서, __per_cpu_start ~__per_cpu_end 사이의 영역에 들어간다.
DEFINE_PER_CPU(struct cpuinfo_arm, cpu_data);

[ smp_prepare_boot_cpu ] arch/arm/kernel/smp.c
 
cpu_data.idle = current 를 저장한다.

 
[ sched_init ] kernel/sched.c
 
cpu_rq(cpu) 는 해당 cpu의 struct rq자료를 리턴한다.  각 cpu 의 run queue 자료를 초기화 한다.
 
[ preempt_disable ] include/linux/preempt.h
 
CONFIG_PREEMPT 가 정의 되어 있어야 한다. 정의 되어 있지 않다면, preempt_disable , preempt_enable 는 빈 함수로 구현된다.
 
// include/linux/preempt.h
#define preempt_disable() \
do { \
    inc_preempt_count(); \
    barrier(); \
} while (0)
#define preempt_enable() \
do { \
    preempt_enable_no_resched(); \
    barrier(); \
    preempt_check_resched(); \
} while (0)
#define add_preempt_count(val) do { preempt_count() += (val); } while (0)
#define sub_preempt_count(val) do { preempt_count() -= (val); } while (0)
#define inc_preempt_count() add_preempt_count(1)
#define dec_preempt_count() sub_preempt_count(1)
#define preempt_count() (current_thread_info()->preempt_count)
 
[ build_all_zonelists ] mm/page_alloc.c
 
system_state = SYSTEM_BOOTING 이면
__build_all_zonelists(NULL); 를 호출한다.

 
[ sort_main_extable ] kernel/extable.c
 
섹션 __start___ex_table 부터 __stop___ex_table 에 까지 등록되어 있는 struct exception_table_entryinsn 값으로 정열한다.
struct exception_table_entry
{
    unsigned long insn, fixup;
};

[ trap_init ] arch/arm/kernel/traps.c
 
0xffff0000 에 __vectors_start 부터 __vectors_end  를 복사한다.
0xffff0000 + 0x200 에 __stubs_start 부터 __stubs_end 를 복사한다.
0xffff0000 + 0x1000 - kuser_sz 에 __kuser_helper_start 부터 kuser_sz 만큼 복사한다.
kuser_sz = __kuser_helper_end - __kuser_helper_start

'리눅스커널' 카테고리의 다른 글

[ kmem_cache_init ] mm/slab.c  (0) 2009.10.02
[ IRQ 처리 ]  (0) 2009.10.02
[ devicemaps_init ] arch/arm/mm/mmu.c  (0) 2009.10.02
[ bootmem_bootmap_pages ] mm/bootmem.c  (0) 2009.10.02
[ create_mapping ] arch/arm/mm/mmu.c  (0) 2009.10.02
Posted by blee
,
페이지 테이블에서 VMALLOC_END ~ 끝까지  영역을 0 으로 초기화 한다.
high-vectors ( 0xffff0000 ) 맵핑한다.
mdesc->map_io() 호출하여, device 맵핑한다.
SMDK2410 경우엔 smdk2410_map_io 호출한다.

swapper_pg_dir ( 0xC0004000 )

 offset   level 1 descriptor 
 0x000 * 4   0
  :   :
 0xF00 * 4 0x4a000452
 0xF01 * 4
0x48000452
 0xF02 * 4
0x4c000452
 0xF03 * 4 
0x4d000452
 0xF04 * 4 
0x50000452
 0xF05 * 4   0x51000452
 0xF06 * 4 
0
 0xF07 * 4 
0x53000452
  :  
 0xF64 * 4 
0x56000452
  :  
 0xFFE * 4 
0x30002031
 0xFFF * 4 0x30002431
 
[ free_area_init_node ] mm/page_alloc.c
contig_page_data 의 node_id, node_start_pfn 값을 설정하고
calculate_node_totalpages() 를 호출하여, node_spanned_pages, node_present_pages 값을 계산한다.
alloc_node_mem_map() 를 호출해서 page 배열을 할당하고, node_mem_map 에 시작 위치를 가리킨다.mem_map 값으로도 설정한다.
free_area_init_core() 를 호출하여, 각 page 들을 초기화 한다.
 
[ free_area_init_core ] mm/page_alloc.c
 
zone 를 초기화 한다.
 
[ devicemaps_init ] arch/arm/mm/mmu.c

vectors 를 bootmem 에서 PAGE_SIZE 만큼 할당 받는다.
페이지 테이블 0xffff0000 에 등록한다.
mdesc->map_io 를 호출한다.
MACHINE_START(INTEGRATOR, "ARM-Integrator")
    /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */
    .phys_io    = 0x16000000,
    .io_pg_offst    = ((0xf1600000) >> 18) & 0xfffc,
    .boot_params    = 0x00000100,
    .map_io     = ap_map_io,
    .init_irq   = ap_init_irq,
    .timer      = &ap_timer,
    .init_machine   = ap_init,
MACHINE_END

'리눅스커널' 카테고리의 다른 글

[ IRQ 처리 ]  (0) 2009.10.02
[ cpu_init ] arch/arm/kernel/setup.c  (0) 2009.10.02
[ bootmem_bootmap_pages ] mm/bootmem.c  (0) 2009.10.02
[ create_mapping ] arch/arm/mm/mmu.c  (0) 2009.10.02
[ bootmem_init_node ] arch/arm/mm/init.c  (0) 2009.10.02
Posted by blee
,
비트맵을 표시해 줄 page 몇 개가 필요한가?
 
[ find_bootmap_pfn ] arch/arm/mm/init.c
 부트맵이 위치할 pfn 를 찾는다. 

[ init_bootmem_core ] mm/bootmem.c
contig_bootmem_data 초기화 한다.
node_bootmem_map ( 부트맵 ) 을 모두 1 로 설정한다.

bootmem 할당
Posted by blee
,