linux内核
文章平均质量分 55
aningxiaoxixi
此人很聪明,一看就会,所以不写
展开
-
内核线程(kthread)的简单使用
内核线程的简单使用内核线程是工作在内核空间的,不属于任何一个进程,可以发生睡眠。内核线程的相关代码在:include/linux/kthread.h , kernel/kthread.c。转载 2022-12-29 23:28:42 · 217 阅读 · 0 评论 -
内核同步 mutex_init
1 声明2 初始化互斥体3 获得互斥体4 释放互斥体5 销毁互斥体。原创 2022-11-10 22:15:11 · 800 阅读 · 0 评论 -
Linux kernel -- Uevent发送(热插拔)事件到用户空间
Uevent是一种在内核空间和用户空间之间通信的机制,主要用于热插拔事件(hotplug)。转载 2022-10-10 23:46:50 · 500 阅读 · 0 评论 -
linux 任务调度 sched_setscheduler
我们考虑一种很坏的情况,如果有若干相同优先级的线程等待执行,然而最早执行的线程无终止或者阻塞动作,那么其他线程是无法执行的,除非当前线程调用如pthread_yield之类的函数,所以在使用SCHED_FIFO的时候要小心处理相同级别线程的动作。它是默认的线程分时调度策略,所有的线程的优先级别都是0,线程的调度是通过分时来完成的。请注意,这种调度策略也是抢占式的,当高优先级的线程准备运行的时候,当前线程将被抢占并进入等待队列。这种调度策略仅仅决定线程在可运行线程队列中的具有相同优先级的线程的运行次序。转载 2022-09-17 19:01:27 · 1360 阅读 · 0 评论 -
linux内核 /proc/interrupts
读取到的内容从左到右,分别为:1、逻辑中断号,2、中断在各CPU发生的次数,3、中断所属设备类名称,4、硬件中断号,5、中断处理函数。已经注册的中断为什么在proc/interrupts中不存在时,因为注册的中断注销了。原创 2022-09-02 00:16:52 · 1879 阅读 · 0 评论 -
设备树dts(devices tree)及其语法、知识点
聊聊Linux 运行时设备树原创 2022-09-01 23:56:50 · 217 阅读 · 0 评论 -
地址映射 ioremap (物理地址转换为虚拟地址)
但是CPU不会为这些已知的外设IO内存资源预先指定虚拟地址的值,所以驱动程序不可以直接就通过外设的物理地址访问到IO内存,而必须要将其映射到虚拟地址空间(通过页表),然后才能根据内核映射过后的虚拟地址来通过内存指令访问这些IO内存,并对其进行操作。在驱动开发过程中一般使用内存映射方式。IO映射方式(IO-mapped):比较典型的有X86处理器为外设专门实现了一个单独的地址空间,称为“IO端口空间”或者“IO地址空间”,此时CPU可以通过专门的指令(比如X86的IN和OUT)来访问这个“IO端口空间”。..转载 2022-08-28 18:10:00 · 1270 阅读 · 0 评论 -
kernel: kmalloc
可以看出,每一个不同的order,都会对应一个free_area,然后同一个order,同一个free_area下,再有每一个不同的 MIGRATE_TYPES ,都会对应一个free_list,即一个链表,我们可以视为一个内存池,这个链表具体是指向struct page的lru域。接着就是针对order>=1的情况,调用__rmqueue_smallest(),将会在zone中寻找能够满足order要求的,存在的,最小的对应内存块。如果释放超过一个page,则会使用正常的buddy算法。......转载 2022-08-16 19:39:04 · 233 阅读 · 0 评论 -
linux内核 内存管理
1 slab分配器是使用伙伴系统分配出来的实际的物理地址,不过slab分配器在连续的物理页面上,对小内存进行管理。伙伴系统在分配内存的时候是以page为单位的,但是实际上可能需求是以Byte为单位的,所以使用slab来管理小块内存。2 kmalloc 函数用来创建通用的缓存,使用slab 机制。3 Linux 支持单个最大的 slab 缓存大小为32MB。相反则是 free函数。............原创 2022-08-15 23:53:24 · 166 阅读 · 0 评论 -
mmu学习总结
运行va2时,没用了实际物理地址可用,那么可能把pa0的数据置换出来,放进va2的数据。当cpu运行app读取指令的时候,都是从上述相同的地址去读。1让app以同样的链接地址,进行编译。一般情况下编译某个app时,需要单独指定它的链接地址。如何实现1g的app,可以在64M的内存上运行。3app的va0映射到实际地址上的pa0。linux上app的程序起始地址都是一样的。va1到映射到实际地址的pa1上。1首先app时存储在emmc上的。程序运行时,所处地址。............原创 2022-07-27 08:29:24 · 238 阅读 · 0 评论 -
cache介绍
c程序再次读取地址a的数据,从cache上查找a的数据,成功找到,这叫做cachehit。bcpu把地址发往sdram,读入一个cacheline称为cachefill。a一开始cache读取a地址的数据,无想要的数据,这叫做cachemiss。cache的涉及基于程序局部性原理。不仅cache分为指令跟数据。mmu也分为指令跟数据。3canche使用流程。......原创 2022-07-25 08:19:47 · 321 阅读 · 0 评论 -
printk 调试总结
printk原创 2022-06-27 23:06:32 · 128 阅读 · 0 评论 -
进程的状态
一般的操作系统,分为几种状态1 创建态: 创建了新进程2 就绪态: 进程获得了可以执行的所有资源和准备条件3 执行态:进程正在cpu中执行4 阻塞态:进程因为等待某项资源而被踢出cpu。5 终止态:进程消亡linux内核进程linux内核进程状态linux内核与之 的区别:1 添加了 僵尸态(大概因为有父子进程的概念吧)2 阻塞态分为 可中断睡眠 跟 不可中断睡眠他们之间的区别linux下TASK_UNINTERRUPTIBLE解析3 就绪态跟运行态标志位一样...原创 2022-02-27 16:54:14 · 378 阅读 · 0 评论 -
电源管理
linux 电源管理分为两种1 系统睡眠模型 (对整体而言,整个系统进入某个状态)2 runtime 电源管理 (对于某个设备而言)怎样动态地打开或关闭设备的电源?最简单的方法:在驱动程序里,在open函数中打开电源,在close函数中关闭电源3pm_runtime_enable / pm_runtime_disable : 使能/禁止runtime PM, 修改disable_depth变量pm_runtime_enable 再 probe 执行m_runtime_d原创 2021-03-07 22:48:25 · 369 阅读 · 0 评论 -
互斥锁和自旋锁区别
自旋锁和互斥锁的区别注意点:1 互斥锁会在等待期间放弃cpu(因为在尝试获得 $ 的时候就禁止抢占)2 自旋锁 对比 互斥锁少了线程的调度,也是节省了成本。spin_lock 在单cpu 上 禁止抢占 preempt_disable spin_lock_irq 在单cpu 上 关本地中断 local_irq_disable 再 禁止抢占 preempt_disable...原创 2020-12-10 23:03:08 · 759 阅读 · 0 评论 -
驱动面试
今天面试被问了驱动两个问题! 但是真的没有做过驱动经验!1 使用锁需要注意什么锁 : 有多种锁自旋锁:1 自旋锁防止死锁进程不能进入sleep模式中2 自旋锁临界代码段执行时间不宜过长2 spi 控制 oled ,spi 中断函数,使用的是上半部,还是下半部对于一个中断,如何划分出上下两部分呢?哪些处理放在上半步,哪些放在下半部? 这里有一些经验可供借鉴:1 如果一个任务对时间十分敏感,将其放在上半部。2 如果一个任务和硬件有关,将其放在上半部。3 如果一个任务要保证不被其他中原创 2020-07-29 21:24:51 · 505 阅读 · 0 评论 -
如何在linux下交叉编译 应用程序
第一步./configure --host=arm-linux --prefix=$PWD/tmp知识点1 $PWD 一般linux 环境都有这个变量,PWD 表示当前路径2 --prefix 编译的时候用来指bai定程序存放路径 。不指定prefix,可执行文件默认放bai在du/usr /local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc。其它的资源文件放在/usr /local/share。第二步make &原创 2020-07-31 15:39:33 · 732 阅读 · 0 评论 -
安卓的svcmgr_publish
svcmgr_publish 中第四个参数不应该相同原创 2020-07-05 15:02:09 · 266 阅读 · 0 评论 -
gcc添加 宏定义
当 需要定义·BINDER_IPC_32BIT 的时候!-DBINDER_IPC_32BIT=1 就可以了原创 2020-07-05 10:21:38 · 799 阅读 · 0 评论 -
route_path分析
原创 2020-06-28 22:46:01 · 883 阅读 · 0 评论 -
ALSA声卡驱动的 DAPM
参考文章ALSA声卡驱动的 DAPMDAPM是Dynamic Audio Power Management的缩写,直译过来就是动态音频电源管理的意思,DAPM是为了使基于linux的移动设备上的音频子系统,在任何时候都工作在最小功耗状态下。DAPM对用户空间的应用程序来说是透明的,所有与电源相关的开关都在ASoc core中完成。用户空间的应用程序无需对代码做出修改,也无需重新编译,DAPM根据当前激活的音频流(playback/capture)和声卡中的mixer等的配置来决定那些音频控件的电源开关被原创 2020-06-27 20:56:28 · 859 阅读 · 0 评论 -
alsa 的 kcontrol
控制 codec原创 2020-06-27 12:58:02 · 317 阅读 · 0 评论 -
安卓的思索
root 有没用这个些文件夹原创 2020-06-27 09:33:13 · 133 阅读 · 0 评论 -
asoc 框架
原创 2020-06-26 15:36:41 · 239 阅读 · 0 评论 -
alsa驱动的 operation设置和 设备创建
原创 2020-06-26 11:06:50 · 133 阅读 · 0 评论 -
alsa设备节点解析
声卡是一个card它 可以多个device,device上有 录音和播放原创 2020-06-26 09:46:20 · 1186 阅读 · 0 评论 -
class_create和device_create与mdev和udev关系
class_create和device_create 会在虚拟文件系统生成信息。然后 mdev和udev 根据 信息创建设备节点原创 2020-06-26 08:45:54 · 346 阅读 · 0 评论 -
arm 包含二进制数据到 bin文件
.section .rodata .global dic .type dic, %object .align 4dic: .incbin "../Lib/all.vtdic"dic_end: .global dic_size .type dic_size, %object .align 4dic_size: .int dic_end - dic @得到数据参考arm 汇编指令原创 2020-06-12 13:39:53 · 638 阅读 · 0 评论 -
软中断 tasklet 工作队列
软中断1 软中断作为下半部机制的代表,2 是随着SMP(share memory processor)的出现应运而生的3 软中断是tasklet实现的基础(tasklet实际上只是在软中断的基础上添加了一定的机制)。4 软中断一般是“可延迟函数”的总称5 软中断可以在多个CPU上并行执行6 软中断 可以并发运行在多个CPU上(即使同一类型的也可以)。所以软中断必须设计为可重入的函数(允许多个CPU同时操作),因此也需要使用自旋锁来保其数据结构。struct softirq_ac原创 2020-06-08 15:21:14 · 771 阅读 · 0 评论 -
alsa框架编写应用层,实现边播放边录音
#include <stdio.h>#include <stdlib.h>#include <alsa/asoundlib.h>snd_pcm_t *open_sound_dev(snd_pcm_stream_t type){ int err; snd_pcm_t *handle; snd_pcm_hw_params_t *hw_params;...原创 2020-02-07 14:47:48 · 2201 阅读 · 8 评论 -
韦东山 jz2440 学习
1 上电先关看门狗 然后才设置时钟,难道看门狗不需要时钟独立看门狗为什么不用使能时钟?2 设置看门狗关闭,只需要设置一个寄存器就好!原创 2020-06-03 08:58:28 · 339 阅读 · 0 评论 -
linux内核 进程学习
SMP 负载均衡对于 SMP 最简单可以理解为系统存在多个完全相同的 CPU。通俗理解Linux内核调度 —— 多核系统的负载均衡(转)原创 2020-06-02 09:32:16 · 121 阅读 · 0 评论 -
进程页表
进程页表:每个进程自己的页表,放在进程自身的页目录task_struct.pgd中。在保护模式下,从硬件角度看,其运行的基本对象为“进程”(或线程),而寻址则依赖于“进程页表”,在进程调度而进行上下文切换时,会进行页表的切换:即将新进程的pgd(页目录)加载到CR3寄存器中。...原创 2020-06-01 13:06:32 · 1855 阅读 · 1 评论 -
linux vma 是什么
可使用内存产生1 用户空间动态申请内存时往往只是获得一块虚拟地址的使用权2 而并没有将这块虚拟地址区域与实际的物理内存对应上,3 只有当用户空间真正操作申请的内存时,才会触发一次缺页异常,这时内核才会分配实际的物理内存给用户空间。用户进程的虚拟地址空间包含了若干区域 大致为可执行文件的二进制代码,也就是程序的代码段存储全局变量的数据段用于保存局部变量和实现函数调用的栈环境变量和命令行参数程序使用的动态库的代码用于映射文件内容的区域虚拟内存区域(virtual memory原创 2020-06-01 13:00:22 · 1135 阅读 · 0 评论 -
a9 汇编生成可执行文件 Makefile解析
all: arm-linux-gcc -c -o led_on.o led_on.S arm-linux-ld -Ttext 0 led_on.o -o led_on.elf arm-linux-objcopy -O binary -S led_on.elf led_on.bin arm-linux-objdump -D led_on.elf > led_on.disclean: rm *.bin *.o *.elf 从Makefile角度1 首先看上去没有所谓的依赖原创 2020-05-31 21:42:13 · 352 阅读 · 0 评论 -
arm linux创建设备节点
sixthdrv_class = class_create(THIS_MODULE, "sixth_drv");//THIS_MODULE 根据file_operations 这个是定死的 sixth_drv是类名字 sixthdrv_class_dev = class_device_create(sixthdrv_class, NULL, MKDEV(major, 0), NULL, "buttons"); /* /dev/buttons */class_create()linux-2..原创 2020-05-31 08:43:57 · 304 阅读 · 0 评论 -
栈空间排布,数据相关内容
上面是画的简单的栈。LD寄存器LR(Link Register),连接寄存器的英文缩写,在ARM体系结构中LR的特殊用途有两种:一是用来保存子程序返回地址;二是当异常发生时,LR中保存的值等于异常发生时PC的值减4(或者减2),因此在各种异常模式下可以根据LR的值返回到异常发生前的相应位置继续执行。LR 用来跳转回原来的函数可以从反汇编得到stmdb sp! {r4,r5,r6,r7,r8,fp,ip,lr,pc}stmdb sp! {fp,ip,lr,pc}等等 这样的汇编指令.原创 2020-05-30 20:12:34 · 299 阅读 · 0 评论 -
objdump使用
详细得请看 Linux:objdump命令解析常用的指令反汇编应用程序objdump -D vmlinux得到的数据会打印到终端显示制定section段信息(comment段)objdump -s -j .comment vmlinux显示文件头信息objdump -f vmlinux从objdump得到的反汇编文件中我们可以得到什么?从文件中 我们可以得到 符号 地址 段大小 汇编指令可以根据 pc指针判断是哪个那个函数,甚至哪条指令出现错误...原创 2020-05-30 15:07:49 · 478 阅读 · 0 评论 -
页表映射and分配物理页面
页表映射1 目录 init main.c 里面找到start_kernel 函数2 从里面找到 paging_init这个函数包含了 物理内存初始化3 从上面函数找到 map_lowmem函数4 MMU 里面包含 TLB缓存页表转换的结果里面还包含页表查询单元 由硬件自动完成页表的维护需要 内核来完成MMU 是存在于架构体系中 例如arm v75 当进程切换的时候,要冲刷 TLB6 解释上面 因为每一个进程拥有自己独立的页表,所以进程切换,就会切换页表,就会冲原创 2020-05-29 09:46:30 · 408 阅读 · 0 评论 -
spi_oled_drv.c
#include <linux/init.h>#include <linux/fs.h>#include <linux/slab.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/device.h>#include <sound/core.h>#include <linux/spi/spi.h>#include原创 2020-05-15 06:57:19 · 192 阅读 · 0 评论