自定义博客皮肤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)
  • 收藏
  • 关注

原创 内核杂谈——学内存管理

把下述的源码追几遍就ok了,基础算是扎实了。写的内容有限,但代码无限。页表建立页表建立存在于用户空间的地址和内核空间的地址。二者有着微妙的差别。内核空间页表建立内核空间的页全局目录表为swapper_pg_dir,只要是内核地址(如何区分?pgd_offset使用参数init_mm 和 mm来区别建立映射)就使用这个pgd,而且内核空间地址都统一使用这个pgd。一开始建立的时候肯定是空空的啥都没有,尤其在建立设备树的映射中连物理内存都摸不到。但办法总是有的,使用内核映像里的bm_pXd.

2021-03-01 11:34:10 149

原创 ubuntu重新开启网络

bin/bash网络图标重现的神技

2023-02-09 16:16:04 838

原创 杂谈 linux DMA内存

这块物理块会记录在 cma_areas[cma_area_count] 中,然后 dma_contiguous_default_area 指向这块物理块。不同的mask,对应从不同的zone获取内存。2 dma_contiguous_default_area 没货了,则优先从dma zone获取page。最后将64为的物理地址对应到32位的dma地址,phys_attr_t转化位dma_attr_t。注意了,开始找的地方是从dma的边界往下(arm64_dma_phys_limit)。

2022-12-20 10:48:02 923

原创 捋一下 completion

使用方法很简单。1、A初始done变量为02、A触发条件,B执行complete事件3、Awaite_for_completion_timeout,B执行完且没超时,A退出等待,继续往下执行。

2022-07-23 14:37:29 388

原创 usb杂谈之获取设备信息——举例鼠标urb

首先梳理一下usb设备的检测过程:当usb设备接到port时,控制器会监测到该port电平状态发生改变,继而产生中断port状态中断函数:handle_port_status中断函数做了两件事:第一件处理当前中断第二件继续轮询该port状态第一件事:使用tasklet中断下半部处理,然后使用工作队列创建出设备 else if (high_prio_bh) // 同步传输或中断传输 tasklet_hi_schedule(

2022-06-16 17:33:11 829

原创 dump并解析qemu virt设备树

qemu-system-aarch64 -machine virt,dumpdtb=dump.dtbcp dump.dtb linux/scripts/dtc/./dtc -o dump.dts -O dts -I dtb dump.dtb

2022-02-23 13:55:46 963

原创 内核杂谈——关于platform device 创建

当拿到driver,不能用起来的时候需要去检查device了。虽说device和bus通常都是系统中带的,但也不要想当然的认为这个系统是帮你建好的。通常 bus device driver三者中,bus基本不用干预,device 干预的少,driver 干预的多。从设备树中生成device从设备树中识别 device的入口为 arch_initcall_sync(of_platform_default_populate_init);static int __init of_platform_defa

2022-01-26 10:35:30 1244

原创 内核杂谈——浅谈kdump机理

引言百分之百肯定的是,如果你的内核崩溃了,没有发生重启,那就说明重启内核是有问题的,谁来控制重启内核呢,答案是 kexec 工具。kexec 工具的任务就是将重启内核保存到内核空间里,只要这个工具起来,指定的内核文件没有问题,就会默默的将这个内核文件保存到内核空间里,类似于open,然后系统发生死机后,就可以转生。明确一点,kexec并不是发生死机后才开始生效的,她是一个用户态程序,死机了还执行个锤子。kexec和内核交互的工具,本质上是一个系统调用。...

2021-11-09 17:42:17 1040

原创 linux内核调试方法

pr_debug的打印开启某个c文件,某个函数含有pr_debug。默认是不会打印的/* If you are writing a driver, please use dev_dbg instead */#if defined(CONFIG_DYNAMIC_DEBUG)#include <linux/dynamic_debug.h>/* dynamic_pr_debug() uses pr_fmt() internally so we don't need it here *

2021-09-09 15:56:22 1466

原创 在qemu中添加swap分区

背景:想了解一下hibernate的机制的,但使用的时候报错PM: Cannot find swap device, try swapon -aPM: Cannot get swap writer意识到自己的qemu系统中没有swap分区。关键步骤1首先需要制作img,制作完img后在qemu启动命令行中添加 -device virtio-blk-device,drive=hd1 \ -drive if=none,file=XXX.img,format=raw,id=...

2021-08-27 17:33:47 697

原创 捋一下工作队列workqueue

