Linux Kernel中函数命名

在Linux Kernel中某些特定含义的函数命令有自己的规律,比如这里将简单的介绍一下函数名前双下划线__和devm_xxx函数的意思。

函数名称前的双下划线__
标记需要加锁:
在内核中,有很多函数,有的是需要调用者自己加锁保护的,有些是不需要加锁保护的。对于这些场景,linux kernel采取了统一的策略:基本函数名字是一样的,只不过需要调用者自己加锁保护的那个函数需要增加__的前缀,例如内核有有下面两个函数:setup_irq()和__setup_irq()。
两个函数在kernel/irq/manage.c中定义:

/**
 *  setup_irq - setup an interrupt
 *  @irq: Interrupt line to setup
 *  @act: irqaction for the interrupt
 *
 * Used to statically setup interrupts in the early boot process.
 */
int setup_irq(unsigned int irq, struct irqaction *act)
{
    int retval;
    struct irq_desc *desc = irq_to_desc(irq);

    if (WARN_ON(irq_settings_is_per_cpu_devid(desc)))
        return -EINVAL;
    chip_bus_lock(desc);
    retval = __setup_irq(irq, desc, act);
    chip_bus_sync_unlock(desc);

    return retval;
}
EXPORT_SYMBOL_GPL(setup_irq);

标记更接近底层的调用
一般双下划线也用于标记更接近底层的调用,如kernel/irq/manage.c中的__disable_irq_nosync():
```

/** * disable_irq_nosync - disable an irq without waiting

  • @irq: Interrupt to disable
  • Disable the selected interrupt line. Disables and Enables are
  • nested.
  • Unlike disable_irq(), this function does not ensure existing
  • instances of the IRQ handler have completed before returning.
  • This function may be called from IRQ context.
    */
    void disable_irq_nosync(unsignedint irq)
    {
    __disable_irq_nosync(irq);
    }
    EXPORT_SYMBOL(disable_irq_nosync);

/**

  • disable_irq - disable an irq and wait for completion
  • @irq: Interrupt to disable
  • Disable the selected interrupt line. Enables and Disables are
  • nested.
  • This function waits for any pending IRQ handlers for this interrupt
  • to complete before returning. If you use this function while
  • holding a resource the IRQ handler may need you will deadlock.
  • This function may be called - with care - from IRQ context.
    */
    void disable_irq(unsignedint irq)
    {
    if(!__disable_irq_nosync(irq)) synchronize_irq(irq);
    }
    EXPORT_SYMBOL(disable_irq);
devm_xxx 函数
下面列举一些常用的资源申请接口,它们由各个framework(如clock、regulator、gpio等等)基于device resource management实现。使用时,直接忽略devm_的前缀,后面剩下的部分,driver工程师都很熟悉。只需记住一点,driver可以只申请,不释放,设备模型会帮忙释放。不过如果为了严谨,在driver remove时,可以主动释放(也有相应的接口,这里没有列出)。

externvoiddevm_kzalloc(struct device dev,size_t size, gfp_t gfp);

void __iomem devm_ioremap_resource(struct device dev,struct resource *res);

void __iomem devm_ioremap(struct device dev, resource_size_t offset,unsignedlong size);

struct clk devm_clk_get(struct device dev,constchar*id);

int devm_gpio_request(struct device dev,unsigned gpio,constcharlabel);

static inline struct pinctrl * devm_pinctrl_get_select(struct device dev,constcharname)

static inline struct pwm_device devm_pwm_get(struct device dev,constchar*consumer);

struct regulator devm_regulator_get(struct device dev,constcharid);
static inline int devm_request_irq(struct device
dev,unsignedint irq, irq_handler_t handler,
unsignedlong irqflags,constchardevname,voiddev_id);

struct reset_control devm_reset_control_get(struct device dev,constchar*id);
```

原文地址:https://www.cnblogs.com/linengier/p/12195683.html

时间: 2024-10-11 22:32:51

Linux Kernel中函数命名的相关文章

linux kernel中timer的使用

linux kernel中timer的使用 http://blog.csdn.net/njuitjf/article/details/16888821 在kernel中如果想周期性的干些什么事情,或者某个特定时间干些什么事情,可以使用timer. 例如像周期性地dump某段buffer的数据等等. 先来看看使用方法. 先定义一个struct timer_list的对象.eg: struct timer_list dump_t; 这个对象相当于一个闹钟,其中包含了时间点,也就是什么时候激活闹钟:一

