- 博客(93)
- 资源 (3)
- 收藏
- 关注
原创 ARM64 pcie msi-x中断申请注册过程
我们来看一下pcie msi-x中断是怎样注册的,他的中断是写在设备树中的,还是动态分配的。先说一下结论,pcie msi-x的中断是内核动态分配的。
2024-10-15 16:49:12
638
原创 yocto编辑软件包-devtool的使用方法
假设你有一个软件包名叫foo,并且已经下载编译过,需要修改它的源码并生成patch。之前用了很多次devtool,总是忘记用法,故此记录一下。
2024-10-14 15:46:46
660
原创 GIC v3 详解
公用的外部设备中断,也定义为共享中断。可以多个Cpu或者说Core处理,不限定特定的Cpu。比如按键触发一个中断,手机触摸屏触发的中断。私有外设中断。这是每个核心私有的中断。PPI会送达到指定的CPU上,应用场景有CPU本地时钟。软件触发的中断。软件可以通过写GICD_SGIR寄存器来触发一个中断事件,一般用于核间通信。LPI是GICv3中的新特性,它们在很多方面与其他类型的中断不同。LPI始终是基于消息的中断,它们的配置保存在表中而不是寄存器。比如PCIe的MSI/MSI-x中断。
2024-09-25 14:54:45
1185
原创 arm64 中断处理流程
总的来说就是irqchip初始化domain,建立好irq所对应的desc,desc在整个irq系统里面是关键的数据结构。驱动程序获得irq之后使用request_irq向desc中插入action,之后中断到来根据hwirq查找softirq,然后根据softirq找到desc,然后遍历desc上的每个action,执行当初request_irq注册的回调函数。以上过程结束之后继续执行一部分软中断,至此整个中断处理的主要过程结束。
2024-09-19 18:09:33
1199
原创 优化瑞芯微rk3566 tf卡速度uhs SDR104
我手头用的是一张金士顿的高性能tf卡,开机启动发现比emmc慢不少,用dd命令简单测速发现tf卡读写速度都只有25Mb/s而这个卡在usb3.0读卡器加持下可以达到80Mb/s的写入,150Mb/s的读取速度,最后发现SDIO工作模式不正确导致的,下面说一下解决过程,方法理论上适用于所有支持sdio uhs的开发板。只需要将sdio口的评率设置上去即可,这个时候再看debugfs会发现评率其实已经切换了,但是模式还没有切换,这个不用担心,之后对tf进行读写操作就会切换tf卡的模式为uhs SDR104了。
2023-12-09 15:18:35
2289
原创 android Native C++打印堆栈
1.在要打印堆栈的模块中添加libutilscallstack、libutils两个共享库依赖,有可能是Android.mk,也有可能是Android.bp。记录一下Android堆栈打印方法,程序运行堆栈在分析代码运行逻辑中非常有用。注意CallStack 在android名字空间中。
2023-08-07 15:29:44
2815
1
原创 RedmiBook pro15 2023款折腾笔记(7840HS)amd-pstat解决APU睿频问题
总体上来说RedmiBook pro15 2023这个本本对linux来说还是很友好的,声卡,键盘和触摸板驱动在现有的Linux中都有驱动,键盘背光,功能键也都正常没有什么太大的问题,喜欢折腾的可以吧小爱同学键也适配一下,遇到其他问题的同学欢迎留言私信交流。这里记录一下RedmiBook pro15 2023款笔记本(7840HS)搭建ubuntu 22.04系统的记录,留给正好需要在这个笔记本上安装linux环境的童鞋参考一下,其他AMD的APU都是类似的。
2023-08-02 15:22:02
3812
9
原创 记录一次jbd2不停写磁盘原因追查
但是,一旦我们启用了“lazyinit”特性后,ext4文件系统的创建将显著加快,因为它不会立即初始化所有inode表,而是在后台的初始挂载过程中逐步初始化它们(内核版本2.6.37),这个过程会对文件系统的写入产生影响。这里我还是比较看好xfs文件系统的,动态inode生成,用多少,生成多少,还能后期扩展,成熟稳定。好家伙,这会终于看到元凶了。因为是企业盘的原因,并不支持电源管理,要么运行,要么停止,试了一下就只有hd-idle能让他停下,hdparam是基于电源管理的,对这个机械硬盘并不起作用。....
2022-08-08 10:55:51
5823
原创 替代chroot、docker,使用systemd-nspawn容器搭建ARM交叉编译环境(2)
1: 替代chroot、docker,使用systemd-snpawn容器搭建ARM交叉编译环境(1)2: 替代chroot、docker,使用systemd-snpawn容器搭建ARM交叉编译环境(2)上一篇说到了systemd-snpawn的基本使用方法,这边来说一下他的一些贴心功能systemd-snpawn文件主属问题systemd-snpawn -D与systemd-snpawn -bD启动的系统文件主属并不一致,要注意在systemd-snpawn -D下尽量少做操作,毕竟我们主要是在s
2022-05-31 11:09:16
730
原创 替代chroot、docker,使用systemd-nspawn容器搭建ARM交叉编译环境(1)
简介什么是 systemd-nspawn?systemd 项目认为应当将容器技术变成桌面的基础部分,并且应当和用户的其余系统集成在一起。为此,systemd 提供了 systemd-nspawn,这款工具能够使用多种 Linux 技术创建容器。它也提供了一些容器管理工具。systemd-nspawn 和 chroot 在许多方面都是类似的,但是前者更加强大。它虚拟化了文件系统、进程树以及客户系统中的进程间通信。它的吸引力在于它提供了很多用于管理容器的工具,例如用来管理容器的 machinectl。由
2022-05-30 18:04:57
3318
1
原创 从ssh启动wayland环境下的应用
以前在X11环境下面只需要export了DISPLAY=:0就可以,wayland的需要多加一项 XAUTHORITYexport DISPLAY=:0export XAUTHORITY=~/.Xauthority
2022-05-05 13:24:12
1873
1
原创 qemu-virtio基本原理
virtio比较零散抽象,看了几回也没看懂怎么回事,记录一下自己的理解,不知道怎样组织内容,就以问答的形式吧。virtio整体流程是怎样的?盗用网上的一张图:一开始我也看不明白这里面都画了些啥东西,后面慢慢抽丝剥茧吧。virtio是如何实现共享内存的?大家都知道virtio以共享内存的零拷贝实现高性能的,理解virtio内存共享是理解virtio的基础。virtio实现共享内存基于两个基本的条件:qemu或者说host可以访问guest的任意内存地址的内容。qemu知道guest中物理地
2021-06-22 11:29:59
5160
3
原创 Android QEMU 高速管道(goldfish_pipe)
目录简介用法源码opengles相关网址简介goldfish_pipe是android中实现的一个高速管道驱动程序,主要应用在虚拟化场景中。goldfish_pipe为android内核与qemu之间提供了一个高性能的管道。其实现原理是共享内存,算是一个极简化的virtio的实现吧。要使用goldfish_pipe需要使用google提供的专用qemu。用法goldfish_pipe驱动对应的字符设备路径在/dev/goldfish_pipe下面,通过读写这个文件就可以完成guest与qemu之间的
2021-06-17 18:22:13
2473
3
原创 qemu声卡模拟原理-声音播放(pa+ac97)
之前声卡初始化说道了SWVoiceOut、HWVoiceOut两个结构体,在讲解声音播放之前有必要先介绍一下这两个对象。QEMUSoundCard:建模一个给定的模拟的声卡SWVoiceOut:建模一个来自 QEMUSoundCard 的音频输出HWVoiceOut:建模一个主机端的音频输出(后端)虚拟声卡的启动虚拟声卡由虚拟机内部调用启动,主要流程如下:ac97.c:nabm_write-> ac97.c:nabm_writeb-> ac97.c:voice_set_acti
2021-05-17 15:00:34
2076
2
原创 qemu声卡模拟原理-声卡初始化(pa+ac97)
后端初始化pa后端的源码在:audio/paaudio.c在vl.c的qemu_create_early_backends开始初始化,初始化主体流程如下:vl.c:qemu_create_early_backends-> audio.c:audio_init_audiodevs-> audio.c:audio_init-> audio.c:audio_driver_init-> paaudio.c:qpa_audio_init设备初始化模拟设备的初始化与
2021-05-17 14:58:48
1563
1
原创 qemu声卡模拟原理-基本使用方法
qemu版本:5.2.50qemu声卡的模拟分为模拟声卡和声卡后端设备两个部分,模拟声卡主要为虚拟机提供一个模拟的硬件设备,后端负责处理模拟声卡的声音数据,可以是直接播放声音、存储为文件或者传送到远程进行播放。创建后端设备要模拟声卡首先要考虑音频的后端是被是什么,后端设备大致有:oss、spice、sdl、wav、alsa、pa这几种。pa后端pa其实就是linux上的音频服务pulseaudio,在linux本地播放声音选择pa作为后端是一种较好的方式。oss、alsa都不建议选择,他们会独占声
2021-05-17 14:58:03
4414
2
原创 linux用户层驱动-uio
UIO(Userspace I/O)是运行在用户空间的I/O技术。UIO适合在编写大型驱动程序的时候使用,它免去了频繁的内核模块的切换与重启。另外某些情况下性能也比内核驱动好,比如典型的应用例子就是dpdk。除了实现用户态驱动以外UIO也适合在虚拟化的时候做设备透传,相较于VFIO也是一种不错的选择。1.UIO的工作方式设备驱动的编写无非是两件事情:1.设备内存的读写2.中断的响应UIO实现了mmap,可以实现映射物理内存到虚拟内存供用户层读写。中断的响应必须在内核进行,UIO在内核实现了很少一
2021-01-15 15:35:24
1458
1
原创 qemu虚拟化-pci框架
pci大体上比较类似sysbus,理解的时候最好类比。pci主要的工作是帮助pci设备管理configure的配置、模拟configure中的内存映射事件。老规矩,框架的解说从注册开始1.pci总线的注册设备的注册最早从pci_register_root_bus开始,一般是由具体的架构初始化的时候调用。下面看一下具体流程hw/pci/pci.c->pci_register_root_bus ->pci_root_bus_new ->qbus_create ->pci
2021-01-13 17:57:38
1128
2
原创 qemu虚拟化-pci设备模拟
pci设备算是学习qemu必须要掌握的一类设备的模拟,单独提出来说一下。这里以qemu的pci教学程序为基础讲解,源码路径:hw/misc/edu.c1.设备的定义typedef struct { PCIDevice pdev; MemoryRegion mmio; QemuThread thread; QemuMutex thr_mutex; QemuCond thr_cond; bool stopping; uint32_t addr4;
2021-01-13 17:54:46
2854
1
原创 qemu虚拟化-qom框架(qom进阶之设备初始化)
接上一篇文章中介绍的qom的基本用法和qom面向对象实现原理,这一篇讲一下qom实现的源码1.初始化函数的注册类型注册的调用接口是type_init(xxx_register_types),type_init是个宏定义,最终原理是gcc 的constructor属性,添加这个属性描述的函数为初始化函数,会在main函数执行之前执行,最后宏定义的作用就是在xxx_register_types 之前加上一个__attribute__((constructor)),再改改名字。目的是在main函数之前就注册好
2021-01-13 11:21:48
1295
原创 qemu虚拟化-设备模拟本质
设备驱动只不过是对一些寄存器的读写操作,对于底层来说就是一些内存地址。对于虚拟化来说,只是需要捕获这些特殊地址的读写操作,然后根据硬件逻辑进行模拟,最后吧模拟结果注入进guest即可。看一下老外的解释:July, 2017Here are some notes that may help newcomers understand what is actually happening with QEMU devices:With QEMU, one thing to remember is that w
2021-01-13 09:43:35
1506
原创 qemu虚拟化-设备模拟详解
这里还是以stm32uart的模拟为例子讲解,源码路径为hw/char/stm32f2xx_uart.c1.设备的定义typedef struct { /* <private> */ SysBusDevice parent_obj; /* <public> */ MemoryRegion mmio; uint32_t usart_sr; uint32_t usart_dr; uint32_t usart_brr;
2021-01-12 16:56:27
3658
原创 qemu虚拟化-面向对象qom与设备的添加
1.qemu中的qom作为一个应用层开发的人来说,qemu的qom面向对象的实现有点奇奇怪怪,它有别于常规语言java、c++、c#的实现机制,也不同于javascript那种原型链的实现方式,也不同于lua那种hash表的实现方式。第一次看qom我也很难理解。首先面向对象有两个基本概念:1.类(class)2.实例(instance)类是对象的类型、实例是类初始化后的对象。用惯了面向对象语言可能会对类的管理操作比较少,平时只需要定义即可。在这里特别提醒需要注意类的操作,否则后面类的操作理解起来会
2021-01-12 15:45:34
1673
1
原创 git 配置查看分支图
在git config文件里面设置别名。git config --global alias.lg “log --graph --all --pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’ --abbrev-commit --date=relative”然后通过命令git lg来列出分支图...
2020-12-25 18:36:46
1169
原创 linux开启磁盘多队列(blk-mq)
新版内核在blk层加入了多队列功能,可以尽情发挥SSD的性能,开启多队列可以在编译内核的时候默认开启,也可以通过启动参数配置scsi_mod.use_blk_mq在/etc/default/grub中添加参数:GRUB_CMDLINE_LINUX="scsi_mod.use_blk_mq=1" # 1是开启 0是关闭更新grub:sudo update-grub或者直接编辑/boot/grub/grub.cfg在vmlinuz开头的一行结尾处添加scsi_mod.use_blk_mq
2020-12-25 11:44:25
3880
1
原创 37.【linux驱动】pcie驱动入门
pcie总线向下兼容pci总线,文中所述pci默认等于pciepcie拓扑结构pcie拓扑主要由总线、桥和设备卡组成,桥将父总线与子总线连接在一起形成树型结构。桥主要分为一下三类:Host/PCI桥:用于连接CPU与PCI根总线,在PC中,内存控制器也通常被集成到Host/PCI桥设备芯片,Host/PCI桥通常被称 为“北桥芯片组”。PCI/ISA桥:用于连接旧的ISA总线。PCI/ISA桥也被称为“南桥芯片组”。PCI-to-PCI桥:用于连接PCI主总线与次总线。pci总线编号采用
2020-08-05 12:44:33
3031
原创 【NanoPi T2】 8.uboot gmac网卡驱动(4) - 移植rtl8211e网卡驱动(首发)
调试过程就不多说了,还是比较坎坷的,遇到了很多问题。配置设备树打开gmac设备arch/arm/dts/s5p4418-nanopi2.dts这里还是稍微做下解释吧,网卡设备已经有配置了,在arch/arm/dts/s5p4418.dtsi不记得我是否有改过,因为一开始GPIO的配置不正确,自己有写代码初始化过,但是后来发现设备树里面定义好了GPIO的配置,就是上面这一排pinctrl,具体配置在arch/arm/dts/pinctrl.dtsi`添加宏定义添加一下phy宏定义,配置
2020-07-29 20:03:54
4226
6
原创 【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析
这里写目录标题一级目录二级目录三级目录一级目录二级目录三级目录
2020-07-29 19:32:27
3199
原创 36.【linux驱动】spi framebuffer驱动(切换并显示虚拟终端)
切换终端输出接这上一节spi framebuffer驱动实现了,但是只有刷屏。6个虚拟终端并没有显示在屏幕上,要想办法让虚拟终端显示到我们的fb上面来。最总虚拟终端的源代码(过程不详述),发现了这么个地方:/driver/video/console/fbcon.cstatic int fbcon_event_notify(struct notifier_block *self, unsigned long action, void *data){ struct fb_event
2020-07-27 20:57:08
1688
4
原创 35.【linux驱动】spi framebuffer驱动
spi framebuffer驱动上一节实现了一个framebuffer驱动,但是没有具体操作硬件,这节做一个SPI屏驱动,整个代码作为一个spi驱动去写。spi相关内容可以看()[]。首先是spi驱动,屏幕的操作由厂家C51代码改编而来。屏幕控制器是ILI9488,分辨率320 * 480spi部分spi.hstruct Lcd_dev{ unsigned short width; //LCD 宽度 unsigned short height; //L
2020-07-27 20:14:47
1985
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人