- 博客(159)
- 收藏
- 关注

原创 FPGA PCIE驱动,windriver驱动 wdf驱动 windows linux PCIE DMA驱动 支持win10 server2016
一:相关介绍 本人一直从事fpga pcie dma驱动开发,可以开发windwos Linux原生驱动 wdf 或者基于第三方库的windriver。支持win10 win server。提供稳定的驱动库,或者源码,开发者可以不关心底层驱动直接使用封装的库。二:PCIE 驱动开发的稳定性和高效性:本驱动库均已经进行了实际交付使用,通过了严格的jun...
2020-12-14 23:24:42
4060
2
原创 Linux重定向 >file 2>&1 与 2>&1 >file 本质原理
不要被表面迷糊,当你傻傻分不清上、记不住这些命令不妨看下底层实现。1.dup2int dup2(int oldfd, int newfd);dup2的功能就是复制描述符,把old复制到new,所以结果就是old和new指向同一个描述符。 如果newfd已经打开,则先将其关闭。如果newfd等于oldfd,则dup2返回newfd, 而不关闭它。#include <string.h>#include <unistd.h>#include <fcntl.h&
2022-04-23 14:56:22
1706
原创 ARMv8之内存属性
普通内存设备内存#define MT_NORMAL 0#define MT_NORMAL_TAGGED 1#define MT_NORMAL_NC 2#define MT_DEVICE_nGnRnE 3#define MT_DEVICE_nGnRE 4/* * Memory types for Stage-2 translation */#define MT_S2_NORMAL 0xf#define MT_S2_DEVICE_nGnRE 0x1/* * Mem
2022-01-22 00:33:58
1059
原创 为什么Uboot阶段要关MMU,关DCache、开ICache
我看了网上好多人的答案,大部分答案还是没有回答出为什么,以及开启的话可能面临的问题。最后一个问题是,为什么D-cache被禁用,而I-cache却可以开?为了加快仪器的运行速度?MMU可以决定哪些内存区域可以缓存,哪些不可以。如果你没有打开MMU,但你打开了数据缓存(如果可能的话,对于一些硬件压根从硬件上就不支持),那么你就不能安全地与外围设备交互。例如,如果你读取uart状态寄存器,就像其他数据操作一样,要经过缓存,无论该状态是什么,都会留在缓存中供以后的读取,直到该缓存行被驱逐,你才能再获得
2022-01-12 15:24:02
4605
5
原创 内核调试之early printk
early printk 解决什么问题那?本质也是打印调试信息,但是不同于printk,printk属于打印的一个框架,既然是框架必然需要一些必备条件,框架的初始化等,在内核启动初期这些框架都没来得及初始化,所以这些函数肯定不能用,eary pritnk实现就比较直接简单,就是直接调用对应芯片的串口寄存器,把数据写到串口控制器寄存器里面,只要你芯片启动了就能输出。各个架构下都实现了earlyprintkKernel hacking ---> arm Debugg...
2021-12-20 21:55:10
1018
原创 Uboot从各种存储设备上(sd、mmc、nand、nor)加载内核命令
load zImage, dtb, and rootfs to RAMset bootargs for linuxbootz zImage_addr rootfs_addr dtb_addr, if don't need rootfs, please put "-"boot from emmc(ext4 format), emmc partition 2 exist rootfs.The U-Boot Documentation — Das U-Boot unknown version d.
2021-11-15 23:01:39
2777
原创 DDR的Controller、Channel、Chip、Rank、Bank、Row、Column、Sided、Dimm
DDR的Controller、Channel、Chip、Bank、Rank、Row、Column、Sided、Dimm
2021-11-05 01:46:23
20141
2
原创 linux下彻底关闭磁盘记录日志
有时候因为一些硬件或者驱动bug,导致操作系统频繁的打印日志,最后会导致/var/log占满,临时的解决方案就是关闭linux下的日志,基本上就是几条命令:在许多操作系统上,Syslog 已被 rsyslog 取代。因此,在 Debian > 5、Ubuntu > 11.2、Centos 6.x 上,以下命令行将停止它:关闭 krn.log 和 syslogservice rsyslog stop然后,您可以在启动时禁用它:systemctl disable rs...
2021-10-20 12:44:23
3928
原创 linux内核调试之PRINTXXX
1.printxxx是最简单也是最有效的调试方式。printkhttps://elixir.bootlin.com/linux/latest/source/include/linux/printk.h#L389/*自定义*/#define pr_fmt(fmt) "CPU features: " fmt/** * pr_emerg - Print an emergency-level message * @fmt: format string * @...: arguments fo
2021-10-16 02:45:26
491
原创 Linux内核模块调试一
在windows 下编程最舒服的就是其面向事件的线程同步互斥机制,在最开始的时候我就考虑一个问题,事件会不会丢失?其实对于会不会丢失要看他的底层实现机制,如果底层是一个队列当然不会丢失,底层要仅仅是一行位图,那写100次1和写1一次1的区别就是你的识别够不够快,你能不能辨别出这个1变化了一百次。...
2021-09-30 02:29:35
2497
原创 linux内核启动参数
先看官方文档:https://elixir.bootlin.com/linux/latest/source/Documentation/admin-guide内存相关的启动参数基本分为俩类,驱动模块和系统本身。1.内存相关的启动参数:mem=nn[KMG]其中KMG 是单位对应KB MB 和GB ,这个参数的意思是明确linux可用内存范围,例如mem=1024M表示linux内存可使用1024M,并且是从0开始,mem=size@start_addr这种写法其实内核文档并没有说,可能.
2021-09-08 18:02:12
1015
原创 linux下的各种c库
一:起源 对于内核kfifo的分析源于工作,去年我配合fpga工程师写一个多路的PCIE的DMA驱动,由于性能要求,需要对DMA回来的数据解析分包,存储到后端存储设备中。我的设计方案是解析后将各个通道打到各个通道的队列中,队列的设计考虑到性能,我想了很久。首先想到了环形队列,环形队列的好处是,我申请一块内存占着,可以反复使用,当然这也是他的缺点,看具体的业务场景了。...
2021-06-21 20:31:44
633
原创 Lwip 奔溃掉线内存申请不出来也许大部分是竞争问题!
系列文章目录提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录目录系列文章目录文章目录前言一、程序架构二、Bug所在三、修复bug总结前言这段时间接手一个使用lwip的项目,各种不稳定,异常crash、内存申请不出来、ping不通。当然我使用的版本比较老,本身也有bug,这个可以网上找找,但是这篇博客肯定不是谈这些。当你已经按照网友修复了各种bug,他依旧不稳定。其实对程序而言,一个程序行为诡异,往往和竞争...
2020-12-06 01:03:41
4941
3
原创 linux内核启动流程(基于arm)——head.S
源码路径:https://elixir.bootlin.com/linux/latest/source/arch/arm/boot/compressed/head.Sstart: .type start,#function mov r7, r1 @ save architecture ID mov r8, r2 @ save atags pointer#i...
2020-02-23 23:57:31
501
原创 gdb调试死锁的正确姿势
gdb搞起这是我们的源码:#include <unistd.h> #include <pthread.h> #include <string.h> pthread_mutex_t lock_a = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t lock_b = PTHREAD_MUTEX_INITIA...
2020-02-19 22:28:33
1522
原创 Linux 驱动之字符设备驱动分析
字符设备驱动框架应该是我们最常见的一种驱动框架。废话少说,撸源码。涉及到的源码路径:https://elixir.bootlin.com/linux/latest/source/fs/char_dev.chttps://elixir.bootlin.com/linux/latest/source/include/linux/cdev.h主要涉及到的函数是下面这几个,源码也一并贴...
2020-02-12 10:35:15
278
原创 linux下如何发布驱动ko文件,不泄露源码,源码编译为中间目标文件,发布平台再编译
linux下的驱动在插入到内核会校验内核版本和当前驱动版本,只有完全匹配才可以插入成功。当然这也做的目的是安全确保当前驱动和当前内核是匹配的,但是大部分情况下我们发布的驱动只是和用户内核在小版本上有区别不会影响真实的使用。但是由于版本不一致导致驱动无法安装。解决这个一般都方法是,1.发布源码,用户自己编译。2.根据用户内核我们使用相同内核,编译驱...
2020-01-16 19:00:57
1161
原创 好的代码注释究竟应该是什么样的?!!!
先看段子://写这段代码的时候,只有上帝和我知道它是干嘛的//现在,只有上帝知道// 神奇。勿动。 我们讨论好的代码究竟应该是什么样的?,是密密麻麻的注释,看着中英文夹杂,恶心至极。还是什么都没有,我认为更应该偏向于后者,但是后者很难做到,好的代码注释应该是在二者之间吧。 首先应该强调的就是错误的认识,总是有一些人在乱说,胡乱传递,人云亦云。诸如我经常听到的一...
2019-12-27 13:24:46
409
原创 QString 的arg格式化字符串性能让人吐槽
一般来说我们不会关注这些东西,但是在特定场合就显得尤为重要,比如我们现在的场景,sql语句构建这样的一个主频下:我们构建一个27个字段的sql语句32768次,耗时大概是4s,而数据库的插入的耗时也就3s,这个 时候显然影响非常大,或者说让人吐槽。sprintf的性能,我使用sprinf测试了一下,一样的情景耗时是100ms。...
2019-10-26 16:04:26
685
转载 IA32中的5种caching type(也叫memory type)
转https://blog.csdn.net/witsmakemen/article/details/18360399
2019-09-20 16:04:17
269
3
原创 正确的QTTCP QTcpSocket与多线程的交互方式应该是这样的!!!
1.首先说不正确的姿势是什么?跨线程乱搞,重新写了qthread,实现了run,然后man里面创建了QTcpSocket,然后传入到run里面。这种基本运行的时候都会提示你跨线程调用了,对了还有人搞不懂为什么跨线程了,这个可以看看我的博客,有非常明确的说明https://blog.csdn.net/u013372900/article/details/81676483还有人强行调用...
2019-08-27 17:21:29
6470
5
原创 Linux下设置驱动实现非标准的波特率(最新版 struct termios2)
其实对于一般的波特率glibc里面已经封装了函数接口,而且非常容易的就可以设置。但是对于非标准的波特率网上有人提到了ioctl设置,但是最新的内核已经弃用了这种方式,我设置的时候ioctl返回无效http://blog.chinaunix.net/uid-9543173-id-1988980我们的方法贴出来:#include <stdlib.h>#include &...
2019-07-19 17:18:27
3532
4
原创 Windwos驱动 PCIE开发第一步
环境搭建,目前做板卡驱动主要是windriver,但是就目前而言,大部分公司使用的是破解版的windriver,没有正当的版权,对于win10系统也不支持。windows原生驱动是wdf,开发难度其实也没有那么大,当然你要了解底层。代开发 :https://blog.csdn.net/u013372900/article/details/97004166好了我们正式说开发环...
2019-05-30 16:06:13
2461
2
原创 关于c/c++中的volatile、内存屏障以及无锁数据结构
一:先说 volatile,静态乱序 C/C++语言中的volatile关键字作用? 1.易变性:volatile告诉编译器,某个变量是易变的,当编译器遇到这个变量的时候,只能从变量的内存地址中读取这个变量,不可以从缓存、寄存器、或者其它任何地方读取。 2.顺序性:两个包含volatile变量的指令,编译后不可以乱序。注意是编译后不乱序,但是在执行的过程中...
2019-04-01 17:39:14
1237
原创 中断和查询NAPI
转载 https://blog.csdn.net/hejin_some/article/details/72722555 概述 NAPI是Linux新的网卡数据处理API,据说是由于找不到更好的名字,所以就叫NAPI(New API),在2.5之后引入。简单来说,NAPI是综合中断方式与轮询方式的技术。中断的好处是响应及时,如果数据量较小,则不会占用太多的CPU事件;缺点...
2019-01-29 13:49:37
790
转载 线程私有数据 ——TSD
转载 :https://blog.csdn.net/zjf280441589/article/details/43883033 线程特定数据int pthread_key_create(pthread_key_t *key, void (*destr_function) (void *));int pthread_key_delete(pthread_key_t key); in...
2018-12-18 15:10:32
265
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人