- 博客(36)
- 收藏
- 关注
原创 Linux内核学习之 -- epoll()一族系统调用分析笔记
linux 4.19epoll()也是一种I/O多路复用的技术,但是完全不同于select()/poll()。更加高效,高效的原因其他博客也都提到了,这篇笔记主要是从源码的角度来分析一下实现过程。作为自己的学习笔记,分析都在代码注释中,后续回顾的时候看注释好一点。对于epoll()的分析建立在《Linux内核学习之 – 系统调用open()和write()的实现笔记》 + 《Linux内核学习之 – 系统调用poll()分析笔记》的基础上,因为有很多通用的步骤和环节。
2024-09-22 10:05:18
1227
原创 LInux内核学习 -- perCPU变量
最终,获取获取percpu变量相当于percpu变量指针的ptr(符号地址)加上__my_cpu_offset,__my_cpu_offset宏即是从当前cpu的tpidr_el1、tpidr_el2寄存器中取出此前设置的__per_cpu_offset[cpu]值,得到这个percpu变量。具体的实现过程可以看上面引用的博客。然后在调用entry_task_switch()时,通过__this_cpu_write()函数修改本cpu的percpu变量值,从而记录next进程的task_struct。
2024-09-22 09:59:56
648
原创 Lnux驱动开发学习 -- imx6ull LCD驱动学习
这个后面大有用处,基本上很多驱动框架都是这一套模式,由框架为用户提供统一的api或者说设备文件,然后由框架提供一套标准的file_ops,然后在框架的file_ops中再调用差异性的ops,也就是我们这里的fb_info->fops,等会继续分析就知道了。就像是opencv一样,他底层封装的要打开什么名字的设备应该都是固定的。当然原厂也不是乱写的,linux发展到现在,每一种设备的驱动都有框架的支持(如果不是特别奇怪的设备),而且大概率能通过框架的支持简化一些工作,平台化的工作可以提高效率。
2024-09-18 10:56:39
1137
原创 Linux内核学习之 -- ARMv8中的Current宏
但是现在已经不这么做了,等会将介绍现在是如何做的。**该变量存放进程的进程描述符地址.**这样就解决了第二个问题,在sp_el0保存task_struct之前,task_struct存放在哪里。msr操作sp_el0,把tsk的值存到sp_el0中,所以很显然,tsk目前保存的就是当前进程的struct task_struct。现在在x86体系下,Linux内核定义了名为current_task的Per-CPU变量,每个CPU上当前运行的进程task_struct指针都保存current_task变量中。
2024-09-16 19:24:29
1452
原创 Linux字符设备驱动 --device_add()与driver_register()
同时分析的过程中回顾一下device-driver的匹配方式,所以还会分析一下dirver_register()函数,该函数也是很多总线设备驱动注册API的底层调用函数。如果pdev设置了driver_override域,会直接进行字符串匹配,匹配该pdev该域域驱动的name是否相等。可以看到,platform bus有五种匹配方式,比i2c bus多了两种,并且有一种匹配方式还不太一样,所以共三处不同。这些函数都会调用device_add(),所以这个函数应该还有点东西的。
2024-09-16 10:31:56
1069
原创 Linux内核学习之 -- ARMv8架构的系统调用笔记
那我们直接全局搜索__arm64_:sys.c这个文件就是刚才咱们看的代码所在的文件,没啥东西。sys32.c这个文件是一些给32位用户提供的系统调用,可以认为是arm32的系统调用,其中也维护这一个系统调用表,后面看poll()系统调用的时候会用到。那就要去syscall_wrapper.h里面看一下怎么个事儿了。毕竟这名字很直白,都叫wrapper了。
2024-09-14 21:15:16
1183
原创 Linux内核学习之 -- 系统调用open()和write()的实现笔记
关于这个do_last函数,是设置struct file* file的主要函数,最终会将file->path.dentry指向link_path_walk()解析出的最后一个分量的dentry,如果最后一个分量的类型是NORMAL,也就是说是正常文件而不是".“或者”…之后便是解析路径的主要函数link_path_walk(),该函数比较复杂, 是解析路径的主要函数,用于将pathname转换成最终该文件对应的的dentry,也就是路径最后一个分量对应的dentry。该函数就是来解析目录是否存在的。
2024-09-12 10:21:40
1230
原创 Linux字符设备驱动 -- regulator子系统
Linux驱动之Regulator子系统Linux 内核之电源篇(加载流程)regulator,翻译就是调节器。一些可以输出电流电压的设备可以使用该子系统。举个例子,一个PMIC有多路输出,每一路输出都可以给很多外设、芯片供电。那么每一路输出,我都可以认为他是一个regulator。
2024-09-01 10:20:57
1378
原创 Linux字符设备驱动--MFD子系统
因为是复杂设备是个i2c设备,所以该复杂设备的probe函数会传入struct i2c_client i2c,我们要在复杂设备的probe中调用上述mfd注册接口。MFD子系统就是为这种复杂设备准备的,并且接下来就会发现,MFD子系统的核心思想就是从一个复杂设备中抽象出不同功能,抽象成单独的设备。上一节提到,MFD子系统的核心思想就是从一个复杂设备(真实的物理设备)中抽象出不同功能,抽象成单独的设备(处理复杂设备的某一部分功能)。而对这个设备的抽象,完全取决于使用者想怎么划分,或者说想使用哪一部分功能。
2024-08-31 10:44:05
808
原创 Linux字符设备驱动 -- regmap子系统
irq_domain_add_legacy()函数和irq_domain_add_linear()函数的区别就在于,在申请irq_domain的时候,要不要直接建立hwirq与virq的联系。regmap_add_irq_chip()根据传入的参数irq_base决定使用irq_domain_add_legacy()函数或者irq_domain_add_linear()函数申请struct irq_domain。这个可以直接创建一个FIFO调度策略的内核线程,来处理后半部,相当于设置了一个工作队列。
2024-08-13 21:45:19
1534
1
原创 ubuntu插入模块测试
但是没开启强制验证,否则直接加载不了。不过问题不大,只是为了测试用的,反正能正常加载。第一次加载的时候报警告了,污染了内核,有两条信息。内核版本:5.15-generic。
2024-08-11 11:30:22
307
原创 Linux内核学习之 -- 系统调用poll()分析笔记
第三步是系统调用重新执行相关的操作,涉及到系统调用退出时在entry.S中要执行的一个函数do_notify_resume(),该函数比较复杂,是否需要启动进程调度(need_reseched),是否重启系统调用,调试暂停(拦截内核的信号,暂停在这里并通知调试器)等都会在这里处理,暂时不进行分析,以后有空单独写一篇笔记。当唤醒之后,do_poll()会从休眠处继续运行,也就是会从poll_schedule_timeout()处继续运行(实际上是从调用schedule()的返回处继续运行)。
2024-08-11 10:37:55
1162
原创 操作系统真相还原--第七章中断实验BUG--找不到中断向量表
这个问题说大不大说小不小,现在比较忙,每天只能抽出不到一个小时来做一下这个实验,一出现这种问题就心烦意乱,花了四五天的时间来搜索解决方案,完全不想调试。发现确实是data段在内存中的首地址,所以只要看一眼data段的首地址的内容(文件内偏移0x052c),就能确定是不是编译链接有问题了。这个地址中的数据,发现全是0。这个时候想起来了,在kernel.S中,把中断函数的地址,存在了data段中。至此可以确定,编译没有问题,出问题的是data段的加载有问题,可能根本没有加载进来,也可能加载到了错误的位置。
2024-06-08 02:18:48
948
原创 Linux驱动开发BL5372项目BUG(一)--rtc_device_register函数注册失败
驱动开发报错:kobject: 'null' (0000000007394d5b): is not initialized, yet kobject_get() is being called.** 以及 **bl5372:failed to add char device 253:0
2023-11-26 16:25:11
1435
1
原创 linux驱动开发中常用函数--dev_get_drvdata()与dev_set_drvdata()的用法
dev_get_drvdata()与dev_set_drvdata()的用法
2023-11-26 16:24:36
2093
1
原创 Linux驱动开发项目BL5372--hwclock用法及实现过程详解
讲解了hwclock的用法以及实现过程,并且对如何编写合适的rtc驱动程序来适配该命令做出了一定探索
2023-11-07 20:53:22
859
原创 Linux驱动开发HTR3218项目BUG(一):驱动程序中的浮点运算问题
error '-mgeneral-regs-only' is incompatible with floating-point code
2023-11-04 14:20:54
822
1
原创 Linux驱动开发HTR3218项目BUG(三):scripts/basic/fixdep: 没有那个文件或目录
scripts/basic/fixdep: 没有那个文件或目录
2023-10-28 12:52:17
984
原创 Linux驱动开发HTR3218项目BUG(二):memcpy导致的内核崩溃
如果代码不长的话,可以在每一行代码后面打印信息来判断出错函数在哪里,但是比较长的函数代码这个方法就行不通了。在项目中写了一个驱动程序,然后在insmod .ko的时候,导致内核崩溃了(真的很烦,然后还重启不了,只能断电重启),崩溃后报出的信息如下所示。这个地址的值,这肯定是个非法地址,所以导致内核的崩溃。,更具体的细节没有深究,只是开始疑惑了一下为什么明明是64位寄存器LDRB指令却只将高24位清0,后续可以看看)。开始的前几个寄存器往往是调用函数的时候传参用的,所以这应该传入的某个参数。
2023-10-26 14:24:58
855
2
原创 C++学习笔记(七) 模板(二) 类模板
普通的类中的成员函数在开始时就创建,类模板中的成员函数调用是才会创建。所以,按理说下面代码是可行的,虽然不知道。类模板成员函数的类外实现,与普通成员函数的区别就是说明作用域的同时要传入类型(尖括号)类模板需要自己传入类型参数,不能自动推导,并且模板的参数列表可以有默认参数。看来是编译阶段调用的时候就会创建这个函数了。修改test_2(),注释掉p.func2(),可以编译。但是很可惜,跟我理解的不一样,报错了。,但是编译器并不会报错,因为。是调用的时候才创建的。
2023-08-14 22:08:41
189
原创 C++学习笔记(六) 模板(一) 函数模板
函数模板不指定函数的形参类型,调用时自动确定形参的类型,可以提高函数的通用性。但是一般项目中尽量不要写同名的普通函数和函数模板。当出现同名的普通函数和函数模板时,调用规则如下。上述代码运行结果如下。
2023-08-13 19:31:21
121
1
原创 U-boot无法ping通主机和虚拟机
因为主机主板只有一个网口,手上也没有路由器和交换机,所以只能用网线将板子与这个网口直连,然后主机用wifi上网。一开始将板子的ip设置为192.168.31.xx,与wifi的ip在同一个网段下了,但是板子没有连接同一个wifi,是用网线接在有线网卡的网口上的,所以导致板子无法ping通主机后来修改板子的ip为192.168.137.xx,板子成功ping通主机。也可以自己修改网段和主机ip,从网络设置中修改即可,使用自己设置的ip地址。
2023-07-26 16:00:07
1004
1
原创 C++学习笔记(三) 类(二) 友元和运算符重载
在类中使用friend修饰全局函数、类、成员函数,即可令被修饰对象访问该类中private声明下的内容。
2023-07-26 00:09:19
182
1
原创 U-boot移植,添加正点原子板子报错:致命错误:configs/.h:没有那个文件或目录
找到出错文件include/config.h,发现几个宏定义已经写进去了,但是宏定义CONFIG_BOARDDIR好像不太对,所以去看板级文件夹下是不是有文件修改错或者单词拼错之类的。,所以考虑是否是if没有执行。查看TARGET_MX6ULL_ALIENTEK_EMMC在哪里出现过,发现没有定义,应该在某个config文件中define过才对。然后去找与正点板子有关的配置文件,发现这个地方写错了,应该是。以及正点原子的教程进行检查,没有发现错误。
2023-07-24 18:25:10
787
原创 C++学习笔记(二) 类(一)
调用类中定义的函数时,与该指针指向的地址没有关系,反正都会去执行在编译时就给类函数分配好的地址中的代码。但是如果有的函数用到了该类的成员变量,就会报错,因为类的成员变量是在实例化对象的内存区域中的,而。通过this指针和类空指针可以更好的理解C++的一些特性,当指向NULL的class类型指针在调用该类的成员函数时是可以调用的,这个特性本质是因为C++是。,而不是在实例化对象时,将函数放在该实例化对象的内存区域中,所以一个类的所有实例化对象调用类中定义的函数时其实都是调用的。存放的是该类下定义的。
2023-07-23 20:58:24
282
1
空空如也
leetcode思路个人版c++求解a
2024-09-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人