自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 资源 (1)
  • 收藏
  • 关注

原创 insmod过程

insmod过程模块加载与卸载众所周知,Linux下模块加载可以用insmod命令来完成,卸载模块通过rmmod命令来完成,比如下面,非常简单:那么第一个问题来了,模块是什么?模块文件那么接下来,我们就可以通过file命令来查看一下这个.ko文件到底是何方神圣,可以看到,此ko文件是一个ELF 32-bit LSB relocatable文件,ELF格式的,32-bit的,LSB小端,relocatable可重定位文件,此文件未stripped。可以看到,file命令非常好用,直接就知道了k

2021-10-22 23:05:23 1736 3

原创 模块生成过程

模块生成过程文章目录模块生成过程模块编译过程modpost`read_dump()/write_dump()`导入/导出符号信息`read_symbols()`从ELF文件中读取符号并记录`check_exports()`检查符号与GPL协议匹配情况生成.mod.c文件module-common.lds先看图:模块编译过程首先看一下普通外部模块编译的过程,这里用ldd3的某些驱动来演示,执行下面命令:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- M

2021-10-19 00:07:11 1540

原创 Linux blktrace跟踪块设备后使用fio回放过程

Linux blktrace跟踪块设备后使用fio回放过程文章目录Linux blktrace跟踪块设备后使用fio回放过程前提条件操作过程注:部分操作参考博文 Linux下Fio和Blktrace模拟块设备的访问模式 http://blog.yufeng.info/archives/1112前提条件内核需要支持:CONFIG_BLK_DEV_IO_TRACE=y,否则blktrace无法使用。busybox支持:losetup、mke2fs其他:blktrace、blkparse、fio操作

2021-07-26 20:07:07 1073

原创 hrtimer代码阅读

hrtimer代码阅读文章目录hrtimer代码阅读nanosleep系统调用nanosleep内核的实现hrtimer高精度定时器hrtimer相关数据结构函数流程阅读初始化定时器源执行延时操作设置回调函数唤醒回调函数移除定时器重新编程定时事件重新入队,编写下一次定时事件调度回来后取消定时器**中断唤醒**被中断后的收尾动作nanosleep系统调用这里的解释参见man手册。名字nanosleep – 高分辨率的休眠概要#include <time.h>int nanoslee

2021-07-09 15:40:15 618

原创 Linux uptime 命令

Linux uptime 命令文章目录Linux uptime 命令uptime 命令使用uptime实现过程sysinfo系统调用说明sysinfo系统调用实现过程--待填坑uptime 命令使用输入uptime --help,可以看到当前输出以下信息:Usage: uptime [options]Options: -p, --pretty show uptime in pretty format -h, --help display this help and exit

2021-07-08 15:34:14 640

原创 arm_arch_timer代码阅读

arm_arch_timer代码阅读文章目录arm_arch_timer代码阅读硬件中断以及设备树配置定时器初始化的简要过程获取时钟频率申请中断中断处理函数访问定时器的控制寄存器定时器的一些通用初始化读定时器计数值周期性时钟事件的注册画个图镇楼,凭空想象凭空捏造,有错请指出,我肯定会改。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PShcETXT-1624612409290)(pics/arm_arch_timer.png)]硬件中断以及设备树配置设备树配置:a

2021-06-25 17:22:49 3710

原创 arm64设备上运行gdb调试

arm64设备上运行gdb调试gdb编译gdb的编译这里是参考hisi提供的Makefile脚本进行交叉编译,这里就不过多描述了:服务器上进行调试这里准备了一个测试代码,test_call.c,在服务器上进行编译后,拷贝到设备上,就可以进行gdb调试了:aarch64-himix100-linux-gcc test_call.c -g -o test_call设备端运行gdbserver:(下面的xxx.xxx.xxx.xxx是设备的ip地址)./gdbserver xxx.xxx.xxx.

2021-03-06 15:33:25 1489

原创 mj-trace 代码分析

mj-trace 代码分析-(1)文章目录mj-trace 代码分析-(1)中间产物分析trace.[c/h/i]分析trace.i 分析定义的结构体定义的变量定义的函数变量与函数之间的关联编写的trace模块mj请参考文档《Linux内核增加一个trace.md》,接下来开始分析一下代码。内核有自带的sample,在路径samples/trace_events/下,代码相对来说比较长,可以使用下面命令进行编译以及生成预处理文件:make ARCH=arm64 CROSS_COMPILE=aarch

2021-03-06 12:15:44 459 3

