自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(88)
  • 资源 (3)
  • 收藏
  • 关注

原创 优化瑞芯微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 748

原创 android Native C++打印堆栈

1.在要打印堆栈的模块中添加libutilscallstack、libutils两个共享库依赖,有可能是Android.mk,也有可能是Android.bp。记录一下Android堆栈打印方法,程序运行堆栈在分析代码运行逻辑中非常有用。注意CallStack 在android名字空间中。

2023-08-07 15:29:44 1386 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 2263 9

原创 btrfs优化参数,开启zstd

compsize是btrfs用来查看文件压缩信息的命令,可以看到压缩效果还是很不错的。

2023-07-31 15:13:31 407

原创 记录一次jbd2不停写磁盘原因追查

但是,一旦我们启用了“lazyinit”特性后,ext4文件系统的创建将显著加快,因为它不会立即初始化所有inode表,而是在后台的初始挂载过程中逐步初始化它们(内核版本2.6.37),这个过程会对文件系统的写入产生影响。这里我还是比较看好xfs文件系统的,动态inode生成,用多少,生成多少,还能后期扩展,成熟稳定。好家伙,这会终于看到元凶了。因为是企业盘的原因,并不支持电源管理,要么运行,要么停止,试了一下就只有hd-idle能让他停下,hdparam是基于电源管理的,对这个机械硬盘并不起作用。....

2022-08-08 10:55:51 3269 1

原创 替代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 527

原创 替代chroot、docker,使用systemd-nspawn容器搭建ARM交叉编译环境(1)

简介什么是 systemd-nspawn?systemd 项目认为应当将容器技术变成桌面的基础部分,并且应当和用户的其余系统集成在一起。为此,systemd 提供了 systemd-nspawn,这款工具能够使用多种 Linux 技术创建容器。它也提供了一些容器管理工具。systemd-nspawn 和 chroot 在许多方面都是类似的,但是前者更加强大。它虚拟化了文件系统、进程树以及客户系统中的进程间通信。它的吸引力在于它提供了很多用于管理容器的工具,例如用来管理容器的 machinectl。由

2022-05-30 18:04:57 2309 1

原创 从ssh启动wayland环境下的应用

以前在X11环境下面只需要export了DISPLAY=:0就可以,wayland的需要多加一项 XAUTHORITYexport DISPLAY=:0export XAUTHORITY=~/.Xauthority

2022-05-05 13:24:12 1311 1

原创 qemu-virtio基本原理

virtio比较零散抽象,看了几回也没看懂怎么回事,记录一下自己的理解,不知道怎样组织内容,就以问答的形式吧。virtio整体流程是怎样的?盗用网上的一张图:一开始我也看不明白这里面都画了些啥东西,后面慢慢抽丝剥茧吧。virtio是如何实现共享内存的?大家都知道virtio以共享内存的零拷贝实现高性能的,理解virtio内存共享是理解virtio的基础。virtio实现共享内存基于两个基本的条件:qemu或者说host可以访问guest的任意内存地址的内容。qemu知道guest中物理地

2021-06-22 11:29:59 4544 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 1868 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 1559 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 1198 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 3141 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 1147 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 914 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 2159 1

原创 qemu虚拟化-设备模拟框架源码解析(sysbus模拟)

1.

2021-01-13 13:09:25 987

原创 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 966

原创 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 1226

原创 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 2960

原创 qemu虚拟化-面向对象qom与设备的添加

1.qemu中的qom作为一个应用层开发的人来说,qemu的qom面向对象的实现有点奇奇怪怪,它有别于常规语言java、c++、c#的实现机制,也不同于javascript那种原型链的实现方式,也不同于lua那种hash表的实现方式。第一次看qom我也很难理解。首先面向对象有两个基本概念:1.类(class)2.实例(instance)类是对象的类型、实例是类初始化后的对象。用惯了面向对象语言可能会对类的管理操作比较少,平时只需要定义即可。在这里特别提醒需要注意类的操作,否则后面类的操作理解起来会