work queue的使用struct work_struct work; //先定义一个工作void func(struct work_struct *work) {} //工作的内容INIT_WORK(work, func) //初始工作,func绑定到work中schedule_work(&work); ...

2021-08-05 19:30:56 1240

原创 捋一下等待队列waitqueue

waitqueue首先结构体的名字中确实带了queue,但是本质上是一个双向链表。struct wait_queue_head { //等待队列头 struct list_head head;};struct wait_queue_entry { //等待队列实体,描述一个个任务 struct list_head entry;};等待队列是成对使用,比如可中断的wq和不可中断的wqwait_event/wake_upwait_event_inte............

2021-07-15 19:29:26 470 1

原创 内核杂谈——vmalloc分配器的进化故事

从懵逼到不懵逼vmalloc机制在最近的内核中做了大改,很有意思。通过对比的角度来看看最近一次的进化史。对比版本5.0和5.4patch: commitID 68ad4a3304335358f95a417f2a2b0c909e5119c4 mm/vmalloc.c: keep track of free blocks for vmap allocation Patch series "improve vmap allocation", v3.5.1中提出的,5.2中合...

2021-07-07 15:02:22 467

原创 内核杂谈——qspinlock的流程理解

在高版本内核中,arm64的spinlock加入了MCS锁的实现机制,改为qspinlock独占原先的实现方式是arch_spin_lock,使用ldaxr和stxr指令实现锁变量的修改。这两个指令暗含独占监视器的功能。啰嗦一下独占操作的理解:ldxr和stxr是成对出现的。L = local;G = global对于一个内存地址,没被任何cpu访问的话是开放的,任何cpu都可以去占有这段地址,只要cpu执行ldxr就会标记此内存已被占有(L)。关键点在stxr。当一个cpu修改了独

2021-06-25 18:19:57 1085 1

原创 制作U盘启动盘/恢复U盘

制作U盘启动盘sudo dd if=xxx.iso of=/dev/sdb恢复U盘1.使用dd命令,将0写入U盘的前512字节(代表主引导记录中的引导代码和分区表)# count=1,写入一次# bs=512,写入的大小512(byte)# if=/dev/zero,从系统0读取0# of=/dev/sdb,写入到U盘中$ sudo dd count=1 bs=512 if=/dev/zero of=/dev/sdb#2.使用fdisk分区(最好先使用p查看一下还有没有分区,如果

2021-04-30 09:26:15 437

原创 简单的oops调试

oops~ # insmod /mnt/oops.ko[ 117.135066] oops: loading out-of-tree module taints kernel.[ 117.142239] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000[ 117.142564] Mem abort info:[ 117.142679] ESR = 0x960...

2021-04-17 17:58:20 638

原创 linux&内核收集录

进程systemd:浅析 Linux 初始化 init 系统锁Linux 死锁检测模块 Lockdep 简介其余内核资料网站内核杂志:https://lwn.net/内核Documentation:https://www.kernel.org/doc/html/latest/

2021-04-02 10:21:48 76

原创 内核杂谈——操作系统对page的使用

目录page_to_physpage_address__get_free_pagemk_pteslab举例:vmalloc表项的建立前面谈过一篇只谈page不谈ddr,是站在操作系统的角度来看待物理内存。实际上page只是一个外衣,只是一段物理地址的代号,alloc_page出来的page也不可能往里写东西,因为page存在vmemmap中,和实际的线性映射区不搭。下面举例一些page的使用方法page_to_phys#define page_to_phys(p

2021-03-02 15:40:18 1656

原创 内核杂谈——用户空间的页表

环境:ARM64,四级页表前言内核空间的页目录表的基地址为swapper_pg_dir,在内核初始化的时候,建立了swapper_pg_dir为基地址的页表,用于fixmap的永久映射区,获取早期的物理地址设备比如设备树等。而后面的线性映射的页表是临时的,在每级页表项映射完成的时候会清除这段映射,借助的地址是fixmap的临时映射区。这是通读内核启动代码时最直观接触到的。用户空间的页面获取一般是从缺页异常开始的,然后一步步建立页表项。关于页目录表的代码:#define pgd_in.

2021-02-12 22:32:33 911

原创 内核杂谈——页表项存放的是物理地址还是虚拟地址?

目录1 ~ 3 级表项4级表项总结pgd_t当你不去细细读代码的话,这个问题可能会困扰着你。我们以ARM64四级页表为例,谈谈页表项里藏得是什么。1 ~ 3 级表项从__create_pgd_mapping函数开始看:static void __create_pgd_mapping(pgd_t *pgdir, phys_addr_t phys, unsigned long virt, phys_addr_t size, pgprot_t prot,

2021-02-06 14:49:18 5218

原创 内核杂谈——揭开linux内核连续物理内存CMA的面纱

之前追CMA代码的时候,写了一篇文章基于ARM32的linux内存调节之CMA。今天就从使用的角度来看看CMA和普通内存的区别。默认CONFIG_CMA尝试思考几个问题:CMA在未加入内存的时候,是否是存放在memblock.reserved region中?众所周知CMA是由伙伴系统管理的,何以见得?伙伴系统如何对这部分页做分配处理的?当CMA要被使用的时候,如何真正变成CMA?简要回顾下上一篇博文在设备树中 /reserved-memory 节点下定义一块reser...

2021-02-03 15:59:31 535

原创 内核杂谈——只谈page,不谈ddr

整个系统只认识cpu总线的宽度,不认识物理内存ddr这些玩意,总线位数多大,系统就认为自己的怀抱有多大。linux内核分用户空间和内核空间。32bit中内核空间1G,用户空间3G。64bit,常用的内核空间512G,用户空间512G。虚拟地址中使用的内存管理单位为page,用struct page 描述。对物理地址实施的管理单位为页帧pfn。用户空间的运转离不开内核空间,可以说内核空间是幕后人,创建了用户空间运转的大部分条件。整个系统为什么分用户空间和内核空间?出于系统可以健壮运行,必须要做保护措施,于

2021-01-27 19:13:32 571 2

原创 linux内存调节之CMA

概述CMA(Contiguous Memory Allocator)是连续内存分配技术,是 Linux Kernel 内存管理系统的扩展,目的在于解决视频播放 (特别对于 4K 视频) 等需要预留大量连续内存导致运行内存紧张的问题。CMA 框架的主要作用不是分配内存,而是解析和管理内存配置,以及作为在设备驱动程序和可插拔的分配器之间的中间组件。数据结构1 . struct cma 结构用于维护一块 CMA 区域struct cma {unsigned long bas...

2020-12-07 10:34:01 3137

原创 有符号十六进制数转十进制

有符号十六进制数转十进制int main(){ unsigned int a = 0xd8; if (a & 0x80) { a -= 1; a = ~a; a &= 0x7f; a = -a; } printf("a %d\n", a); return 0;}示例的变量为八位数...

2020-12-04 18:29:13 1652

原创 内核杂谈——关于页表项大小的问题以及坑比的页表问题

页表项多大?首先需要抛开一级二级x级页表的概念。对于32位的地址空间,规定按4K一页来管理,可以分成2^32B / 4K = 2^20 个页。所以32位机器,页号范围是 0 ~ 2^20-1,这点毋庸置疑。现在要建造一样东西来管理这些页号,首先想到的就是数组,那数组每个元素定义多大才能保证覆盖所有的页号呢?最大页号2^20 - 1,十六进制 0xFFFFF,占了20位。所以数组元素囊括的数据要保证可使用到20位,也就是 0 ~ 0xFFFFF。好了,就按0xFFFFF来算吧,它占用多大?

2020-10-20 22:58:36 4007 17

原创 linux系统调用追踪及调试

本文介绍调试系统调用的两种方法一 自定义创建syscall debug系统调用自定义的debug系统调用需要自己申请一个系统调用接口,用一个flag的标志来控制打印。平台aarch641 添加系统调用号diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.hindex d901272..ea4d459 100644--- a/include/uapi/asm-gener.

2020-08-03 18:14:18 1745 1

原创 ARM64 手动搭建 kdump 环境

IBM crash教程从github下载源码编译时可能需要的依赖 sudo apt-get install libncurses5-dev sudo apt-get install zlib1g-dev进入crash目录编译32位ARM的crash:make target=ARM编译64位ARM的crash:make target=ARM64在当前目录下生成对应的crash文件编译拓展命令:在目录下执行make extensions(...

2020-07-21 16:29:54 3082 3

原创 虚拟机安装vmware tool和设置共享目录问题

背景:当我们兴高采烈的设置完共享目录后,cd /mnt,然后按下table键按了半天,意中人hgfs始终没出现。怒第一件事想到的就是重新安装vmware tools,使用熟悉的步骤发现是灰的!!!怒。但通常它会在这个目录下显示:/media/xxx/Vmware Tools发现也没有别急,希望还是有的点击虚拟机-设置,按如下操作第二步需要找到linux.iso,他躲在vmware的安装目录下点击确定后,他就出现了,进入/media/xxx/VMwa..

2020-07-19 18:54:03 398

原创 编写CMA驱动 遇到 error: dereferencing pointer to incomplete type

写了一个CMA驱动,make编译后:error: dereferencing pointer to incomplete type ‘struct cma’ cma->name, cma->base_pfn);意思是cma只是声明了。cma.h在目录include/linux/cma.h里,里面空有一句struct cma;对,这句只是做了声明,但并未做任何定义和初始化。那到底在哪定义的呢?很奇葩,在mm目录下还有一个cma.h,里面定义了cma结构体。...

2020-05-15 15:27:12 222

原创 vim里的着色

常用分组(可以自定义名字)Comment : 注释Constant : 常量,例如数字、引号内字符串、布尔值。Identifier : 变量标识符名称。Statement : 编程语言的声明,一般是像“if”或“while”这样的关键字。PreProc : 预处理,例如C语言中的“#include”。Type : 变量类型,例如“int”。Specia...

2020-02-21 15:19:45 442

原创 YouComplete问题汇总

YouComplete一些问题汇总

2020-02-20 22:12:38 952 2

原创 交叉编译opencv4.xx

转自我的微信公众号:嵌入式图像处理注意:本文只给出编译参考,还未测试---------------------------------------4.0.0后的版本需要编译器支持c++11虚拟机建议内存2G以上---------------------------------------------------------------------------------------...

2019-03-21 16:08:35 1466

原创 linux编译opencv4.0.1

微信公众号:嵌入式图像处理论坛:https://www.52cv.top/-------------------------------------------------------------------------------------------------------------4.0.0后的版本需要编译器支持c++11虚拟机建议内存2G以上--------------...

2019-03-21 16:01:18 1787

原创 vmware linux虚拟机中添加硬盘

微信公众号:嵌入式图像处理论坛:cv物联首先查看为添加硬盘时的盘符及分区imx@ubuntu:/dev$ ls sd*sda sda1添加新硬盘关闭Ubuntu,编辑虚拟机设置----添加---硬盘----下一步(SCSI)---下一步选择创建新硬盘-----选择磁盘大小,存储为单个文件---下一步----完成---确定为硬盘创建分...

2018-12-20 19:40:03 462

原创 core dumped ?完了?

微信公众号:嵌入式图像处理core dumped:当程序在运行过程中发生异常,这时linux系统可以把程序出错的内存内容存储在一个core文件中,又叫核心转存。应用程序在运行过程汇总经常会遇到segment fault,通常产生的原因:数组访问越界访问空指针栈溢出修改只读内存linux系统默认关闭core dumped功能,但可以通过u...

2018-12-09 10:58:02 4729

原创 手把手教你gdb调试

微信公众号:嵌入式图像处理gdb使用启动gdb调试的必须步骤1、编译生成可执行文件gcc -g xx.c -o xx2、启动GDBgdb xx3、在main函数处设置断点break main4、运行程序run选用gdb命令对程序进行后续调试[括号里为快捷键]list(l)查看...

2018-12-09 10:41:56 264

原创 结构体

更多详情尽在微信公众号:嵌入式图像处理常用写法设计结构体类型的时候,同时定义结构体变量struct{       int a;       int b;}st;    //定义一这个st是一个结构体变量,无法再使用结构体来定义变量(内核使用)struct A{       int a;       int b;}st;    //定义二这个st是一...

2018-09-21 18:10:10 324

原创 Qt5运行opencv3.4.0(Ubuntu)

获取下载链接命令行输入下载链接,此处以64位系统为例$wget https://download.qt.io/official_releases/qt/5.11/5.11.0/qt-opensource-linux-x64-5.11.0.run或者:$sudo apt-get install build-essential libgl1-mesa-dev再或者自行下载https:/...

2018-08-24 10:51:29 515

原创 linux下安装opencv3.4.0

微信公众号:嵌入式图像处理论坛:cv物联此博文会在公众号中更新准备工作安装一些库(g++环境和OpenCV可适应环境)sudo apt-get install build-essentialsudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscal...

2018-08-24 10:36:08 15174

数据结构殷人昆教材c++代码【手敲亲自实践】

数据结构殷人昆第二版清华大学出版社。内容顺序表、单链表、栈、链式栈、队列、链式队列、二叉树、图、散列、二叉搜索树等。更多关注微信公众号,嵌入式图像处理,

2018-10-06

空空如也

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

TA关注的人

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