原创 procps-ng交叉编译

procps-ng交叉编译procps-ng依赖ncurses,ncurses下载:https://invisible-mirror.net/archives/ncurses/ncurses交叉编译先创建一个目录,用来保存生成的成果物,--prefix指向这个目录的绝对路径:mkdir -p tmptar -xvf ncurses-6.0.tar.gz cd ncurses-6.0/./configure --host=aarch64-himix100-linux CPPFLAGS="-P"

2021-03-02 19:36:49 1382

原创 kallsyms 内核符号表

kallsyms 内核符号表文章目录kallsyms 内核符号表生成`kallsyms`脚本执行过程两次`kallsyms``vmlinux_link`过程三次`ld`程序运行过程读标准输入中的符号信息对`percpu`段内容进行修正寻找相对符号的基地址符号排序优化符号表生成token表字符串学习过程 -- 统计两个字符组合出现的频率生成best表 -- 统计单个字符是否有出现优化符号表算法压缩字符串写入符号表写入相对于基地址的数据写入符号表个数以及快速查找标记写入字符串查找表内核的`kallsyms`根

2021-01-27 19:28:57 5085 1

原创 watchdog阅读记录

watchdog文章目录watchdoglockup检测的初始化高精度定时器的初始化高精度定时器任务看门狗线程的初始化看门狗线程的任务sysctl控制参数总结watchdog的代码,大概是几个关键变量和两个关键任务:定时器任务更新定时器中断数定期器任务唤醒每CPU线程,每CPU线程进行软中断数更新以及时间戳更新定时器任务中根据时间戳判断是否进入软锁,软锁时打印相关信息所以陷入soft lockuop的情况直接表现就是每CPU的watchdog_touch_ts时间戳长时间没有被更新,更新这

2021-01-21 15:45:55 697 1

原创 sysrq阅读记录

sysrq文章目录sysrq使用初始化操作列表更改`log`等级重启强制触发`panic`打印相关锁信息发送`SIGTERM`终止进程信号人为触发`OOM Killer`人为发送`SIGKILL`信号对设备进行解冻虚拟终端授信打印所有CPU的寄存器信息和堆栈信息打印内存信息对实时线程的`nice`值进行修改打印寄存器信息打印定时器相关信息复位键盘模式紧急同步打印进程信息重新挂载所有文件系统为只读打印`blocked(D)`进程信息打印`traceing`信息使用内核文档中有说如何使用:b :立即

2021-01-21 15:30:35 542

原创 arm64-reboot流程

ARM64-reboot流程文章目录ARM64-reboot流程1. 用户态reboot 执行流程2. 内核系统调用3. PSCI 电源状态协调接口3.1 kernel发起的`PSCI`复位3.2 TrustZone的异常处理1. 用户态reboot 执行流程当命令行输入reboot命令时,busybox会vfork一个子进程,调用reboot函数:此时,reboot函数进入到libc,libc里面封装了Linux的系统调用:2. 内核系统调用这样就进入到了Linux的系统调用部分的代码:校

2020-12-25 16:10:37 3724 3

原创 ftrace 使用记录

ftrace 使用记录ftrace内核开启选项,编译内核:CONFIG_FTRACE=yCONFIG_HAVE_FUNCTION_TRACER=yCONFIG_HAVE_FUNCTION_GRAPH_TRACER=yCONFIG_HAVE_DYNAMIC_FTRACE=yCONFIG_FUNCTION_TRACER=yCONFIG_FTRACE_SYSCALLS=y内核挂载debugfs文件系统:mount -t debugfs debugfs /sys/kernel/debugcd

2020-12-16 10:28:35 376

原创 CNDRV PCI 驱动阅读过程

CNDRV PCI 驱动阅读过程文章目录CNDRV PCI 驱动阅读过程1. PCI驱动注册2. 驱动 probe 函数2.1 BAR空间映射2.2 设置 DMA 掩码2.3 平台初始化2.3.1 内核预留内存初始化2.4 使能 MSI 中断2.4.1 `PCI`中断处理函数2.5 DMA 引擎初始化2.5.1 注册`DMA`引擎中断回调2.5.2 `DMA`引擎中断处理函数2.6 核心层的探测2.6.1 字符操作集合2.6.1.1 ioctl2.6.1.2 用户态内存的映射到散列2.6.1.2 read

2020-12-14 20:28:13 572

原创 PCIE_MCC驱动阅读过程--SLAVE篇

