自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

sydyh43的博客

为之,则难者亦易矣;不为,则易者亦难矣

  • 博客(86)
  • 资源 (6)
  • 收藏
  • 关注

原创 kprobe功能的代码实现

给目标函数执行前后完成打桩,在打桩函数中获取函数的入参值和返回值,从而实现对某个功能的跟踪,如是否打开了某一个文件。当目标函数执行结束最后一刻,触发异常,完成执行目标函数后post_handler的调用。3.3、通过do_sys_open函数定义可知,filename的指针地址是一个用户态的地址,此处是内核态空间,因此不能直接访问,需要借助函数strncpy_from_user实现数据的拷贝。此处是x86的架构。3、具体的代码实现,以open系统函数为例,对应内核态的函数是do_sys_open。

2022-09-24 16:12:13 494 1

原创 【无标题】

1、将虚拟地址传入到内核态,借助内核态中mm_struct结构体的pgd页表基地址成员,经过查页表的方式最终获取到物理地址。查看到其中有一项/pro/[pid]/pagemap,可以看出54~0就是对应着物理地址的页帧号,再加上虚拟地址的低12位,就是虚拟地址对应的物理地址。但是有一点可以明确的,转换出来,获取到的是页帧号(即页对齐),最后加上虚拟地址的低N位(32bit的系统是低12位)得到最终的物理地址。3、 在用户态,读取/proc/[pid]/pagemap这个节点的数据,获取物理内存的页帧号。

2022-09-03 14:25:17 403

原创 为什么在telnet登入界面下没有日志输出?

569号进程的输出目标是/dev/console,即串口。其中0是标准输入,1是标准输出,2是标准错误输出。3.2、因此只需要把进程的fd0,1,2软链接到对应telnet的节点下,如/dev/pts/0。3.1、每增加一路telnet连接,系统就会在/dev/pts目录下创建设备节点。2、因此我们只需要查看telnet进程,fd的0,1,2号软链接的情况即可。1、每个进程的输入输出导向目标都可以在进程号下的fd软链接上查看。从图中可以看出,内容输出直接导向到/dev/null,即全部抛弃。...

2022-07-23 14:00:52 907

原创 基于I2C协议的驱动开发

基于底层I2C驱动的二次开发驱动

2022-06-25 14:58:16 372

原创 内核态和用户态相关的内存泄漏

应用程序通过系统调用进入内核态代码。假如内核态代码存在内存泄漏,此内存泄漏属于内核态还是用户态?查看内核态和用户态的统计信息。

2022-06-03 10:04:39 229 1

原创 execv替换原程序

待补充

2022-06-03 10:01:26 77

原创 makefile的一些小疑问

避免出现clean的文件在当前目录下,执行makefile报错。当然一般也不太可能存在clean文件,一般clean标志默认就是使用清文件的标志。出现错误退出,继续往下运行。告知系统hello是一个伪目标,当目标文件已经存在目录下时,不需要处理,直接执行下面的脚本。可以看出,顶格写的hello是需要生成的目标文件。答案是,没有执行成功,会报错。如make-frule.debug,rule.debug就是makefile文件。1、makefile中有.PHONY修饰clean,为什么需要.PHONY?...

2022-06-03 09:59:33 147

原创 虚拟地址找到物理地址

/proc/self/pagemap

2022-06-03 09:58:25 203

原创 systemctl命令

待补充

2022-03-18 20:13:58 187

原创 memcpy在不同cpu使用率情况下耗时不一样

待补充

2022-03-17 21:02:45 1231

原创 PCIe的个人入门学习

待补充

2022-03-15 15:40:51 259

原创 交叉编译工具链的安装