2021-01-12 15:45:34 1354 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 1101

原创 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 3458 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 2365

原创 【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 3544 6

原创 【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析

这里写目录标题一级目录二级目录三级目录一级目录二级目录三级目录

2020-07-29 19:32:27 2569

原创 【NanoPi T2】 6.uboot gmac网卡驱动(2) - 寄存器介绍

这里写目录标题

2020-07-29 18:16:53 1407 1

原创 【NanoPi T2】 5.uboot gmac网卡驱动(1) - mac控制器,phy芯片,rgmii协议

这里写目录标题

2020-07-29 17:19:08 2644

原创 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 1279 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 1284

原创 34.【linux驱动】framebuffer驱动

2

2020-07-27 19:59:42 487

原创 32.【linux驱动】一文读懂linux设备驱动模型(常见总线bus)

1

2020-07-27 18:35:37 663

原创 31.【linux驱动】一文读懂linux设备驱动模型(总线bus)

4

2020-07-25 00:59:46 368

原创 30.linux内核 阻塞/非阻塞IO

阻塞IO等待队列非阻塞IOpoll/select/epoll

2020-07-24 23:42:40 223

原创 29.linux内核(线程/进程)同步——完成量

完成量

2020-07-23 16:26:51 208

原创 28.linux内核(线程/进程)同步——互斥锁

互斥锁

2020-07-23 16:00:38 268

原创 27.linux内核(线程/进程)同步——信号量

信号量

2020-07-23 15:39:55 260

原创 26.linux内核(线程/进程)同步——自旋锁

自旋锁自旋锁(spin lock)是一种排他锁,采用死循环来竞争资源,竞争不到就无限尝试,所以又叫自旋锁。适合短生命周期的资源竞争,比较浪费CPU,实现原理就是上一篇当中的原子操作。当strex操作失败后会重新进入 ldrex 再 strex 的过程,无限尝试下去,直到成功。相关api在 spinlock.h 中//定义锁spinlock_t data_lock;//初始化锁spin_lock_init(_lock)//上锁,如果锁不上就会自旋void spin_lock(spinlock_

2020-07-23 00:50:55 364

原创 25.linux内核(线程/进程)同步——原子操作

原子操作原子操作主要是借助汇编指令strex 和 ldrex 。使用ldrex 总线会监控有没有其他实体存取该地址,如果有会其他实体进行strex操作会失败,只有当本实体strex后其他实体才可以strex。这两个操作对应的内核封装在atomic.h中//设置变量的值#define ATOMIC_INIT(i) { (i) }#define atomic_set(v,i) (((v)->counter) = (i))//读取#define atomic_read(v) (*(volat

2020-07-23 00:50:12 532

原创 24.linux内核(线程/进程)同步——内存屏障

多核同步需要关注的第一件事就是自己的值被有序确切的写入了内存。由于编译器优化,CPU cache机制以及CPU乱序执行的原因,在多核CPU多线程条件下,线程或者进程交换数据未必是预期中的结果。这个时候就需要使用内存屏障来解决这个问题。gcc编译选项我们使用gcc的gcc-objdump -d来反汇编代码,查看编译结果。通常情况下gcc会默认连接启动文件crtl.o、crti.o、crtend.o,这些会干扰我们查看汇编代码。使用-nostartfiles编译选项禁止连接启动文件。另外还会连接标准库,使

2020-07-22 16:35:59 394

uboot2016.zip

nanopi t2 uboot,基于uboot2016版本编译,可直接使用dd命令烧写到sd卡,纯uboot不带其他任何东西

2020-05-06

nanopi 裸机开发工程

nanopi 裸机开发工程,包含Nish,2nboot,Nish+2nboot,Nish+2nboot+uboot,Nish+2nboot+测试代码

2020-04-29

空空如也

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

TA关注的人

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