- 博客(61)
- 收藏
- 关注
原创 NAPI杂记
平时是中断方式,当有数据到达时,会触发中断处理函数执行,中断处理函数关闭中断开始处理。至于文章最开始提到了如何关闭设备中断,看了一下,好像都是在中断上半部的函数里面做的:屏蔽设备的中断(例如某个中断,不同设备驱动,实现不一样),然后再触发一个软中断。另外知乎文章里面提到通过ixgbe_irq_enable_queues重新开启硬中断,进入中断收包模式//这个重新开启硬件中断,看了一下并不是local_irq_enable之类的呢?如果此时有数据到达,则没必要再触发中断了//这个是在哪里实现的啊?
2024-11-29 22:43:03
248
原创 抄的八股文(2)
这些答案不一定正确1、Linux驱动框架1、设备的初始化/释放:负责对设备进程初始化/释放。检测所有驱动硬件是否正常。如果正常对设备以及相关驱动程序的进行初始化2、上半部分:服务于文件系统I/O,命令字下发。通过文件系统从应用程序读取数据,将数据通过文件系统返回给应用数据。3、下半部分:服务于硬件设备的I/。负责将数据从内核传到硬件,或者是硬件读取数据到内核。大部分是通过中断实现。比如网络设备的收发包我以为是 Linux总线、设备、驱动模型。驱动只管驱动、设备只管设备,总线负责匹
2024-05-19 15:40:26
784
原创 抄的八股文
1、define只是在预处理时进行文本替换,不分配内存空间,它存在于程序的代码段。const会分配空间,存在于程序的数据段,可以被调用2、const常量有数据类型,编译器可以对其进行安全检查等。define不行头文件中定义静态变量会造成资源浪费,引起程序错误等。按照编译步骤,每个头文件都会每个包含的源文件中展开,这样每个源文件都会单独存在一个静态变量。不推荐在头文件中定义任何的变量。
2024-05-16 22:15:58
749
原创 读写锁(arm)
(1)假设临界区内没有任何的thread,这时候任何read thread或者write thread可以进入,但是只能是其一。(2)假设临界区内有一个read thread,这时候新来的read thread可以任意进入,但是write thread不可以进入(3)假设临界区内有一个write thread,这时候任何的read thread或者write thread都不可以进入。
2024-01-11 23:18:26
1400
2
原创 内核线程创建-kthread_create
文章参考大概意思就是早期创建内核线程,是交由内核处理,由内核自己完成(感觉好像也不太对呢),创建一个内核线程比较麻烦,会导致内核阻塞。因此就诞生了工作队列以及现在的kthreadd 2号进程。这样我们在创建内核线程时,只需要将消息告诉它们,实际进行内核线程创建的任务有kthreadd完成,感觉类似一个下半部。我环境使用的是kthreadd进行内核线程的创建。
2024-01-06 23:02:18
1977
原创 关于kthread_stop的疑问(linux3.16)
线程一旦启动起来后,会一直运行,除非该线程主动调用do_exit函数,或者其他的进程调用kthread_stop函数,结束线程的运行。之前找销毁内核线程的接口时,发现了kthread_stop这个接口。网上说这个函数能够销毁一个内核线程。最开始以为对于一个已经唤醒的内核线程,我们直接调用这个接口就能够让这个线程自动退出。后面经过试验发现并不是这样的======》
2024-01-05 23:25:20
2071
原创 内核死锁检测--lockdep(linux3.16)
之前看网上说linux内核自带了死锁检测工具。现在试试使用效果怎么样。感觉确实能够检测到,后面有时间在研究原理把。需要开启如下选项(选项应该是开多了,用最后三个就行)这个图我怀疑是 开启了其他的,导致出现了这个打印。经过实测是在内核线程被调用之前就检测到了。//这个文章讲了一些检测原理。
2024-01-04 23:23:59
538
原创 kasan
其原理就是利用额外的内存,去标记内存的可用状态。可以看到申请到obj之后,会 调用__kasan_kmalloc,将实际申请的内存,所对应的shadow memory区域初始化为0,表示全部都可访问。要实现内存的检查,必须要先有这块区域记录内存读写权限(就是上面将的8字节内存是否有效的标记信息)的详细信息,这块区域是如何划分、何时划分的呢?这里入参tag是0,因此可以看到从伙伴系统里面申请出来的page,他们对应的shadow memory的值为0(本来也应该为0,因为全部内存都允许被访问)
2023-12-27 22:54:13
990
原创 关于preempt count的疑问
另外的7bit为了记录,防止进程被softirq所抢占,关闭/禁止softirq的次数,比如每使用一次local_bh_disable(),softirq count高7个bits(bit 9到bit 15)的值就会加1,使用local_bh_enable()则会让softirq count高7个bits的的值减1。因此为了分清楚是正在处理软中断还是说进程里面显示禁止了软中断,我们只需要判断bit8就行(进入softirq是在softirq上下文,关闭softirq抢占也是在softirq上下文如何区分)
2023-10-30 23:24:03
301
原创 ARM硬件断点
文档可以在这个网站下载。hw_breakpoint 是由处理器提供专门断点寄存器来保存一个地址,是需要处理器支持的。处理器在执行过程中会不断去匹配,当匹配上后则会产生中断。可以看到应该是每个cpu都注册了一个。感觉应该是在一个cpu上注册,所有cpu都会去检查(原理不清楚,上面的文档没有看明白,猜测的)内核自带了硬件断点的样例linux-3.16\samples\hw_breakpoint\data_breakpoint.c。
2023-10-08 23:03:11
2650
原创 ELF文件(1)
由于段和节的数量不固定,自然程序头表以及节头表的大小也不固定了。这些表就相当于一个数组,程序头表里面的元素就对应了一个段,节头表的原因对应了一个节。段是由节组成了,多个节经过链接之后就合并成一个段了(elf文件里面的section header和program header其实都是描述的同一个东西)elf header的信息如下:从elf header中能够看到程序头表以及节头表的起始位置,以及对应的元素个数等信息。通过读取出来的符号地址可以看到上述的几个符号的地址,也确实落在了对应的section中。
2023-06-29 22:26:29
327
原创 slub 分配器(linux3.16)
在构建object之间的单链表的时候,object首地址实际上都会加上一个red_left_pad的偏移,这样实际的layout就如同图片中转换之后的layout。slab和slub是不同的分配器(内存布局就不同),但是他们最后都是基于伙伴系统实现的。检测的方法和Red zone区域一样,填充的magic num也一样,差别只是检测的区域不一样而已。kmem_cache_create->do_kmem_cache_create->__kmem_cache_create(slub.c)到这里就不一样了。
2023-05-08 22:50:09
326
原创 ARM体系结构相关杂记
由于不同的模式使用者几个相同的寄存器,在进行模式切换的时候,容易造成寄存器的数据被破坏。在特权模式下,程序可以访问所有的系统资源,也可以任意的进行处理器运行模式切换。在地址中存放的结果为A(0x12),A+1(0x34),A+2(0x56),A+3(0x78)在地址中存放的结果为A(0x78),A+1(0x56),A+2(0x34),A+3(0x12)2、6个状态寄存器(32位),CPSR,SPSR_svc,SPSR_abt,SPSR_und,SPSR_irq,SPSR_fit。程序寄存器PC:R15。
2023-04-25 22:00:24
435
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人