你有一块尘封多年的开发板,吹口气,尘土飞扬。最近买了一台崭新的电脑,脑子抽风想在开发板子上练练手。1、安装linux开发环境1.1、windows端安装虚拟机,在虚拟机上安装linux操作系统。win 2008之后的版本自带虚拟机hyper-V,可以少安装vmware软件如何安装虚拟机和linux环境_sydyh43的博客-CSDN博客1.2、每次操作都需要进入虚拟机毕竟不太方便,可以在windows端使用secureCRT工具通过ssh的方式访问虚拟机的linux环境如何在window

2022-03-14 10:16:29 784

原创 fork写时复制分析

待补充

2022-03-11 11:03:15 167

原创 strip后发布的程序如何gdb调试

1、针对于对存储空间敏感的设备,比方说嵌入式设备,本身存储空间非常有限,时常为了扣几个KB的空间而废寝忘食。因此对外发布应用程序时,都会通过strip命令把相应的debug信息删除,减少程序本身的大小。但是程序出问题时,由于缺少debug信息,很难完成问题的定位。strip strip_symstrip前后的程序对比,少了很多debug信息的section。(readelf -S strip_sym)strip前strip后,包含很多debug信息section被删除,相应的文件大

2022-02-25 13:37:48 1184

原创 mm_struct结构体的认知