PCIE_MCC驱动阅读过程–SLAVE篇文章目录PCIE_MCC驱动阅读过程--SLAVE篇hi35xx_dev_slv.koinitirq_map_slv.kopcit_dma_slv.komcc_drv_slv.komcc_usrdev_slv.ko补充握手过程Step 0 准备过程Step 1 握手过程阅读讨论pcie_mcc代码的过程就是不断地推翻之前草率不深刻的结论,多讨论还是会有收获。从端驱动加载顺序:insmod hi35xx_dev_slv.ko;insmod irq_map

2020-11-21 13:49:42 995

原创 FAT 文件系统代码分析--文件系统挂载篇

FAT 文件系统代码分析–文件系统挂载篇当前内核版本:Linux-5.9。文章目录FAT 文件系统代码分析--文件系统挂载篇代码大纲分析源文件下重要的结构体(实例)cache.cdir.cfatent.cfile.cinode.cmisc.cnamei_msdos.cnamei_vfat.cnfs.cFAT文件系统注册vfat层file_system_typesuper_blockinode层fat_fill_super-1fat_bios_param_blockmsdos_sb_infofat_sop

2020-11-19 23:49:22 2479 3

原创 PCIE_MCC驱动阅读过程--HOST篇

PCIE_MCC驱动阅读过程–HOST篇文章目录PCIE_MCC驱动阅读过程--HOST篇hi35xx_dev_host.koinitprobeirq_map_host.koboot_device.koinitopen/release/read/write/pollioctlHI_GET_ALL_DEVICESHI_PCIE_TRANSFER_DATAinit_ddrmove_pf_window_intransfer_dataHI_START_TARGET_DEVICEHI_RESET_TARGET_DE

2020-11-12 18:14:43 2315 2

原创 Linux内核增加一个trace

Linux内核增加一个trace event本内核版本是Linux-4.9.37,参考drivers/usb/dwc3/下的代码实现。首先定义两个文件:trace.h和trace.c。trace.h如下:定义一个事件类以及一个事件,最后包含头文件<trace/define_trace.h>。#undef TRACE_SYSTEM#define TRACE_SYSTEM mj#if !defined(__MJ_TRACE_H) || defined(TRACE_HEADER_MULT

2020-11-02 10:52:24 1566

原创 FAT32 文件系统在磁盘上的结构

FAT32 文件系统在磁盘上的结构文章目录FAT32 文件系统在磁盘上的结构卷结构数据区域的安排物理地址物理扇区号逻辑扇区号分区区域和常规区域用户区域的安排簇簇的状态分区区域的安排MRB与分区表位置分区表的内容系统区域的安排系统区域分区引导扇区和FS信息扇区文件分配表(FAT表)文件结构分区启动扇区FS Info 扇区文件分配表FAT: File Allocation Table文件目录特征目录项字段日期和时间格式与FAT12 / FAT16文件目录的区别用户数据区域LFN长文件名实现SD存储卡文件系统中

2020-10-28 22:46:31 2667 1

原创 Linux kernel 原子操作

Linux kernel 原子操作文章目录Linux kernel 原子操作内核原子操作分析原子汇编代码prfm 预取指令ldxr 原子的加载操作stxr 原子的存储操作cbnz 非0跳转Armv8的同步原语主要看一下汇编是怎么实现的, 最后发现是通过硬件提供的指令集来完成的。1- 预取内存数据2- 原子加载、存储数据3- 判断 PE 标记, 失败则跳转 2- 循环内核原子操作内核使用atomic_t类型的原子变量,具体的实现依赖于不同的体系架构,我这里是ARM64的代码进行分析。ato

2020-10-28 17:01:10 1539

原创 g_zero 代码分析

g_zero 代码分析g_zero.ko是USB Device端代码的一个驱动,具备两个功能:loopback和sourcesink,使用bulk的端点进行传输,作者写这个驱动的目的是用来测试UDC驱动的,但我们也可以在这个驱动的基础进行修改,以实现一些我们自己的功能,比如生成字符设备,提供ioctl接口、mmap接口等,以实现与host端的主动发起交互。当前内核版本linux-4.9.37。usb_f_ss_lb.ko模块这个模块包含两个function,分别是f_sourcesink和f_loo

2020-10-27 16:31:11 1392

原创 usb-skeleton 代码分析

