首页 > 其他分享 >第4篇 sound.c分析(应用层如何调用到内核层的)

第4篇 sound.c分析(应用层如何调用到内核层的)

时间:2023-09-04 18:56:23浏览次数:46  
标签:sound snd struct preg card 内核 device 应用层 minor

原文链接:https://blog.csdn.net/yangguoyu8023/article/details/122114620

1. alsa_sound_init

alsa的核心入口函数是sound\core\sound.c中的alsa_sound_init

static struct snd_minor *snd_minors[SNDRV_OS_MINORS];
static int snd_open(struct inode *inode, struct file *file)
{
	unsigned int minor = iminor(inode);
	struct snd_minor *mptr = NULL;
	const struct file_operations *new_fops;
	mptr = snd_minors[minor];
    .......
	new_fops = fops_get(mptr->f_ops);
    .....
	if (file->f_op->open)
		err = file->f_op->open(inode, file);
}

static const struct file_operations snd_fops =
{
	.open =		snd_open,
	.llseek =	noop_llseek,
};

static int major = CONFIG_SND_MAJOR;
static int __init alsa_sound_init(void)
{
	snd_major = major;
	snd_ecards_limit = cards_limit;
	if (register_chrdev(major, "alsa", &snd_fops)) 
}

subsys_initcall(alsa_sound_init);

1.1 snd_minors

最终会通过次设备号来匹配snd_minors,并且调用它的open函数。我们看看全局变量snd_minors在哪注册的,它是静态变量,所以在sound.c文件中搜索,发现其注册为snd_register_device。

 
/**
 * snd_register_device - Register the ALSA device file for the card
 */
int snd_register_device(int type, struct snd_card *card, int dev,
			const struct file_operations *f_ops,
			void *private_data, struct device *device)
{
	int minor;
	struct snd_minor *preg;

	preg = kmalloc(sizeof *preg, GFP_KERNEL);
	preg->type = type;
	preg->card = card ? card->number : -1;
	preg->device = dev;
	preg->f_ops = f_ops;
	preg->private_data = private_data;
	preg->card_ptr = card;
	minor = snd_find_free_minor(type, card, dev);

	device->devt = MKDEV(major, minor);
	err = device_add(device);
	snd_minors[minor] = preg;
}

1.2 snd_register_device

搜索snd_register_device,看谁调用了该函数,发现有如下函数调用了。
snd_pcm_dev_register
snd_ctl_dev_register

标签:sound,snd,struct,preg,card,内核,device,应用层,minor
From: https://www.cnblogs.com/charlie12345/p/17677738.html

相关文章

  • shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得
    Logo共40408字发布文章 草稿箱 1目录shell命令概述获得命令帮助Linux命令行的格式文件和目录管理Bash的命令历史Bash的命令别名重定向vim文本编辑器vim编辑器的工作模式命令模式中的基本操作末行模式中的基本操作用户和组账号概述用户账号文件——password用户账号文件——shadow......
  • shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得
    Logo共40408字发布文章 草稿箱 1目录shell命令概述获得命令帮助Linux命令行的格式文件和目录管理Bash的命令历史Bash的命令别名重定向vim文本编辑器vim编辑器的工作模式命令模式中的基本操作末行模式中的基本操作用户和组账号概述用户账号文件——password用户账号文件——shadow......
  • shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得
    Logo共40408字发布文章 草稿箱 1目录shell命令概述获得命令帮助Linux命令行的格式文件和目录管理Bash的命令历史Bash的命令别名重定向vim文本编辑器vim编辑器的工作模式命令模式中的基本操作末行模式中的基本操作用户和组账号概述用户账号文件——password用户账号文件——shadow......
  • 技术分享 | LSM,Linux 内核的安全防护盾
    计算机安全是一个非常重要的概念和主题,它不仅仅可以保护用户个人信息和资产的安全,还可以影响到用户在使用过程中的体验;但同时,它也是一个很抽象的概念,关于其相关文献和资料不计其数,但它究竟是什么、包含什么,并没有详尽并全面的介绍。尽管困难,国际上还是对计算机安全概括出了三个特性......
  • linux内核等待队列详解
    https://www.cnblogs.com/xinghuo123/p/13347964.html等待队列用于使得进程等待某一特定事件的发生,无需频繁的轮询,进程在等待周期中睡眠,当时间发生后由内核自动唤醒。1数据结构1.1等待队列头等待队列结构如下,因为每个等待队列都可以再中断时被修改,因此,在操作等待队列之前必......
  • [内核源码] epoll 实现原理
    https://wenfh2020.com/2020/04/23/epoll-code/文章主要对tcp通信进行epoll源码走读。Linux源码:Linux5.7版本。epoll核心源码:eventpoll.h/eventpoll.c。搭建epoll内核调试环境视频:vscode+gdb远程调试linux(EPOLL)内核源码1.应用场景2.预备知识3.使......
  • 树莓派-内核开发-说明 下载代码 编译 替换内核
    一、概述二、ubuntu里交叉编译1、获取交叉编译工具和源码2、配置编译环境变量2.1手动配置环境变量2.2自动配置环境变量3、配置config3.1使用源码里自带的config3.2获取当前树莓派的config4、编译5、挂载树莓派sd卡,并安装编译出的DIRECTLY到sd卡三、树......
  • zImage的位置对于ARM32内核解压的影响
      ARM32内核解压流程简单总结了解压流程,这里给出zImage加载位置和Image解压位置的不同组合下,zImage,Image和可能存在的重定位zImage在内存上的位置分布。  因为解压过程中的判断是根据zImage和解压后Image的相对位置来进行不同处理,在以下的分析中,可以认为Image位置是固定的,但......
  • 技术分享 | RCU :内核小“马达”,让你的产品弯道超车
    在上一篇文章《编程界也内卷?浅析“斜杠青年”RCU 》中,鼎道智联带着大家一起认识了并行编程,了解了什么是RCU,相信大家已经对RCU的特点和如何实现Reader无锁有了一定的了解。今天就带着大家继续从RCU的实现入手,一起看看在实际操作中,并行编程是如何实现的!RCU的实现原理可以概......
  • ch2_ab1 Linux内核模块
    准备事项:虚拟机系统文件传输工具VMwareCentOSWinscpVitualBoxUbuntuXftp有222种选择,我是Virtualbox+Ubuntu+Winscp下载osc前言中的Linux系统osc10e.ova安装VirtualBox导入osc10e.ovaSilberschatz,Galvin,Gagne:OperatingSystemC......