1、先看看mm_struct结构体的定义struct mm_struct { struct { struct vm_area_struct *mmap; /* list of VMAs */ struct rb_root mm_rb; ...... unsigned long mmap_base; /* base of mmap area */ unsigned long mmap_legacy_base; /* base of mmap area in botto

2022-02-12 14:26:17 577

原创 ARM处理器的异常模式

1、ARM处理器有各种异常模式,用于应对ARM出现的不同状态。出现异常时,会随即进入相关的异常向量,同时CPSR的寄存器也会设置成具体的模式。例:当出现中断时,不管是哪种中断,都会跳转到0x18这个总入口地址(也有可能是0xFFFFFF18,看系统初始化的虚拟地址,无所谓),然后通过中断号执行具体的中断注册函数。同时会把CPSR寄存器设置成相应的模式。当从一个模式切换到另一个模式的时候,需要把之前模式下的HW context保存起来,比方说从用户态进入内核态,因为新模式下,内存区域划分是

2022-02-12 11:10:21 3202

原创 程序是如何跑起来的?

1、写段小程序,然后用strace命令查看程序运行情况。#include <stdio.h>int mian(){ printf("hello world.\n"); return 0;}strace ./hello从上图可以看出,会先调用execve系统函数对可执行程序进行解析。execve的使用方法见:执行新程序 execve()_杨博东的博客-CSDN博客_execve2、execve系统函数处理流程SYSCALL_DEFINE3(e

2022-02-11 11:24:21 1552

原创 虚拟地址如何访问到物理地址

环境:32bit CPU一、通过二级页表映射的方式访问物理地址1、取一级页表的基地址Abase12、取虚拟地址的前12bit[31:20]地址O13、计算得到新地址Apgd=(Abase1&0xFFFFF000)+O1,此地址是PGD页表上的地址,取此地址中的数据Abase24、取虚拟地址的中间8bit[19:12]地址O25、计算得到新地址Apte=(Abase2&0xFFFFFF00)+O2,此地址是PTE页表上的地址,取此地址中的数据Abase36、取虚拟地址的后1

2022-02-08 17:43:04 820

原创 两个进程能同时进入内核态嘛

1、当一个进程从用户态进入到内核态的时候,在内核态期间进程进入休眠模式。此时,另外一个进程又从用户态进入内核态,那这个进程能继续往下执行嘛?两个进程此时用的是同一份内核栈嘛?2、验证2.1、构建场景1,两个进程调用同一个接口(open),此接口内核态下进入休眠模式。int dyh_test_open(struct inode *node, struct file *filp){ int *p = NULL; p = (int *)current_thread_info(); pri

2022-02-07 17:54:31 549

原创 同一应用程序同时运行两次,代码段是同一份嘛

1、先看看下面代码,代码中额外增加了获取进程代码段和数据段的。#define _GNU_SOURCE#include <unistd.h>#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h>#include <string.h>int a = 0;int

2022-01-29 20:27:11 503

原创 用户态与内核态之间的切换

1、用户态与内核态之间通过系统调用接口完成交流,系统调用接口的所有种类:syscalls.h - include/linux/syscalls.h - Linux source code (v5.16.3) - Bootlin当执行程序的时候可以通过strace命令查看程序具体使用了哪些系统调用接口。strace工具_sydyh43的博客-CSDN博客_strace工具2、用户态与内核态之间的切换2.1、用户态进入到内核态2.2、内核态返回到用户态...

2022-01-29 20:15:40 1338

原创 栈区数据被飞踩问题定位手段

1、栈溢出或者栈数据被踩时,继续运行就会出现segmentation fault。可以尝试着接管SIGSEGV信号,在信号处理函数中保存一些出现异常时候的信息。2、基于栈溢出场景,栈空间被破坏,也就没法使用栈区,当然就没法执行SIGSEGV信号的处理函数。因此需要开辟额外的空间用于栈空间使用,系统提供了sigaltstack接口。2.1、开辟第二栈区的代码void create_alt_stack(void){ stack_t sigstack; memset(&sigsta

2022-01-25 20:07:09 2573

原创 x86的PC机上运行ARM架构开发板

一、背景1、当你需要基于arm + linux框架开发需求(如驱动,应用程序,调试等)时,但是没有相应的物理开发环境,只有一台装了虚拟机linux系统的X86电脑。如果是这种情况,可以继续往下看。2、需要linux系统上安装虚拟机qemu,在qemu上运行arm环境。3、一套完整的arm + linux启动流程,主要包括u-boot,kernel和rootfs这三元组。其中在qemu中,可以跳过u-boot来启动内核,挂载文件系统。基于以上几个组成部分,完成安装。二、安装1、准备工作

2022-01-20 21:00:23 2435

原创 用户态的内存泄漏定位,函数重载

1、函数重载的方法如何实现函数打桩_sydyh43的博客-CSDN博客2、具体实现代码工程中,申请和释放内存是通过malloc和free实现的。接下来的工作就是对malloc和free两个函数实现重载。在malloc重载函数中创建一个文件,文件名由malloc返回的地址命名,文件中保存调用malloc重载函数的地址。在free重载函数中删除以释放地址命名的文件。运行一段时间后,查看剩余的文件,剩余文件就是可能出现内存泄漏的地址,通过保存在文件中的数据确认调用malloc的地方。2.1、mal

2022-01-19 18:52:26 238

原创 如何实现函数打桩

1、打桩是干什么的?在对打桩函数本身执行完整的基础上,添加一些额外的代码,完成必要的信息采集,用于具体的问题定位。2、打桩的时机程序从诞生到生存分三个阶段,编译,链接和运行函数分别可以在这三个阶段实现打桩操作3、打桩的实现3.1、代码框架main.c函数调用libmalloc0.so动态库函数,libmalloc1.so调用libmalloc0.so动态库函数3.2、代码路径GitHub - dyh-git/func_stub: 函数打桩,重载函数3.3、具体情况3.

2022-01-19 18:51:24 2121

原创 动态库*.so的延时绑定分析

1、程序运行过程中需要调用动态库中的函数,因此必须先指定动态库的路径,否则会报无法找到动态库的错误。需要动态添加动态库路径export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/dyh/project/test_space/malloc/output/libs2、程序运行过程中会调用动态库中的很多函数,这些函数的地址不是在运行的时候全部完成绑定,而是需要的时候才做绑定动作,俗称延时绑定(lazy binding)。效率最大化的表现。3、如何完成延时绑定

2022-01-19 18:50:26 525

原创 vmalloc最大申请的空间大小

1、vmalloc和vfree是内核下面申请和释放内存的函数。申请到的内存虚拟地址连续,但是物理地址可能不连续,且按照4K方式对齐。2、vmalloc最大分配的空间大小(cat /proc/meminfo | grep Vmalloc)查看。最大不可能操作改值3、假如vmalloc申请一个特别大的空间,即超过了上面的阈值,设备无法申请成功4、根据上面的错误信息可以确认报错的地方static struct vmap_area *alloc_vmap_area(unsigned lon

2022-01-15 16:20:15 939

原创 通过inode获取文件名信息

1、当某个进程处理文件时,需要根据文件路径名打开某个文件,然后根据返回值fd完成对文件的操作。如:fd = open("/new/xxx.txt", O_RDWR);参考多进程打开同一个文件问题分析_sydyh43的博客-CSDN博客。在内核层,最终反映文件的属性是struct inode,一个文件对应着一个strtuct inode。linux下的每一个文件都有对应着一个inode id。//https://elixir.bootlin.com/linux/latest/source/incl.

2022-01-15 12:35:31 2361

原创 drop_caches释放哪些内存

1、命令echo 1 > /proc/sys/vm/drop_caches释放文件的page cache内存,对应着top下的cached值2、cached具体被哪些模块使用着(cat /proc/meminfo)【Active(file) + Inactive(file) + Shmem + mlock_file】== 【Cached + Buffers】Active(file)和Inactive(file)对应着文件映射Shmem对应着内存文件系统,如/tmp;或

2022-01-14 21:10:44 3053

原创 initRD的启动流程分析

1、根文件系统存放在flash中,设备启动过程中会耗时比较久时间。这是因为从flash中读取rootfs的数据操作比较耗时,同时读取存放在rootfs中的*.so,*.ko等文件也比较耗时。这都是由flash本身的读写属性决定的。对于一些需要快速启动的设备,flash的读写速率无法满足,因此可以考虑挂载到内存中的rootfs,即ramdisk。2、使用ramdisk需要内核的支持,需要打开CONFIG_BLK_DEV_INITRD宏3、initramfs初始化流程图如下图所示,主要分成两部分

2022-01-14 21:02:26 1257

原创 根文件系统挂载流程

1、普通的根文件系统存放在flash中的某个分区。因此需要告知内核根文件系统存放在哪个分区中,同时需要知道根文件系统的rootfstype类型。见mount挂载分析_sydyh43的博客-CSDN博客2、设备启动阶段,在内核加载最后阶段,需要挂载根文件系统,然后访问根文件系统中的第一个用户进程init3、挂载函数流程//init/main.cstart_kernel rest_init kernel_init //kernel_thread(kernel_in

2022-01-14 20:09:47 973

原创 多路IO复用,如何唤醒准备好的fd

1、先来看一段应用层的代码 /* 打开三个文件 */ if((fds[0].fd = open("/dev/in0", O_RDONLY|O_NONBLOCK)) < 0) { printf("open in0 error!\n"); return -1; } if((fds[1].fd = open("/dev/in1", O_RDONLY|O_NONBLOCK)) < 0) { printf("open in1 error!\n"); return -1;

2022-01-14 14:53:54 164

原创 软链接和硬链接

1、先看下面的脚本。其中hello.txt文件已经存在,创建hello1.txt和hell2.txt文件。ln hello.txt hello1.txtln -s hello.txt hello2.txt2、使用stat命令查看文件的属性2.1、在没有执行上述两个命令前,其中硬链接是1,当执行完第一条命令后发现硬链接变成2,因此第一条指令是硬链接的命令。查看硬链接生成的文件属性发现硬链接生成文件的inode和原始文件hello.txt的 inode是一样的,因此可以说明两个是

2022-01-14 14:27:34 197

原创 kprobes,强大的调试工具

1、问题:如何查看某一时间段打开了哪些文件2、针对上面问题,打开文件都会走open接口,如下open.c - fs/open.c - Linux source code (v5.15.12) - Bootlin其中,do_sys_open函数的第二个参数就是打开的文件路径名,因此只需要抓取do_sys_open的第二个参数值即可。不同的处理器,入参对应的寄存器也不一样。其中X86-64处理器其中ARM-32处理器3、本文以X86-64为例,因此需要捕捉寄存器%rsi即可4

2021-12-31 21:48:14 497

原创 如何变成僵尸进程

1、进程fork()后,子进程子承父业,继续运行与父进程一样的程序,但是子进程可以通过调用exec(),走向与父进程完全不同的道路(将新程序加载到旧程序的地址空间,丢弃旧的程序,进程的栈,数据段,堆栈被新程序替换)。2、制作僵尸进程#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.h>int main(){ pid_t pid;

2021-12-31 21:02:20 1132

原创 CFS调度算法

1、CFS调度算法,顾名思义就是完全公平调度策略。比方说,调度延迟时间是10ms,存在两个进程A和B,那么两个进程分别占用CPU的时间是5ms。然而,阶级总是存在的,毕竟有些进程高贵些,需要消耗更多的时间。因此引入了nice值,假如A进程nice值是0,对应的权重prio_to_weight是1024;B进程nice值是1,对应的权重prio_to_weight是820。因此,相对应的,A进程占用CPU的时间就变成了10 * 1024 / (1024 + 820)约5.6ms,B进程占用CPU时

2021-11-06 15:21:21 3648

原创 基于SPI协议的驱动开发

1、linux下的spi协议框架一般spi-core以下的spi_master有芯片厂家开发完成。因此只需要完成SPI协议基础上的二次开发,比方说基于SPI协议实现网络数据的传输,或者SPI外围器件的控制,或者blalalala2、代码框架2.1、dts的配置,生成spi_master/*配置GPIO口模式为SPI模式*/spixxx_pins: spixxx_pins{ anyka,pins = <15 16 25 26 >; anyka,func.

2021-11-06 13:20:33 901

原创 socket通信tcp读取数据的一点分析

2021-09-20 13:18:23 767

原创 内存飞踩问题的几点思考

1、程序编译,链接后生成二进制可执行程序。二进制可执行文件以elf格式实现排列。可以通过readelf -S xxxx查看具体section的划分,粗略划分如下图所示。在这些section中,代码段是只读的,自然也就不存在代码(指令)被改写的情况。数据段,堆,栈区具有读写的属性,但是数据段和堆一般存放的是数据,不涉及到指令的问题。剩下的栈区,存放的既有数据,又有代码(指令),可能存在代码(指令)被改写,即内存被飞踩现象。2、栈空间数据被修改情况2.1、先做个实验(ARM 32环境)

2021-09-15 20:32:15 1840 2

原创 等待队列waitqueue分析

wait_queue等待队列,本质是一个双向链表。其中有链表头,连接到链表头的等待队列成员1、应用实例demo程序/* 声明全局变量等待队列类型中断 button_wait */static DECLARE_WAIT_QUEUE_HEAD(button_wait);/* * 定义全局变量中断事件标志 * 0:进入等待队列 1:退出等待队列 */static int even_press=0;static int xxx_read(struct file *f

2021-09-15 20:31:05 205

dlib.tar.gz

动态库制作,合成在makefile脚本中,一键生成。

2020-09-13

static_libfun.gz

静态库制作。直接合成在makefile脚本中,一键生成可执行程序,以此为框架,按照自己的意愿随意修改脚本。

2020-09-12

verilog 设计要点

verilog的基础资料和设计要点,阅读完基础知识再来设计,效果事半功倍!

2010-01-27

red hat install guidbook

red hat 安装指导书,安装问题,从此不再愁!

2010-01-27

fpga design book

这是一本关于fpga设计且参考价值极高的书

2010-01-26

模拟电子技术试卷加解析

这是一份模拟电子技术考试,很详细,有答案

2009-07-01

空空如也

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

TA关注的人

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