- 博客(58)
- 资源 (2)
- 收藏
- 关注
原创 Linux驱动中断与时间篇——高精度定时器hrtimer
低分辨率定时器是用jiffies来定时的,所以会受到HZ影响,如果HZ为200,代表每秒种产生200次中断,那一个jiffies就需要5毫秒,所以精度为5毫秒。如果精度需要达到纳秒级别,则需要使用高精度定时器hrtimer。
2023-09-16 17:48:08 1740
原创 Linux驱动中断与时间篇——低分辨率定时器
delay和sleep的区别:delay型延时:忙等待,占用CPU资源,延迟过程无法进行其他任务。sleep型延时:休眠,不占用CPU资源,其它模块此时可以使用CPU资源。
2023-09-16 16:53:23 545
原创 Linux驱动中断与时间篇——中断下半部的三种方法
当产生一个中断时,会进入中断处理程序。但中断处理程序必须快速、异步、简单的对硬件做出迅速响应并完成那些时间要求很严格的操作。因此,对于那些其他的、对时间要求相对宽松的任务,就应该推后到中断被激活以后再去运行。这样,整个中断处理流程就被分为了两个部分:
2023-09-16 16:48:42 689
原创 Linux启动速度优化方法总结
要对Linux系统启动速度进行优化,首先要知道如何统计系统启动的时间。下面介绍几种统计内核启动耗时的方法,以及对内核启动速度优化的几个方法。
2023-09-16 16:37:16 3011
原创 Linux内核编译机制
Linux内核的编译主要过程:配置、编译、安装。配置主要由Kconfig提供图形界面完编译主要基于Kbuild编译系统,执行make完成编译。安装主要也是基于Kbuild提供的脚本,然后执行make完成安装
2023-09-16 16:32:36 117
原创 Linux系统调试篇——GDBSERVER远程调试
对目标开发板上的程序进行远程调试。很简单,主要就是先在开发板上开启。调试,首先要在目标开发板上启动。,并等待客户端连接。服务时指定的端口号。
2023-09-16 16:19:44 829
原创 Linux系统调试篇——GDB调试入门
本篇讲解使用GDB调试Linux应用程序,以下以 `hellowld.c` 为例介绍 GDB 的调试入门:
2023-09-16 16:02:39 156
原创 Linux系统调试篇——Perf性能分析使用指南
perf可以用来统计一个程序运行期间花了多少时间、上下文切换次数、cache命中率等一些性能相关的事件,通过perf可以分析一个程序的性能瓶颈,从而对程序做出优化。
2023-09-16 15:56:25 2198
原创 Linux系统调试篇——错误码介绍
在处理一些程序出错语句中,不管是用户空间还是内核空间,通常都会返回一个错误码。例如return -ERROR。这些错误码是Linux内核定义的,它几乎包括了我们能想到的所有错误类型。错误码的定义位于:`include/uapi/asm-generic/error-base.h`和`include/uapi/asm-generic/error.h`两个头文件中。
2023-09-16 15:45:02 740
原创 Linux系统调试篇——核心转储调试(core dump)
本篇讲解Linux应用程序发生Segmentation fault段错误时,如何利用core dump文件定位错误。在 Linux 系统中,常将“主内存”称为核心(core),而核心映像(core image) 就是 “进程”(process)执行当时的内存内容。当进程发生错误或收到“信号”(signal) 而终止执行时,系统会将核心映像写入一个文件,以作为调试之用,这就是所谓的核心转储(core dump)。
2023-09-16 15:36:47 343
原创 Linux驱动IO篇——mmap操作
mmap简单来说,就是让一块物理内存拥有两份映射,即拥有两个虚拟地址,一个在内核空间,一个在用户空间。因为用户空间是不能直接操作内核空间数据的,他们映射的是不同的地址空间
2023-09-16 15:13:17 225
原创 Linux驱动IO篇——异步通知
异步通知在Linux的实现中是通过信号,而信号是在软件层次上对中断机制的一种模拟。这种机制和中断非常类似,所以可以以中断的思想来理解这一过程,信号其实就相当于应用层的中断。信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。
2023-09-16 15:07:22 195
原创 Linux驱动IO篇——异步IO
异步IO在提交完IO操作请求后就立即返回,程序不需要等到IO操作完成再去做别的事情,具有非阻塞的特性。当底层把IO操作完成后,可以给提交者发送信号,或者调用注册的回调函数,告知请求提交者IO操作已完成。
2023-09-16 15:03:10 389
原创 Linux驱动IO篇——IO多路复用
IO多路复用就是解决能够同时操作多个设备的方法,及时处理多个设备的数据。具体的,是指单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力。Linux的IO多路复用有三种方法:`select`、`poll`、`epoll`,且这三种方法都是**系统调用*
2023-09-16 14:59:47 137
原创 很底层的性能优化:让CPU更快地执行你的代码
这些是CPU缓存对性能的影响,这已经是很底层的性能优化了,不论什么编程语言都是有效的。真正了解缓存,相信你对底层的认识会有很大帮助。提升数据缓存命中率:顺序地操作连续内存数据提升指令缓存命中率:有规律的条件分支提升多核CPU的缓存命中率:考虑将进程绑定CPU运行。
2023-07-24 23:11:12 446
原创 入职Linux驱动工程师后,我才知道的真相......
大家好,我是Vincent。做Linux驱动工程师也有一段时间了,今天分享一下我曾经入职才知道的一些事情,算是一个菜鸟的经历吧。
2023-06-03 17:05:41 550
原创 Linux驱动IO篇——ioctl设备操作
应用程序如果想要设置/获取驱动层的数据,一般是驱动提供一个`ioclt`接口,然后应用层调用。因此,学会在驱动中实现`ioctl`接口是必要的一项技能。## ioctl命令编码规则。**想要定义一个自己的ioctl命令,必须要遵从ioctl的编码规则**。一个ioctl命令由32比特位表示,每个比特位都有不同的含义,不同版本的内核定义可能有些差异,具体参考文档`“Documentation/ioctl/ioctl-deconding.txt”`.
2023-04-16 13:39:40 2568 1
原创 不敲一行代码,实现Linux下LED驱动!
如果要实现一个设备的驱动,一行驱动代码都不用写,这听起来是不是天方夜谭呢?但这并不是不可实现的,因为全世界的内核开发者都非常热心,只要是能写的驱动,他们基本都已经写了。今天,我们就站在巨人的肩膀上,利用内核开发者已经写好的驱动来实现我们想要的功能,本篇讨论的是LED驱动。
2023-04-13 21:54:58 603
原创 Linux内核中常用的数据结构和算法
inux内核代码中广泛使用了数据结构和算法,其中最常用的两个是链表和红黑树。 链表,Linux内核代码大量使用了链表这种数据结构。链表是在解决数组不能动态扩展这个缺陷而产生的一种数据结构。链表所包含的元素可以动态创建并插入和删除。链表的每个元素都是离散存放的,因此不需要占用连续的内存。链表通常由若干节点组成,每个节点的结构都是一样的,由有效数据区和指针区两部分组成。有效数据区用来存储有效数据信息,而指针区用来指向链表的前继节点或者后继节点。因此,链表就是利用指针将各个节点串联起来的一种存储结构体。
2023-04-11 20:40:43 733 1
原创 Linux驱动——debugfs接口创建
上篇介绍了procfs接口的创建,今天再介绍一种debugfs接口的创建。实现效果:在`/sys/kernel/debug/`目录下创建一个`ion/test`文件,通过`cat`、`echo`的方式进行读写操作。前期准备 :内核配置打开debugfs:CONFIG_DEBUG_FS=y。挂载debugfs文件系统:mount -t debugfs none /sys/kernel/debug
2023-04-05 22:17:34 776
原创 Linux驱动——procfs接口创建
上篇介绍了Linux驱动中sysfs接口的创建,今天介绍procfs接口的创建。可实现类似cat /proc/cpuinfo的操作。procfs接口的创建,主要是实现`struct file_operations`结构体,然后通过`proc_create`函数进行注册,通过`proc_remove`函数进行注销。procfs通常是用来获取CPU、内存、进程等各种信息,例如`cat /proc/cpuinfo`。注意,在较新版本的内核中,procfs的函数接口有所变化。
2023-04-05 22:14:48 727
原创 Linux驱动——sysfs接口创建
在一些linux开发板中,经常可以看到通过echo的方式控制硬件,例如:灯灭 echo 0 > / sys / class / leds / firefly : blue : power / brightness 。这是怎么做到呢?实际上,这是因为在驱动中提供了sysfs接口给用户使用,使得用户可以通过cat或者echo命令来查看和修改驱动中某些变量的值。下面介绍驱动中创建sysfs接口的方法。
2023-04-05 21:52:27 805
原创 编译Linux内核一定要知道的几个小Tips
反汇编对大多数人来说可能用不上,一般在内核移植、启动分析时比较有用,但由于工作需要,我通常都会把反汇编加上。显示自己对内核代码的修改时也会把这些临时文件显示出来,而且提交还必须一个文件一个文件地指定,相当麻烦。Linux内核编译过程会产生很多的文件,包括目标文件、临时文件等等,只有在第一次编译内核的才使用,第一次编译过后,将这句注释,后面都通过。Linux默认是做本地编译,也就是编译位本机使用的内核。在嵌入式开发中,经常需要交叉编译,要做交叉编译的话,需要在。这样在编译Linux内核时,
2023-04-05 21:46:28 529
原创 Linux reset子系统和驱动实例
注册reset驱动时,需要分配一个struct reset_controller_dev结构体,然后填充成员,最后将该结构体注册。时钟和复位是两个不同的驱动,但通常都是由负责clock驱动的人,把reset驱动完成。struct reset_control结构体表示一个reset句柄,驱动中使用reset API,需要先获取reset句柄。类似于clock驱动,reset驱动也是编进内核的,在Linux启动时,完成reset驱动的加载。 reset提供者,即reset驱动。函数注册reset设备。
2023-04-05 21:43:43 1767
原创 Linux clock子系统及驱动实例
在Linux驱动中,操作时钟只需要简单调用内核提供的通用接口即可,clock驱动通常是由芯片厂商开发的,在Linux启动时clock驱动就已经初始化完成。本篇介绍Linux clock子系统以及clock驱动的实现。
2023-02-12 09:41:47 4258 1
原创 Linux内核中常用的C语言技巧
Linux内核采用的是GCC编译器,GCC编译器除了支持ANSI C,还支持GNU C。在Linux内核中,许多地方都使用了GNU C语言的扩展特性,如typeof、__attribute__、__aligned、__builtin_等,这些都是GNU C语言的特性。
2022-12-28 23:34:24 371
原创 如何优雅地使用git?
推荐两个网站:oh shit git和gitmoji。oh shit git列举了使用git中可能遇到的问题,并且形象生动的解答。gitmoji可以在提交的使用添加emoji表情。
2022-12-25 20:30:52 589
原创 Linux内核死锁检测工具——Lockdep
Linux内核在2006年引入了死锁调试模块`lockdep`,`lockdep`会跟踪每个锁的自身状态和各个锁之间的依赖关系,经过一系列的验证规则来确保锁之间依赖关系是正确。
2022-12-25 13:58:04 2229
原创 Linux内核基础篇——常用调试技巧汇总
Linux内核调试常用技巧汇总:printk、动态输出、BUG()和BUG_ON()、dump_stack()分析函数调用关系、devmem直接读写寄存器
2022-12-24 19:26:45 1577
原创 Linux内核基础篇——动态输出调试
上篇说到printk调试,但printk是全局的,只能设置输出等级。而动态输出**可以动态选择打开某个内核子系统的输出,可以有选择性地打开某些模块的输出。要使用动态输出,必须在配置内核时打开`CONFIG_DYNAMIC_DEBUG`宏。内核代码里使用大量`pr_debug()/dev_dbg()`函数来输出信息,这些就使用了动态输出。
2022-12-18 23:10:51 543
原创 Linux内核基础篇——printk调试
很多内核开发者喜欢的调试工具是printk,在Linux内核中,使用printk()函数来打印信息,它与C库的printf()函数类似。printk()与printf()的一个重要区别是:**printk()提供输出等级**。内核会根据这个等级来判断是否在终端或者串口中输出。
2022-12-14 00:04:36 1718
原创 Linux内核基础篇——initcall
写过Linux驱动的人都知道`module_init`宏,因为它声明了一个驱动的入口函数。除了`module_init`宏,你会发现在Linux内核中有许多的驱动并没有使用`module_init`宏来声明入口函数,而是看到了许多诸如以下的声明:
2022-12-12 22:12:45 870
原创 RISC-V SiFive U64内核——HPM硬件性能监视器
对于性能分析,通常我们会使用Perf工具。而perf中的硬件事件,则需要硬件的支持——性能监视单元PMU。RISC-V u64内核支持PMU,使得我们可以通过perf来统计程序运行所产生的cycle、cache hit、cache miss等事件的次数,从而进一步分析、优化性能。在SiFive U64内核中,把PMU称作HPM,实际是一个东西。另外,u64内核的hpm增加了一个新的特性——hpm计数溢出中断。
2022-12-10 19:01:33 1772
原创 RISC-V SiFiveU64内核——L2 Prefetcher预期器
L2 prefetcher是U64内核新增的功能,U54内核没有这个功能。打开L2 prefetcher功能后,当访问大片内存,同时dcache中没有缓存时,访问内存的速率可以提高大概一倍。
2022-12-04 14:11:06 572
原创 RISC-V SiFive U54内核——PMP物理内存保护
PMP用于保护物理内存,例如在opensbi启动时,会将自己所占内存部分用PMP保护起来,不让其他程序访问。
2022-12-03 15:59:26 2522 5
原创 RISC-V SiFive U54内核——PLIC平台级中断控制器
PLIC:Platform-Level Interrupt Controller**. 实际上,除了CLINT管理的软件中断和定时器中断,其他的中断都是由PLIC管理的。U54内核的平台级中断控制器 (PLIC) 最多可支持 `132` 个具有 `7` 个优先级的外部中断源。
2022-12-02 22:23:24 1649
原创 RISC-V SiFive U54内核——CLINT中断控制器
RISC-V SiFive U54内核的有两个中断控制器:CLINT和PLIC。CLINT用于本地中断(软件中断和定时器中断),PLIC用于全局中断。
2022-12-01 22:23:11 1234
原创 RISC-V SiFive U54内核——中断和异常详解
U54内核还支持两种类型的 RISC-V 中断:本地和全局。本地中断:U54内核的本地中断只有2种,软件中断和定时器中断,这两个中断都由本地中断器(CLINT)生成。本地中断通过专用中断异常代码和固定优先级直接发送给单个 hart。 因此,本地中断没有仲裁,也不需要额外的内存访问来确定中断的原因。**全局中断**:通过平台级中断控制器 (**PLIC**) 路由,该控制器可以通过外部中断将中断定向到系统中的任何 hart。 所有的外设都属于全局中断。
2022-11-30 22:49:15 1355
原创 实战|RISC-V Linux入口地址2M预留内存优化
上篇分析了RISC-V Linux启动的页表创建,提到RISC-V Linux入口地址必须2M对齐,今天讲讲如何解决2M对齐的问题,或者说如何优化部分内存。
2022-11-13 14:47:12 494
《统计学习方法》PPT.zip
2020-04-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人