linux
文章平均质量分 77
朝搴夕揽
这个作者很懒,什么都没留下…
展开
-
ARM64_HW_PGTABLE_LEVEL_SHIFT 宏的作用
所以,ARM64_HW_PGTABLE_LEVEL_SHIFT(4 - CONFIG_PGTABLE_LEVELS) 得到的其实是PGD, L0页表索引在64bit 虚拟地址所处的偏移量,即39。在 4K page 的情况下,因为pow(4, 12) = 4K,所以需要用bit11-0来表示某地址在该page中的偏移。比如四级页表,每级页表所占的bit 个数就是36/4 = 9,也就是下图所示的情况。设页表等级数 为n,那每级索引所占的bit个数就是36/n。原创 2023-07-18 08:50:48 · 203 阅读 · 0 评论 -
adrp 命令为何能获取符号的地址
adrp 在编译时,会记录label 地址与当前指令地址的offset。在运行时,pc + offset 就能得到label 的地址。又因为arm64 指令长度的限制,所以adrp 这条指令得到的地址仅仅精确到了label 所在的页的基地址,需要配合ADD 加上label 的lo12 位才能得到准确地址。原创 2023-01-14 22:02:08 · 934 阅读 · 0 评论 -
__pa_symbol 及str_l 解析
其作用是在内核物理内存的线性映射还没建立的时候,用来根据虚拟地址计算物理地址原创 2022-11-10 08:54:07 · 737 阅读 · 0 评论 -
static_branch_likely 原理及用法(完全剖析)
看irq-gic-v3.c时,发现中断回调中有static_branch_likely 这么一个函数。看起来是为了减少cpu 分支预测失败带来的巨大代价而做的优化。具体原理还没细看。内核源码中这里有个文档介绍 kernel/Documentation/static-keys.txt。...原创 2022-04-17 21:27:22 · 1565 阅读 · 1 评论 -
浅谈 arch_local_irq_save 及arm64 debug exceptions
追__raw_spin_lock_irqsave 代码时,发现了arch_local_irq_save 这个函数,顺便看了下这个函数static inline unsigned long arch_local_irq_save(void){ unsigned long flags; asm volatile( "mrs %0, daif // arch_local_irq_save\n" "msr daifset, #2" : "=r" (flags) : : "memory"原创 2022-03-16 09:55:46 · 784 阅读 · 0 评论 -
linux arm64 中断处理流程完整分析 (二)—— 中断处理流程c代码部分 以gic_v3 为例
本文以gic 为例,探索中断中断控制器的注册过程,以及相关中断处理流程。GIC V3 结构详细可以参考这个页面。这里只做简单介绍。/*drivers/irqchip/irq-gic-v3.c*/IRQCHIP_DECLARE(gic_v3, "arm,gic-v3", gic_of_init);gic_of_init(struct device_node *node, struct device_node *parent) "从dts中获取distributor,以及redistributor原创 2022-03-08 08:53:01 · 2982 阅读 · 0 评论 -
linux arm64 中断处理流程完整分析 (一)—— 中断向量表、中断处理流程汇编部分
中断流程老生常谈,但我一直以来也只是知道中断过来之后,会保护现场,跳到中断向量表,执行中断,恢复现场,然后返回。至于更多细节,就不得而知了。这篇文章旨在把更完整的linux 中断处理流程梳理一遍。主要带着以下几个问题:中断向量表是在代码哪里配置的响应中断时,必然有一些读写gic 寄存器的操作,这些操作在什么位置/proc/interrupts 这个proc 文件是如何实现的linux 进入中断前,会屏蔽其他所有中断,这个是如何实现的系统调用的系统中断0x80,是如何从用户态调用到内核态file_原创 2022-03-03 09:11:02 · 4022 阅读 · 0 评论 -
Android 编译框架下使用gcov 统计.so代码覆盖率
我的需求是在Android编译框架下,可执行程序需要在设备机中执行,而非宿主机。因此走了些弯路,这里记录一下。编译在相应的Andriod.mk 中添加如下CFLAGNATIVE_COVERAGE := trueLOCAL_STATIC_LIBRARIES += libgcovLOCAL_CFLAGS += -ftest-coverage -fprofile-arcsLOCAL_LDFLAGS += -ftest-coverage -fprofile-arcs结果解析运行后的.gcda 文件原创 2021-09-28 08:22:30 · 1261 阅读 · 0 评论 -
linux 内核启动串口log 等级配置
问题看kernel 代码的时候,总会重新烧内核,有时候乱改改挂了,但是发现串口启动log没有打出来,没法定位。于是乎想研究一下内核启动时的串口log 是如何控制的?什么情况下会都打出来,以及什么时候没有打印线索经高人指点,说看一下内核启动参数bootargs。于是在内核启动后,dmesg看了下,果然发现了个疑点,启动参数里有个quiet 选项。所以以此为线索看下内核是如何解析这个参数的。就从大名鼎鼎的start_kernel 开始找吧。/* 首先init/main.c中可以找到这么一个定义,看起原创 2021-07-17 22:18:02 · 1258 阅读 · 0 评论 -
dtb解析过程及platform_device 创建过程
目录内核解析dtb 文件,并构建树状devide_node 的过程platform_device 创建过程内核解析dtb 文件,并构建树状devide_node 的过程dtb被编译好传给内核之后,内核是如何解析的?解析的结果是什么?有必要追一下代码。/* 在 drivers/of/base.c 中,创建了一个全局的指针*/struct device_node *of_root;EXPORT_SYMBOL(of_root);/*drivers/of/fdt.c 看起来下边这个函数给of_root原创 2021-07-06 08:31:07 · 1818 阅读 · 1 评论 -
以spi_bus_type 为例梳理kobject. ktype, kset用法
spi_bus_type//bus_type 的定义如下struct bus_type spi_bus_type = { .name = "spi", .dev_groups = spi_dev_groups, .match = spi_match_device, .uevent = spi_uevent,};spi_dev_groups//这里是一个attribute group,应该对应在bus 目录下的一个个的文件static const struct attribute_原创 2021-07-01 08:55:47 · 384 阅读 · 0 评论 -
内核代码研读计划
主线任务1. 内核是如何从设备树将dev 解析并注册进内核,挂接到相应的bus上的支线任务1.原创 2021-06-08 08:41:22 · 80 阅读 · 0 评论 -
设备模型 kobj, ktype, kobj 笔记
参考《linux内核设计与实现》17.3 设备模型设备模型的意义首先要明确设备模型的意义何在,才知道内核搞这玩意是在干嘛。根据书里的介绍和我自己的理解,内核引入设备模型的目的如下:提供引用计数这一类的统一机制提供拓扑关系设备归类等等等,(其他的我还没get到)相关结构体kobjectstruct kobject { const char *name; struct list_head entry; struct kobject *parent; struct kset原创 2020-05-24 22:57:23 · 172 阅读 · 0 评论 -
在spi flash上使用的文件系统调研
1. spiffs以下摘自spiffs:Spiffs is a file system intended for SPI NOR flash devices on embedded targets.Spiffs is designed with following characteristics in mind:Small (embedded) targets, sparse RAM wi...原创 2020-02-27 10:13:05 · 624 阅读 · 0 评论 -
linux内核压缩方式调研
压缩的概念:vmlinux 是未压缩的内核,zImage 是压缩的相关工具:mkimage:为Linux内核和根文件系统添加头部的工作一般由编译bootloader时生成的一个小应用程序来完成,比如u-boot编译后会在其tools子目录下生成一个叫mkimage的应用程序。参考这里。内核压缩和解压缩代码都在目录kernel/arch/arm/boot/compressedlinux4....原创 2020-02-27 10:11:35 · 4514 阅读 · 0 评论 -
文件系统 与 根文件系统
文件系统关于文件系统的详细介绍,可以参考维基百科。如下是部分摘录和个人的理解:什么是文件系统计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上,只需要记住这个文件的所属目录和文件名。在写入新数...转载 2020-02-26 15:46:53 · 441 阅读 · 0 评论 -
(转)vmlinux uImage与zImage的区别
从下面的内核编译过程,可以看出vmlinux,arch/arm/boot/compressed/vmlinux, arch/arm/boot/Image, arch/arm/boot/zImage之间的区别LD vmlinux SYSMAP System.map SYSMAP .tmp_System.map OBJCOPY arch/arm/boot/Image ...转载 2020-02-25 16:41:34 · 285 阅读 · 0 评论 -
linux 软件版本切换命令 update-alternatives 使用心得
这真的是一个很好用的命令,合乎逻辑,操作简单。使用方法比如,我有两个版本的gcc及g++,分别在如下两个目录:/usr/bin/gcc-5/usr/bin/g++-5/usr/local/bin/gcc-7/usr/local/bin/g++-7首先将这两个版本都配置好,具体的用法参照这里。sudo update-alternatives --install /usr/bin/g...原创 2020-02-24 12:38:26 · 1503 阅读 · 0 评论 -
韦东山 jz2440 学习笔记 —— 内核启动流程分析(二)—— Makefile 分析
在如下文件中有详细的Makefile 说明书Makefile 文件分类简单概括吧,子目录下的Makefile 将当前目录组织起来,一般都是通过 obj-y += 这样的形式。同分析uboot 的Makefile 一样,在make 时加上 V=1 ,即make uImage V=1可以看编译时更详细的打印输出。找到输出vmlinux.o 处的语句,如下:arm-linux-ld -EL ...原创 2020-02-08 15:57:34 · 272 阅读 · 0 评论 -
韦东山 jz2440 学习笔记 —— 内核启动流程分析(一)—— 解压、打补丁、配置、编译
1. 解压、打补丁解压打补丁的操作同uboot 一致,可以参考这里。2. 配置2.1 配置的目的在编译内核前,在源码根目录下应有一个.config ,里边定义了许多宏,用来控制内核许多功能的开启与否。如下为一个 .config 文件的部分截图:如红框所示的 宏CONFIG_MMU 表示使用mmu 功能,在源码中搜索该宏,可以看到该宏控制着许多代码是否编译:2.2 配置方法由于li...原创 2020-02-07 22:19:07 · 473 阅读 · 0 评论 -
linux内核编译——记一次owner 导致的make问题
问题描述及解决方案系统环境:ubuntu16.04在编译内核时遇到如下问题:book@www.100ask.org:/work/system/linux2.6/linux-2.6.22.6$ make CHK include/linux/version.h/bin/sh: 1: cannot create include/linux/version.h.tmp: Permiss...原创 2020-02-07 21:56:22 · 482 阅读 · 0 评论