Linux init/main.c 初始化中硬件中断向量初始化 trap_init()

本文详细介绍了Linux内核的启动过程,包括关键的内存分配、设备初始化及中断处理机制。特别关注了/init/main.c文件中的核心初始化流程,以及/kernel/traps.c中的中断向量表设置。

/init/main.c部分代码

void main(void) /* This really IS void, no error here. */ { /* The startup routine assumes (well, ...) this */ /* * Interrupts are still disabled. Do necessary setups, then * enable them */ ROOT_DEV = ORIG_ROOT_DEV; drive_info = DRIVE_INFO; memory_end = (1<<20) + (EXT_MEM_K<<10); memory_end &= 0xfffff000; if (memory_end > 16*1024*1024) memory_end = 16*1024*1024; if (memory_end > 12*1024*1024) buffer_memory_end = 4*1024*1024; else if (memory_end > 6*1024*1024) buffer_memory_end = 2*1024*1024; else buffer_memory_end = 1*1024*1024; main_memory_start = buffer_memory_end; #ifdef RAMDISK main_memory_start += rd_init(main_memory_start, RAMDISK*1024); #endif mem_init(main_memory_start,memory_end); trap_init(); blk_dev_init(); chr_dev_init(); tty_init(); time_init(); sched_init(); buffer_init(buffer_memory_end); hd_init(); floppy_init(); sti(); move_to_user_mode(); if (!fork()) { /* we count on this going ok */ init(); }

trap_init()函数位置 /kernel/traps.c

void trap_init(void) { int i; //设置系统的硬件中断 中断位于kernel/asm.s 或 system_call.s set_trap_gate(0,÷_error);//0中断,位于/kernel/asm.s 19行 set_trap_gate(1,&debug); set_trap_gate(2,&nmi); set_system_gate(3,&int3); /* int3-5 can be called from all */ set_system_gate(4,&overflow); set_system_gate(5,&bounds); set_trap_gate(6,&invalid_op); set_trap_gate(7,&device_not_available); set_trap_gate(8,&double_fault); set_trap_gate(9,&coprocessor_segment_overrun); set_trap_gate(10,&invalid_TSS); set_trap_gate(11,&segment_not_present); set_trap_gate(12,&stack_segment); set_trap_gate(13,&general_protection); set_trap_gate(14,&page_fault); set_trap_gate(15,&reserved); set_trap_gate(16,&coprocessor_error); for (i=17;i<48;i++) set_trap_gate(i,&reserved); set_trap_gate(45,&irq13); outb_p(inb_p(0x21)&0xfb,0x21); outb(inb_p(0xA1)&0xdf,0xA1); set_trap_gate(39,¶llel_interrupt); }

set_trap_gate()函数位于/include/asm/system.h

//n为中断向量号,addr中断程序的偏移地址 //&idt[n]对应中断号在中断描述符表中的偏移值 //中断描述符的类型是 14,特权级是 0。 #define set_trap_gate(n,addr) / _set_gate(&idt[n],15,0,addr) //设置中断宏函数 //参数:gate_addr -描述符地址;type -描述符中类型域值;dpl -描述符特权层值;addr -偏移地址 // %0 - (由 dpl,type 组合成的类型标志字);%1 - (描述符低 4 字节地址); // %2 - (描述符高 4 字节地址);%3 - edx(程序偏移地址 addr);%4 - eax(高字中含有段选择符)。 #define _set_gate(gate_addr,type,dpl,addr) / __asm__ ("movw %%dx,%%ax/n/t" / "movw %0,%%dx/n/t" / "movl %%eax,%1/n/t" / "movl %%edx,%2" / : / : "i" ((short) (0x8000+(dpl<<13)+(type<<8))), / "o" (*((char *) (gate_addr))), / "o" (*(4+(char *) (gate_addr))), / "d" ((char *) (addr)),"a" (0x00080000))

__start: .align 16 syncp jr32 _vd_g_StartupCpuStart /* NR,RESET : 0x000 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* NR,SYSERR : 0x010 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* NR,Undefined : 0x020 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* FE,FETRAP : 0x030 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* EI,TRAP0 : 0x040 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* EI,TRAP1 : 0x050 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* FE,RIE : 0x060 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* EI,FPP/FPI : 0x070 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* FE,UCPOP : 0x080 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* FE,MIP/MDP : 0x090 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* FE,PIE : 0x0A0 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* NR,Debug : 0x0B0 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* FE,MAE : 0x0C0 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* NR,Reserved : 0x0D0 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* NR,FENMI : 0x0E0 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* FE,FEINT : 0x0F0 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* EI,EIINT 00 : 0x100 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* EI,EIINT 01 : 0x110 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* EI,EIINT 02 : 0x120 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* EI,EIINT 03 : 0x130 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* EI,EIINT 04 : 0x140 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* EI,EIINT 05 : 0x150 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* EI,EIINT 06 : 0x160 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* EI,EIINT 07 : 0x170 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* EI,EIINT 08 : 0x180 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* EI,EIINT 09 : 0x190 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* EI,EIINT 10 : 0x1A0 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* EI,EIINT 11 : 0x1B0 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* EI,EIINT 12 : 0x1C0 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* EI,EIINT 13 : 0x1D0 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* EI,EIINT 14 : 0x1E0 */ .align 16 syncp jr32 _vd_s_StartupCpuReset /* EI,EIINT 15 : 0x1F0 */
最新发布
09-30
/* * Copyright 2021-2025 HPMicro * SPDX-License-Identifier: BSD-3-Clause */ ENTRY(_start) STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000; HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 64K; FLASH_SIZE = DEFINED(_flash_size) ? _flash_size : 1M; NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 512K; MEMORY { XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = 1024k ILM (wx) : ORIGIN = 0x00000000, LENGTH = 128K DLM (w) : ORIGIN = 0x00200000, LENGTH = 128K AXI_SRAM (wx) : ORIGIN = 0x01200000, LENGTH = 256K AHB_SRAM (w) : ORIGIN = 0xF0200000, LENGTH = 32k } __nor_cfg_option_load_addr__ = ORIGIN(XPI0) + 0x400; __boot_header_load_addr__ = ORIGIN(XPI0) + 0x1000; __app_load_addr__ = ORIGIN(XPI0) + 0x3000; __boot_header_length__ = __boot_header_end__ - __boot_header_start__; __app_offset__ = __app_load_addr__ - __boot_header_load_addr__; SECTIONS { .nor_cfg_option __nor_cfg_option_load_addr__ : { KEEP(*(.nor_cfg_option)) } > XPI0 .boot_header __boot_header_load_addr__ : { __boot_header_start__ = .; KEEP(*(.boot_header)) KEEP(*(.fw_info_table)) KEEP(*(.dc_info)) __boot_header_end__ = .; } > XPI0 .start __app_load_addr__ : { . = ALIGN(8); KEEP(*(.start)) } > XPI0 __vector_load_addr__ = ADDR(.start) + SIZEOF(.start); .vectors : AT(__vector_load_addr__) { . = ALIGN(8); __vector_ram_start__ = .; KEEP(*(.vector_table)) KEEP(*(.isr_vector)) . = ALIGN(8); __vector_ram_end__ = .; } > ILM .fast : AT(etext + __data_end__ - __tdata_start__) { . = ALIGN(8); __ramfunc_start__ = .; *(.fast) /* RT-Thread Core Start */ KEEP(*context_gcc.o(.text* .rodata*)) KEEP(*port*.o (.text .text* .rodata .rodata*)) KEEP(*interrupt_gcc.o (.text .text* .rodata .rodata*)) KEEP(*trap_common.o (.text .text* .rodata .rodata*)) KEEP(*irq.o (.text .text* .rodata .rodata*)) KEEP(*clock.o (.text .text* .rodata .rodata*)) KEEP(*kservice.o (.text .text* .rodata .rodata*)) KEEP(*scheduler.o (.text .text* .rodata .rodata*)) KEEP(*trap*.o (.text .text* .rodata .rodata*)) KEEP(*idle.o (.text .text* .rodata .rodata*)) KEEP(*ipc.o (.text .text* .rodata .rodata*)) KEEP(*thread.o (.text .text* .rodata .rodata*)) KEEP(*object.o (.text .text* .rodata .rodata*)) KEEP(*timer.o (.text .text* .rodata .rodata*)) KEEP(*mem.o (.text .text* .rodata .rodata*)) KEEP(*mempool.o (.text .text* .rodata .rodata*)) /* RT-Thread Core End */ /* HPMicro Driver Wrapper */ KEEP(*drv_*.o (.text .text* .rodata .rodata*)) . = ALIGN(8); __ramfunc_end__ = .; } > ILM .text (__vector_load_addr__ + __vector_ram_end__ - __vector_ram_start__) : { . = ALIGN(8); *(.text) *(.text*) *(.rodata) *(.rodata*) *(.srodata) *(.srodata*) *(.hash) *(.dyn*) *(.gnu*) *(.pl*) KEEP(*(.eh_frame)) *(.eh_frame*) KEEP (*(.init)) KEEP (*(.fini)) . = ALIGN(8); /********************************************* * * RT-Thread related sections - Start * *********************************************/ /* section information for finsh shell */ . = ALIGN(4); __fsymtab_start = .; KEEP(*(FSymTab)) __fsymtab_end = .; . = ALIGN(4); __vsymtab_start = .; KEEP(*(VSymTab)) __vsymtab_end = .; . = ALIGN(4); . = ALIGN(4); __rt_init_start = .; KEEP(*(SORT(.rti_fn*))) __rt_init_end = .; . = ALIGN(4); /* section information for modules */ . = ALIGN(4); __rtmsymtab_start = .; KEEP(*(RTMSymTab)) __rtmsymtab_end = .; /* RT-Thread related sections - end */ /* section information for usbh class */ . = ALIGN(8); __usbh_class_info_start__ = .; KEEP(*(.usbh_class_info)) __usbh_class_info_end__ = .; } > XPI0 .rel : { KEEP(*(.rel*)) } > XPI0 PROVIDE (__etext = .); PROVIDE (_etext = .); PROVIDE (etext = .); .fast_ram (NOLOAD) : { KEEP(*(.fast_ram)) } > DLM .bss(NOLOAD) : { . = ALIGN(8); __bss_start__ = .; *(.bss) *(.bss*) *(.sbss*) *(.scommon) *(.scommon*) *(.dynsbss*) *(COMMON) . = ALIGN(8); _end = .; __bss_end__ = .; } > AXI_SRAM /* Note: the .tbss and .tdata section should be adjacent */ .tbss(NOLOAD) : { . = ALIGN(8); __tbss_start__ = .; *(.tbss*) *(.tcommon*) _end = .; __tbss_end__ = .; } > AXI_SRAM .tdata : AT(etext) { . = ALIGN(8); __tdata_start__ = .; __thread_pointer = .; *(.tdata) *(.tdata*) . = ALIGN(8); __tdata_end__ = .; } > AXI_SRAM .data : AT(etext + __tdata_end__ - __tdata_start__) { . = ALIGN(8); __data_start__ = .; __global_pointer$ = . + 0x800; *(.data) *(.data*) *(.sdata) *(.sdata*) KEEP(*(.jcr)) KEEP(*(.dynamic)) KEEP(*(.got*)) KEEP(*(.got)) KEEP(*(.gcc_except_table)) KEEP(*(.gcc_except_table.*)) . = ALIGN(8); PROVIDE(__preinit_array_start = .); KEEP(*(.preinit_array)) PROVIDE(__preinit_array_end = .); . = ALIGN(8); PROVIDE(__init_array_start = .); KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*))) KEEP(*(.init_array)) PROVIDE(__init_array_end = .); . = ALIGN(8); PROVIDE(__fini_array_start = .); KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*))) KEEP(*(.fini_array)) PROVIDE(__fini_array_end = .); . = ALIGN(8); PROVIDE(__ctors_start__ = .); KEEP(*crtbegin*.o(.ctors)) KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors)) KEEP(*(SORT(.ctors.*))) KEEP(*(.ctors)) PROVIDE(__ctors_end__ = .); . = ALIGN(8); KEEP(*crtbegin*.o(.dtors)) KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors)) KEEP(*(SORT(.dtors.*))) KEEP(*(.dtors)) . = ALIGN(8); __data_end__ = .; PROVIDE (__edata = .); PROVIDE (_edata = .); PROVIDE (edata = .); } > AXI_SRAM __fw_size__ = __data_end__ - __tdata_start__ + etext - __app_load_addr__; .heap(NOLOAD) : { . = ALIGN(8); __heap_start__ = .; . += HEAP_SIZE; __heap_end__ = .; } > DLM .framebuffer (NOLOAD) : { . = ALIGN(8); KEEP(*(.framebuffer)) . = ALIGN(8); } > AXI_SRAM .stack(NOLOAD) : { . = ALIGN(8); __stack_base__ = .; . += STACK_SIZE; . = ALIGN(8); PROVIDE (_stack = .); PROVIDE (_stack_in_dlm = .); PROVIDE( __rt_rvstack = . ); } > DLM .noncacheable.init : AT(etext + __data_end__ - __tdata_start__ + __ramfunc_end__ - __ramfunc_start__) { . = ALIGN(8); __noncacheable_init_start__ = .; KEEP(*(.noncacheable.init)) __noncacheable_init_end__ = .; . = ALIGN(8); } > DLM .noncacheable.bss (NOLOAD) : { . = ALIGN(8); KEEP(*(.noncacheable)) KEEP(*(.noncacheable.non_init)) KEEP(*(.noncacheable.non_init.*)) __noncacheable_bss_start__ = .; KEEP(*(.noncacheable.bss)) KEEP(*(.noncacheable.bss.*)) __noncacheable_bss_end__ = .; . = ALIGN(8); } > DLM .ahb_sram (NOLOAD) : { KEEP(*(.ahb_sram)) } > AHB_SRAM /* __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM); __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM); */ }
09-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值