linux
文章平均质量分 78
LuckY_chh
微信公众号:linux码头
展开
-
杂谈 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 · 1028 阅读 · 0 评论 -
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 · 1094 阅读 · 0 评论 -
内核杂谈——关于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 · 1428 阅读 · 0 评论 -
内核杂谈——浅谈kdump机理
引言百分之百肯定的是,如果你的内核崩溃了,没有发生重启,那就说明重启内核是有问题的,谁来控制重启内核呢,答案是 kexec 工具。kexec 工具的任务就是将重启内核保存到内核空间里,只要这个工具起来,指定的内核文件没有问题,就会默默的将这个内核文件保存到内核空间里,类似于open,然后系统发生死机后,就可以转生。明确一点,kexec并不是发生死机后才开始生效的,她是一个用户态程序,死机了还执行个锤子。kexec和内核交互的工具,本质上是一个系统调用。...原创 2021-11-09 17:42:17 · 1117 阅读 · 0 评论 -
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 · 1640 阅读 · 0 评论 -
在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 · 778 阅读 · 0 评论 -
捋一下工作队列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 · 1298 阅读 · 0 评论 -
捋一下等待队列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 · 545 阅读 · 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 · 521 阅读 · 0 评论 -
内核杂谈——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 · 1187 阅读 · 1 评论 -
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 · 538 阅读 · 0 评论 -
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 · 15268 阅读 · 0 评论 -
制作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 · 484 阅读 · 0 评论 -
简单的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 · 708 阅读 · 0 评论 -
内核杂谈——操作系统对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 · 1787 阅读 · 0 评论 -
内核杂谈——学内存管理
把下述的源码追几遍就ok了,基础算是扎实了。写的内容有限,但代码无限。页表建立页表建立存在于用户空间的地址和内核空间的地址。二者有着微妙的差别。内核空间页表建立内核空间的页全局目录表为swapper_pg_dir,只要是内核地址(如何区分?pgd_offset使用参数init_mm 和 mm来区别建立映射)就使用这个pgd,而且内核空间地址都统一使用这个pgd。一开始建立的时候肯定是空空的啥都没有,尤其在建立设备树的映射中连物理内存都摸不到。但办法总是有的,使用内核映像里的bm_pXd.原创 2021-03-01 11:34:10 · 177 阅读 · 0 评论 -
linux&内核收集录
进程systemd:浅析 Linux 初始化 init 系统锁Linux 死锁检测模块 Lockdep 简介其余内核资料网站内核杂志:https://lwn.net/内核Documentation:https://www.kernel.org/doc/html/latest/原创 2021-04-02 10:21:48 · 101 阅读 · 0 评论 -
内核杂谈——用户空间的页表
环境:ARM64,四级页表前言内核空间的页目录表的基地址为swapper_pg_dir,在内核初始化的时候,建立了swapper_pg_dir为基地址的页表,用于fixmap的永久映射区,获取早期的物理地址设备比如设备树等。而后面的线性映射的页表是临时的,在每级页表项映射完成的时候会清除这段映射,借助的地址是fixmap的临时映射区。这是通读内核启动代码时最直观接触到的。用户空间的页面获取一般是从缺页异常开始的,然后一步步建立页表项。关于页目录表的代码:#define pgd_in.原创 2021-02-12 22:32:33 · 1015 阅读 · 0 评论 -
内核杂谈——页表项存放的是物理地址还是虚拟地址?
目录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 · 5921 阅读 · 0 评论 -
内核杂谈——揭开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 · 602 阅读 · 0 评论 -
内核杂谈——只谈page,不谈ddr
整个系统只认识cpu总线的宽度,不认识物理内存ddr这些玩意,总线位数多大,系统就认为自己的怀抱有多大。linux内核分用户空间和内核空间。32bit中内核空间1G,用户空间3G。64bit,常用的内核空间512G,用户空间512G。虚拟地址中使用的内存管理单位为page,用struct page 描述。对物理地址实施的管理单位为页帧pfn。用户空间的运转离不开内核空间,可以说内核空间是幕后人,创建了用户空间运转的大部分条件。整个系统为什么分用户空间和内核空间?出于系统可以健壮运行,必须要做保护措施,于原创 2021-01-27 19:13:32 · 636 阅读 · 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 · 3494 阅读 · 0 评论 -
内核杂谈——关于页表项大小的问题以及坑比的页表问题
页表项多大?首先需要抛开一级二级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 · 4410 阅读 · 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 · 1982 阅读 · 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 · 3473 阅读 · 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 · 453 阅读 · 0 评论 -
编写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 · 246 阅读 · 0 评论 -
vim里的着色
常用分组(可以自定义名字)Comment : 注释Constant : 常量,例如数字、引号内字符串、布尔值。Identifier : 变量标识符名称。Statement : 编程语言的声明,一般是像“if”或“while”这样的关键字。PreProc : 预处理,例如C语言中的“#include”。Type : 变量类型,例如“int”。Specia...原创 2020-02-21 15:19:45 · 486 阅读 · 0 评论 -
YouComplete问题汇总
YouComplete一些问题汇总原创 2020-02-20 22:12:38 · 1065 阅读 · 2 评论 -
交叉编译opencv4.xx
转自我的微信公众号:嵌入式图像处理注意:本文只给出编译参考,还未测试---------------------------------------4.0.0后的版本需要编译器支持c++11虚拟机建议内存2G以上---------------------------------------------------------------------------------------...原创 2019-03-21 16:08:35 · 1543 阅读 · 0 评论 -
linux编译opencv4.0.1
微信公众号:嵌入式图像处理论坛:https://www.52cv.top/-------------------------------------------------------------------------------------------------------------4.0.0后的版本需要编译器支持c++11虚拟机建议内存2G以上--------------...原创 2019-03-21 16:01:18 · 1820 阅读 · 0 评论 -
vmware linux虚拟机中添加硬盘
微信公众号:嵌入式图像处理论坛:cv物联首先查看为添加硬盘时的盘符及分区imx@ubuntu:/dev$ ls sd*sda sda1添加新硬盘关闭Ubuntu,编辑虚拟机设置----添加---硬盘----下一步(SCSI)---下一步选择创建新硬盘-----选择磁盘大小,存储为单个文件---下一步----完成---确定为硬盘创建分...原创 2018-12-20 19:40:03 · 489 阅读 · 0 评论 -
core dumped ?完了?
微信公众号:嵌入式图像处理core dumped:当程序在运行过程中发生异常,这时linux系统可以把程序出错的内存内容存储在一个core文件中,又叫核心转存。应用程序在运行过程汇总经常会遇到segment fault,通常产生的原因:数组访问越界访问空指针栈溢出修改只读内存linux系统默认关闭core dumped功能,但可以通过u...原创 2018-12-09 10:58:02 · 4874 阅读 · 0 评论 -
手把手教你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 · 368 阅读 · 0 评论