Linux使用ftrace进行boottime跟踪

1. 简介 要使用ftrace进行boottime追踪,可以使用内核参数(bootargs)或者bootconfig来进行配置。 关键的函数如下: 1+-- start_kernel 2/// ... ... 3| +-- setup_arch 4| +-- setup_boot_config 5| | +-- get_boot_config_from_initrd 6| | +-- xbc_get_embedded_bootconfig 7| | +-- xbc_init /// 解析bootconfig,创建树 8| +-- setup_command_line 9/// ... ... 10| +--...

Linux中断子系统(二)domain注册

1. IRQ domain注册 中断控制器初始化的过程中,要向中断子系统注册irq domain。核心函数__irq_domain_add。 gic-v2使用irq_domain_create_linear,gic-v3则使用irq_domain_add_tree。 __irq_domain_add的实现在kernel/irq/irqdomain.c,逻辑并不复杂,主要就是申请struct irq_domain结构体和对各个成员进行赋值,细节可以自己分析。 1/// kernel/irq/irqdomain.c 2/** 3 * __irq_domain_add() - Allocate a new irq_domain data...

Linux中断子系统(三)设备中断注册

1. 设备中断注册 gic-v3的中断号划分在《IHI0069H_gic_architecture_specification.pdf》有所罗列: 前边介绍,在gic初始化时,已经使用了0-7号SGI来作为IPI。 对于设备中断,使用的是PPI和SPI。设备probe时调用irq_of_parse_and_map等函数,如timer_of_irq_init。会调用函数来向系统注册中断,常用函数有如下几个: 1/// include/linux/of_irq.h 2extern int of_irq_get(struct device_node *dev, int index); 3extern int...

Linux中断子系统(四)申请中断request_irq

1. 申请中断 __setup_irq是用于设置和注册中断的核心函数,它是request_threaded_irq等函数的内部实现。 1.1. irqaction handler和thread_fn是struct irqaction的两个重要成员,由程序员指定或在__setup_irq中自动设置, 在中断发生后的处理函数被调用。 1/// include/linux/interrupt.h 2/** 3 * struct irqaction - per interrupt action descriptor 4 * @handler: interrupt handler function 5 * @name: name of...

Linux中断子系统(五)中断处理

1. 中断入口 要处理中断,必须为handle_arch_irq赋值。 ARM64自己定义handle_arch_irq的实现。 1/// arch/arm64/kernel/irq.c 2void (*handle_arch_irq)(struct pt_regs *) __ro_after_init = default_handle_irq; 3void (*handle_arch_fiq)(struct pt_regs *) __ro_after_init = default_handle_fiq; 4 5int __init set_handle_irq(void (*handle_irq)(struct pt_regs...

Linux中断子系统(一)软硬件初始化

1. 简介 early_irq_init完成中断子系统软件部分初始化。 irqchip_init初始化中断控制器,向系统注册struct irq_domain。 2. 中断软件子系统初始化 early_irq_init初始化数组或树,用于保存virq到struct irq_desc的转换关系。 irq_to_desc用于将virq转换为struct irq_desc指针。 2.1. 线性映射 未定义CONFIG_SPARSE_IRQ时使用线性映射,使用数组实现,静态分配,支持的最大virq由NR_IRQS决定。 1struct irq_desc irq_desc[NR_IRQS]...

ARM64 Linux中断入口

1. 简介 ARM64中断入口相关的代码主要在arch/arm64/kernel/entry.S,启动过程中,会将中断向量表vectors的起始虚拟地址写入到VBAR_EL1。 当发生中断或者异常时,硬件会保存一些寄存器,然后就是软件的工作: 进入中断后,根据中断原因,跳转到对应的中断处理函数,这部分是汇编实现。 在中断处理函数中,先通过kernel_entry将寄存器压栈,然后将栈空间记录的struct pt_regs传递给C语言的对应中断处理函数。 完成中断处理后,根据中断发生的异常等级,决定是调用ret_to_user还是ret_to_kernel退出中断,这两个hasn’t都是对汇编代码kernel_exit的封装。...

Linux fork进程/线程简介

1. kernel_clone kernel_clone是内核创建进程/线程的核心函数,如下功能都是通过调用kernel_clone实现的。 kernel_thread:创建内核进程 user_mode_thread:创建1号进程,1号进程的回调函数先是内核态的kernel_init,之后通过execve切换到用户进程 fork和clone系统调用:创建用户进程/线程 kernel_clone主要流程是copy_process函数实现task_struct结构的创建和初始化,而后通过wake_up_new_task将新进程/线程加入运行队列,并唤醒。详细流程见源码注释。 1/// kernel/sched/core.c 2/* 3...