Linux Kernel中获取当前目录方法(undone)

目录 0. 引言 1. 基于进程内存镜像信息struct mm_struct获取struct path调用d_path()获取当前进程的"绝对路径" 2. 基于文件描述符(fd).task_struct调用d_path()获取当前进程的"当前目录" 3. 基于dentry.vfsmount调用d_path()获取当前进程的"当前目录" 4. 基于get_fs_pwd获取当前目录 0. 引言 本文涉及的是ring0下的获取当前进程工作目录的方法,L

Android 如何在linux kernel 中读写文件

前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net 雨季o莫忧离:http://blog.csdn.net/luckkof 正文 [Description] 如何在linux kernel 中读写文件 [Keyword] linux kernel read write file 读写文件 [Solution] 通常我们只会在linux native/app 层 读写文件,但可能有一些非常特别的情况下,我们需要直接在

Linux Kernel CMPXCHG函数分析

最近看到Linux Kernel cmpxchg的代码,对实现很不理解.上网查了内嵌汇编以及Intel开发文档,才慢慢理解了,记录下来以享和我一样困惑的开发者.其实cmpxchg实现的原子操作原理早已被熟知: cmpxchg(void* ptr, int old, int new),如果ptr和old的值一样,则把new写到ptr内存,否则返回ptr的值,整个操作是原子的.在Intel平台下,会用lock cmpxchg来实现,这里的lock个人理解是锁住内存总线,这样如果有另一个线程想访问pt

Android 怎样在linux kernel 中读写文件

前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net 雨季o莫忧离:http://blog.csdn.net/luckkof 正文 [Description] 怎样在linux kernel 中读写文件 [Keyword] linux kernel read write file 读写文件 [Solution] 通常我们仅仅会在linux native/app 层 读写文件,但可能有一些很特别的情况下,我们须要直接在

从Cts测试testCheckForDuplicateOutput到linux kernel中Thread消耗PID

最近折腾CTS android.security.cts testCheckForDuplicateOutput项,单项测试很容易过,但是联测就挂了. 源码:http://xdecay.com/docs/android-sdk/cts/tests/tests/security/d0/db5/_cloned_secure_random_test_8java_source.php 测试的原理是:不停的创建和关闭进程,测试Pass的前提是出现两个Pid相同的进程.. 循环过程如下: a). 创建进程A

浅谈Linux Kernel 中循环链表的实现

前阵子在弄缓存的时候,我们需要将qemu对于磁盘镜像文件写请求串成一个链表,最终将这个链表里面的写请求全部刷回到镜像文件里面,那么我们便需要一个强健,可靠的链表的接口,于是我们仿照Linux 2.4.0的内核,来造了这么一个链表的轮子.今天抽抽空来记录一下. 链表,估计学过数据结构这门课程的人都对其印象深刻,因为老师们都喜欢将它放在比较靠前的地方讲,很多人都认为链表是一种非常easy的数据结构.因为链表的逻辑非常地简单,每个节点就是分成指针和数据,一头一尾地通过指针将每个节点串起来,没有树形(二

linux kernel的中断子系统之(七):GIC代码分析

一.前言 GIC(Generic Interrupt Controller)是ARM公司提供的一个通用的中断控制器,其architecture specification目前有四个版本,V1-V4(V2最多支持8个ARM core,V3/V4支持更多的ARM core,主要用于ARM64服务器系统结构).目前在ARM官方网站只能下载到Version 2的GIC architecture specification,因此,本文主要描述符合V2规范的GIC硬件及其驱动. 具体GIC硬件的实现形态有两

linux kernel的中断子系统之(三):IRQ number和中断描述符【转】

转自:http://www.wowotech.net/linux_kenrel/interrupt_descriptor.html 一.前言 本文主要围绕IRQ number和中断描述符(interrupt descriptor)这两个概念描述通用中断处理过程.第二章主要描述基本概念,包括什么是IRQ number,什么是中断描述符等.第三章描述中断描述符数据结构的各个成员.第四章描述了初始化中断描述符相关的接口API.第五章描述中断描述符相关的接口API. 二.基本概念 1.通用中断的代码处理