- 博客(25)
- 收藏
- 关注
原创 【Linux内核|调试】Crash工具帮助信息PART 2
续【Linux内核|调试】Crash工具帮助信息PART 126. net - network command26.1. SYNOPSIS net [[-s | -S] [-xd] [-R ref] [pid | task]] [-a] [ -n [pid | task]] [-N addr]26.2. DESCRIPTION Displays various network related data. If no arguments are entered, the list of
2023-11-19 16:39:28
1790
原创 【Linux内核|启动】内核启动流程(一)head.S分析
1. 内核启动入口内核版本:linux-6.1根据Makefile对KBUILD_LDS的定义,链接vmlinux使用的连接脚本为 arch/$(SRCARCH)/kernel/vmlinux.lds,实际上这个脚本是在编译过程中生成的。从链接脚本 arch/arm64/kernel/vmlinux.lds可以查到,程序的入口为 _text,镜像起始位置存放的是 .head.text段生成的指令。OUTPUT_ARCH(aarch64)ENTRY(_text)SECTIONS{ . = ((
2023-06-22 17:12:43
1753
1
原创 U-Boot从dtb获取内存布局并传递到内核
在DDR控制器初始化完成之后,就要确定系统中有多少可用内存,这通常是由dram_init_banksize来实现的,而不同的板级文件会实现不同的dram_init_banksize,这也就决定了不同的板级可以定义不同的获取内存布局的方法。这里介绍一种从dtb中获取内存布局的实现,这可以通过简单的调用fdtdec_setup_memory_banksize来实现。
2023-06-20 00:16:44
784
原创 Exynos4412自制BL2
在官方提供的BL1或自制的BL1基础上,可以自制BL2。如果是使用U-Boot,编译时生成u-booot-spl.bin也是制作BL2的原材料。如果是自制的BL1,BL2可以根据BL1随心定制。如果是在官方提供的BL1基础上进行开发,BL2要求为16k,其中最后2k使用0填充。可执行文件的大下不能超过(14k-4)字节,其中14k的最后4个字节是存储校验值的。相较于BL1的校验值,BL2的校验简单的多,只是把前(14k-4)的内容按字节进行累加即可。
2023-06-04 18:30:12
143
原创 Exynos4412自制BL1
参考Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf,Exynos4412会自动把BL加载到0x0202_1400运行。所以BL1的入口地址需要设置为0x0202_1400,这样才能保证位置相关码可以正常执行。Exynos4412内部的BL0会对BL1进行校验,BL1的头部为16字节的校验码,这个校验码是根据头部之后,其余的(8k-16)字节的数据计算出来的,工具源码可以参考mkbl1。
2023-06-04 18:28:36
143
原创 Exynos4412启动介绍:BL1是8k还是15k
三星提供了一组从外部介质加载数据的函数,可以在BL1或BL2中直接使用,相关介绍在Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf。在启动时提供给SDMMC和eMMC的时钟是20Mhz,MPLL是这些时钟的源头。如果SDMMC和eMMC被选中为启动设备,那么iROM中SDMMC或eMMC拷贝函数在BL1和BL2阶段是可以使用的。如果你要使用这两函数,那么在使用前请不要修改SDMMC或eMMC的时钟。
2023-06-04 18:25:25
405
原创 【Linux内核|时间子系统】Linux时间子系统(二)timekeeping简介
可以对比一下,访问tkr_mono和tkr_raw时,用的是read_seqcount_begin和read_seqcount_retry,而访问tk_fast_mono和tk_fast_raw用的是raw_read_seqcount_latch和read_seqcount_latch_retry。除了tkr_mono和tkr_raw两个struct tk_read_base,linux内核还定义了两个struct tk_fast,tk_fast_mono和tk_fast_raw。
2023-04-08 17:16:47
1540
3
原创 【Linux内核|时间子系统】Linux时间子系统(一)简介
内核版本:linux-6.1时间功能定时器功能,有传统的定时器timer、高精度定时器hrtimer提供用于调度的tick,有周期tick和动态tick。
2023-04-08 16:21:06
2216
原创 【Linux】嵌入式学习环境快速搭建(二)一键编译、qemu模拟运行
Easing Embedded System Learning一键实现atf、optee、u-boot、kernel、rootfs的编译一键模拟运行支持多个源码版本尽量遵循官方说明的编译方法,编译过程和命令对用户可见
2022-12-24 21:12:33
697
原创 【git】合并git仓库并保留commit记录
将一个仓库的历史记录生成patch,再在另一个仓库中使用`git am`应用patch来实现合并仓库。
2022-11-30 23:07:25
1561
原创 【Linux内核|内存管理|ARM64】ARM64 PAGE_SIZE、VA_BITS、PGTABLE_LEVELS关系
基于linux-5.15分析。根据arch/arm64/Kconfig,ARM64的可配置的页面大小和虚拟地址位数只有几种组合可以选择,相应的页表级数也可由此得出。
2022-08-02 23:42:02
1213
原创 【Linux内核】printk日志输出格式控制
文章目录1. 说明2. 整数类型3. 指针类型4. 参考资料1. 说明根据内核文档整理而成,具体格式含义可查看内核文档,或点击如何获得正确的printk格式占位符(v5.15)或如何获得正确的printk格式占位符(latest)查看。linux-5.15相关内核文档路径如下:Documentation/core-api/printk-formats.rstDocumentation/translations/zh_CN/core-api/printk-formats.rst2. 整数类型
2022-05-25 20:47:43
1724
原创 【Linux内核】Linux的errno和ERR_PTR、PTR_ERR简介
文章目录1. Linux的errno和指针1.1. 整型和指针类型转换2. C语言中整型数据的存储和数据类型转换原理2.1. 负数的强制类型转换2.2. 强制数据类型降级3. 测试程序3.1. ARM测试结果3.2. ARM64测试结果1. Linux的errno和指针常见的Linux函数返回值类型包括整型和指针,内核中这两种返回值类型的函数会互相调用。Linux的errno为整型,为了与errno对应,Linux将指针分为3种:空指针:NULL,地址为0异常指针:地址空间的高255字节。0xff
2022-05-21 12:41:47
2241
1
原创 【Linux内核】pr_fmt介绍
文章目录1. pr_fmt2. 常用`pr_fmt`定义2.1. 打印模块名、函数名和行号2.2. 打印CPU号2.3. 打印线程pid和线程名2.4. 打印进程pid和进程名2.5. 打印进程pid和线程pid2.6. 大杂烩3. 常见pr_*()接口3.1. `pr_devel`和`pr_debug`1. pr_fmt在阅读Linux内核或其他开源代码时,在文件的开始部分,通常能看到类似如下代码。但是代码中又没有看到使用的地方。#define pr_fmt(fmt) KBUILD_MODNAME
2022-05-20 21:06:12
1913
原创 【C语言|函数|数组】多维数组作为函数参数
文章目录1. 方法一:传递数组2. 方法二:数组指针3. 方法三:多重指针4. 数组作为参数时可以用sizeof(a)或ARRAY_SIZE(a)来获取大小吗?1. 方法一:传递数组C语言对多维数组的存储是按照一维数组来处理的,数组的每个维度在内存中按顺序存储。所以将多维数组作为参数传递时,必须指定多维数组子维度的大小,否则函数无法得知每个子维度结束地址。第一维的长度可以指定,也可以不指定。void func1(int a1[], int x);void func2(int a2[][4], in
2022-05-19 22:50:10
2549
原创 【C语言|数组】数组a、&a、&a[0]、&a[0][0]的区别与联系
分别声明一个一维数组和二维数组,查看各个表达式的类型、地址、与首地址的差值,以及内存地址内存储的变量值。数组内变量的低8位记录数组的行号和列号,其中高4位为行,低4位为列。先看一下测试程序给出的结果。一维数组vartypeof(var)(void *)(var)offset*(int *)(var)a1int *0x7ffe2034d2d00x000x00&a1int (*)[8]0x7ffe2034d2d00x000x00&a1[0]int *0
2022-05-19 22:11:38
8767
原创 F2FS文件系统工具简介
1. F2FS工具安装1.1. apt安装在较新的Debian/Ubuntu系统上,可以直接使用apt命令安装。apt install f2fs-tools1.2. 源码安装https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs-tools.git1.2.1. 编译依赖libuuid-devel or uuid-devpkg-configautoconflibtoollibselinux1-dev1.2.2. 初
2022-05-17 22:31:05
5241
原创 EROFS文件系统工具简介
1. EROFS工具安装1.1. apt安装在较新的Debian/Ubuntu系统上,可以直接使用apt命令安装。apt install erofs-utils1.2. 源码安装https://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs-utils.git1.2.1. 编译依赖如果需要支持Lz4压缩,需要Lz4 1.8.0+,强烈建议Lz4 1.9.3+。1.2.2. 编译方法对于一些旧的lz4版本(lz4-1.8.0~1.8.
2022-05-17 22:29:14
5175
2
原创 【C语言|结构体】关于结构体初始化赋值
在GUN C中,支持通过标号元素来对指定结构体成员名进行初始化,这允许初始化值以任意顺序出现。在内核中对初始化时有如下代码。其中对进行了两次赋值,第一次是,而最后,又使用宏对其进行了赋值,那结果如何呢?请看如下测试代码:测试结果从测试结果来看,最终结果以最后一次赋值为准。...
2022-05-17 22:00:19
2105
原创 【C语言】关于三目运算简化写法 a ? : -1
在阅读U-Boot或Linux内核代码时,经常看到类似return err ? : -EINVAL;的代码,具体是什么意思呢?废话不多说,直接上测试代码。#include <stdio.h>#define __pr(x) printf("%-40s: %d\n", #x, x)int main(void){ int five = 5; int zero = 0; __pr(five ? : -1); __pr(five ? five : -
2022-05-17 21:50:29
326
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人