本文示例以linux-5.10.16为参考。 当Linux发生异常时,会跳转到异常向量表处,执行对应的异常处理函数。异常向量的入口位于arch/arm64/kernel/entry.S 中,如下: SYM_CODE_START 其实就是将其后面()里面的字符展开而已,并在这个展开之前加上一些属性(比如对齐规则),展开后就相当于"vectors:",表示定义vectors函数,“...
b primary_entry // branch to kernel start, magic .quad 0 // Image load offset from start of RAM, little-endian le64sym _kernel_size_le // Effective size of kernel image, little-endian ... SYM_CODE_START(primary_entry) bl preserve_boot_args bl init_kernel_el // w0=cpu_boot_mode ...
AI代码解释 SYM_CODE_START(ret_from_fork)bl schedule_tail cbz x19,1f// not a kernel threadmov x0,x20 blr x191:get_current_task tsk b ret_to_userSYM_CODE_END(ret_from_fork) 刚fork的进程,从cpu_switch_to的ret指令执行后返回,lr加载到pc。 于是执行到ret_from_fork:这里首先调用schedule_tai...
*/.pushsection".entry.text","ax".align11SYM_CODE_START(vectors)kernel_ventry1,sync_invalid// Synchronous EL1tkernel_ventry1,irq_invalid// IRQ EL1tkernel_ventry1,fiq_invalid// FIQ EL1tkernel_ventry1,error_invalid// Error EL1tkernel_ventry1,sync// Synchronous EL1h ///linux异常向量入口,这里...
Linux内核启动-从入口到start_kernel 目录 1. 内核启动要求 2. 内核启动入口 3. 概览:从入口到start_kernel 4. MMU开启之前:primary_entry 4.1. preserve_boot_args 4.2. init_kernel_el 4.2.1. init_el1 4.3. set_cpu_boot_mode_flag 4.4. __create_page_tables ...
SYM_CODE_START_LOCAL_NOALIGN(el0_irq) kernel_entry0el0_irq_naked:el0_interrupt_handler handle_arch_irq b ret_to_user //返回用户态 SYM_CODE_END(el0_irq) /* go on */ret_to_user:disable_daif ldr x1, [tsk, #TSK_TI_FLAGS]andx2, x1, #_TIF_WORK_MASK ...
SYM_CODE_START(irq_entries_start) vector=FIRST_EXTERNAL_VECTOR .rept NR_EXTERNAL_VECTORS UNWIND_HINT_IRET_REGS0 : .byte 0x6a, vector jmp asm_common_interrupt nop /* Ensure that the above is 8 bytes max */ 。 = 0b + 8 vector = vector+1 .endrSYM_CODE_END(irq_entries_start) linux...
SYM_CODE_START(primary_entry) 1. 2. 下面正式进入Linux单步运行环境; 首先,启动Linux对软硬件的需求如下: AI检测代码解析 /* * Kernel startup entry point. * --- * * The requirements are: * MMU = off, D-cache = off, I-cache = on or off, * x0 = physical address to the FDT...
Linux存在众多 tracing tools,比如 ftrace、perf,他们可用于内核的调试、提高内核的可观测性。众多的工具也意味着繁杂的概念,诸如 tracepoint、trace events、kprobe、eBPF 等,甚至让人搞不清楚他们到底是干什么的。本文尝试理清这些概念。 注入Probe 的机制
if (sym_addr) { return sym_addr; } } return 0; } 通过上一步的find_symbol函数,可以得到dlopen的函数地址,模拟调用dlopen函数,设置栈空间将要加载的so库绝对路径写入栈地址,调用dlopen加载so库到目标地址中。 int inject_code(pid_t pid, unsigned long dlopen_addr, char *libc_path) ...