usb-skeleton 代码分析文章目录usb-skeleton 代码分析驱动注册主端探测函数 probe设备操作集打开设备关闭设备写操作读操作flushusb-skeleton.c是USB Host端代码的一个骨架,如果想要编写自己的Host端bulk传输的代码,可以参考这个部分的代码进行编写,至于其他isoc的传输方式,可能还需要参考其他的驱动代码进行编写。当前内核版本linux-4.9.37。驱动注册使用module_usb_driver注册HOST端驱动,声明匹配的gadget驱动列表(

2020-10-26 17:28:59 762

原创 dma engine 相关代码分析

dma engine 相关代码分析文章目录dma engine 相关代码分析DMA引擎API指南申请从DMA通道设置从设备和控制器的具体参数获取事务的描述符提交事务发出挂起的请求并等待回调通知1. terminate2. pause3. resume4. complete5. synchronizeDMA引擎控制器文档硬件介绍Linux中的DMA支持DMA引擎注册`struct dma_device`初始化支持的事务类型设备操作杂项说明代码分析申请从DMA通道设置从设备和控制器的具体参数获取事务的描述符提

2020-10-19 17:06:30 1776 1

原创 dmatest 代码分析

dmatest 代码分析dmatest是内核的一个测试dma模块的代码,代码位置位于内核的./drivers/dma/dmatest.c,关于dmatest模块的使用可以参考内核提供的文档./Documentation/dmaengine/dmatest.txt,这里只简单地介绍一下。编译加载模块配置支持位置:Device Drivers -> DMA Engine support -> DMA Test client或者直接修改配置文件CONFIG_DMATEST=m,编译成模块。

2020-10-16 16:33:23 3937

原创 usbmon-wireshark之USB协议抓取分析

usbmon + wireshark 协议抓取usbmon内核开启CONFIG_USB_MON=m, 重新编译内核, 编译ko :make ARCH=arm64 CROSS_COMPILE=aarch64-himix100-linux- CONFIG_USB_MON=m M=./drivers/usb/ modules设备挂载debugfs, 加载ko :mount -t debugfs debugfs /sys/kernel/debug/insmod usbmon.ko查看是否成功产生

2020-10-13 19:06:41 1900

原创 3519A的uboot下内存分布

3519A的uboot下内存分布CONFIG_SYS_INIT_SP_ADDR : 0x04204000 // 0x0420_0000~0x044F_FFFF DSP Memory 空间。PHYS_SDRAM_1 : 0x20000000 // 0x20000000~0x40000000 SDRAM内存地址范围BOOT_PARAMS : 0x20000100LOAD_ADDR : 0x20080000TEXT_BASE_O

2020-10-13 18:58:28 310

原创 qemu+u-boot在镜像中读取内核启动

qemu+u-boot在镜像中读取内核启动u-boot,内核,根文件系统过程就不介绍了。Step 0 预备下载kpartx ,路径: [http://ftp.sjtu.edu.cn/ubuntu/pool/main/m/multipath-tools/], 当前用的kpartx_0.4.9-3ubuntu5.3_amd64.deb这个版本可用,更新的版本没有尝试, 最新的版本ubuntu14.04无法安装(依赖不满足)。Step 1 创建空磁盘这里先创建一个64M的:dd if=/dev/zer

2020-10-13 18:57:41 303

原创 u-boot下usb命令

u-boot下usb命令执行过程这篇文档旨在分析u-boot下执行usb命令时整个命令的执行流程,让初学者对u-boot下usb相关知识有一定的了解。这里主要从执行的命令出发,一步一步分析代码、协议、寄存器的读写过程。文章目录u-boot下usb命令执行过程usb组织形式总览u-boot usb命令总览从usb start开始1. 初始化全局变量`hub_dev`的数据内容2. 初始化全局变量`usb_dev`的数据内容3. 初始化底层控制器4. 为新usb设备申请资源5. 识别新设备1. 对设备进行设

2020-10-13 18:56:59 3678 2

原创 hi3519av100改用传参设备树方式启动

hi3519av100改用传参设备树方式启动文章目录hi3519av100改用传参设备树方式启动使用简单的测试设备树进行分析编译与反编译u-boot获取设备树内容u-boot传递设备树内容u-boot传递设备树内容 `linux`内核启动需求的`Setup boot data`时可以通过两种方式:Setup the kernel tagged listSetup the device treelinux-4.9.37/Documentation/arm/Bootinghi3519av1

2020-10-12 15:33:24 799

原创 查看程序的库依赖

由两个python脚本引起的学习兴趣 – 查看程序的库依赖在网上看到宋宝华老师写的两个python脚本,是可以用来查看程序的库依赖的,github地址在下面:https://github.com/21cnbao/libdep/Linux程序对库的依赖symbol-dep.py:https://cloud.tencent.com/developer/article/1518254原理用nm -D --undefined-only命令可以列出一个程序依赖的需要动态链接的库函数,例如:➜

2020-10-12 15:17:46 871 1

原创 u-boot重定位过程代码分析

20200121 日常u-boot 对函数及全局变量的寻址过程参考这个博客:[https://blog.csdn.net/skyflying2012/article/details/37660265]在u-boot代码[common/main.c]里面修改一下, 只要保证代码被这个平台编译, 且不被优化掉就可以了。如果代码或者变量没有被引用, 可能会被编译器优化掉, 取决于优化等级。static int xxx_var = 100;void xxx_func_1(void){ xxx_var

2020-10-12 15:12:40 970

原创 u-boot启动代码分析

u-boot启动代码分析_start -> reset -> _main主要涉及一些协处理器的处理, 暂且略过。进入到_mainENTRY(_main)/* * Set up initial C runtime environment and call board_init_f(0). */ ldr sp, =(CONFIG_SYS_INIT_SP_ADDR) @ sp = 0x60000f50 bic sp, sp, #7 /* 8-byte alignment fo

2020-10-12 15:05:35 734

原创 Linux嵌入汇编

Linux嵌入汇编Linux内核嵌入汇编#define vectors_base() (vectors_high() ? 0xffff0000 : 0)#define vectors_high() (get_cr() & CR_V)#define CR_V (1 << 13) /* Vectors relocated to 0xffff0000 */static inline unsigned long get_cr(void){ unsigned long val;

2020-10-12 15:00:44 360 1

原创 mmc驱动框架基础介绍

mmc驱动框架基础介绍本文主要介绍一下Linux内核的mmc子系统驱动的整体框架。(作者对SDIO设备不熟悉,所以不过多描述;鄙人才疏学浅,有不当之处,还请指教。)大概包括以下几个部分:mmc子系统驱动简介mmc设备的识别、初始化流程的大概介绍mmc设备的读写流程大概介绍mmc子系统驱动简介mmc子系统驱动分为三层,分别为:Block层:主要作用是对接通用块层,创建块设备及上层请求处理等工作。Core层:主要提供协议层的内容,为Block层、Host层提供相应接口。Host层:主

2020-10-12 14:54:26 4294 5

原创 qemu gdb环境搭建

qemu gdb环境搭建arm-linux-gnueabi-gdb 安装环境:uname -a查看版本:Linux mj 3.19.0-25-generic #26~14.04.1-Ubuntu SMP Fri Jul 24 21:16:20 UTC 2015 x86_64 x86_64 x86_64 GNU/Linuxgcc -v查看版本:Using built-in specs.COLLECT_GCC=gccCOLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64

2020-10-12 14:38:00 441 1

原创 arm32上uImage镜像的生成过程

arm32上uImage镜像的生成过程arch/arm/boot/.Image.cmd :cmd_arch/arm/boot/Image := arm-himix200-linux-objcopy -O binary -R .comment -S vmlinux arch/arm/boot/Imageobjcopy选项:-O : 输出目标文件格式,这里是二进制格式-R : 移除目标段,这里移除目标的.comment端-S : --strip-all这里就是用arm-himix200-l

2020-10-12 14:35:40 375 2

原创 内核ramdisk启动之根文件系统制作

内核ramdisk启动之根文件系统制作涉及方面:uboot : 这里uboot需要传递启动命令行参数kernel : 这里要修改启动方式为ramdisk启动rootfs : 这里要制作目标其中第一个uboot启动参数要与kernel的配置、rootfs的大小要保持一致。uboot 修改启动参数当前:bootargs='mem=256M console=ttyAMA0,115200 clk_ignore_unused root=/dev/ram0 rw init=/linuxrc init

2020-10-12 14:28:48 973

原创 softirq部分代码解读

softirq部分代码解读文中有部分摘抄自其他参考文章, 由于暂时没有找到参考文章的链接了, 后续补上。/proc/softirqs 下的 softirq 显示某些/proc/softirqs的信息:/proc/softirqs 代码位置显示代码在linux-4.9.37/fs/proc/softirqs.c文件中,显示打印的函数如下:linux-4.9.37/include/linux/kernel_stat.h文件中定义了这个软中断数目增加的函数以及获取软中断数目的函数,在__do_s

2020-10-12 11:58:00 1291 4

insmod过程.pdf

insmod过程pdf--莫搬砖员

2021-10-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除