Linux内核中ideapad-laptop.c文件全解析1
创始人
2024-02-22 22:00:31
0次

在将具体代码之前,先来科普一下ideapad是什么。

IdeaPad,中文名为“思想本”,是联想公司于2008年推出的笔记本电脑品牌。目的是为了弥补收购欧洲第四大PC制造商Packard Bell失败后国际市场的空缺,定义为消费级产品(与商务级的ThinkPad呼应),并取代的国际上的LENOVO3000系列和国内的天逸系列。

由于不是本文重点,简单介绍到这里就好。下边正式开始分析代码。

ideapad-laptop.c文件位于Linux内核源码根目录/drivers/platform/x86/下,将近1750行代码(Kernel版本5.18.8)。由于代码很长,分段进行分析。先来看第1段代码:

MODULE_AUTHOR("David Woodhouse ");
MODULE_DESCRIPTION("IdeaPad ACPI Extras");
MODULE_LICENSE("GPL");

这段代码无需多言,分别列出了内核模块的作者、功能描述和遵守的许可证。

再来看第2段代码:

static const struct acpi_device_id ideapad_device_ids[] = {{"VPC2004", 0},{"", 0},
};
MODULE_DEVICE_TABLE(acpi, ideapad_device_ids);static struct platform_driver ideapad_acpi_driver = {.probe = ideapad_acpi_add,.remove = ideapad_acpi_remove,.driver = {.name   = "ideapad_acpi",.pm     = &ideapad_pm,.acpi_match_table = ACPI_PTR(ideapad_device_ids),},
};module_platform_driver(ideapad_acpi_driver);

module_platform_driver是一个宏,位于Linux内核源码根目录/include/linux/platform_device.h中,其定义如下:

/* module_platform_driver() - Helper macro for drivers that don't do* anything special in module init/exit.  This eliminates a lot of* boilerplate.  Each module may only use this macro once, and* calling it replaces module_init() and module_exit()*/
#define module_platform_driver(__platform_driver) \module_driver(__platform_driver, platform_driver_register, \platform_driver_unregister)

由代码注释可以看到,module_platform_driver替代了传统的module_init和module_exit。

module_driver函数在include/linux/device/driver.h中,定义如下:

/*** module_driver() - Helper macro for drivers that don't do anything* special in module init/exit. This eliminates a lot of boilerplate.* Each module may only use this macro once, and calling it replaces* module_init() and module_exit().** @__driver: driver name* @__register: register function for this driver type* @__unregister: unregister function for this driver type* @...: Additional arguments to be passed to __register and __unregister.** Use this macro to construct bus specific macros for registering* drivers, and do not use it on its own.*/
#define module_driver(__driver, __register, __unregister, ...) \
static int __init __driver##_init(void) \
{ \return __register(&(__driver) , ##__VA_ARGS__); \
} \
module_init(__driver##_init); \
static void __exit __driver##_exit(void) \
{ \__unregister(&(__driver) , ##__VA_ARGS__); \
} \
module_exit(__driver##_exit);

将宏定义完全展开,过程及最终代码如下:

module_platform_driver(ideapad_acpi_driver) 

---> 展开为:

module_driver(ideapad_acpi_driver, platform_driver_register, platform_driver_unregister) 

---> 进一步展开为:
 

static int __init ideapad_acpi_driver_init, platform_driver_register, platform_driver_unregister)
{return platform_driver_resgister(&ideapad_acpi_driver);
}
module_init(ideapad_acpi_driver_init);
static void __exit ideapad_acpi_driver_exit(void)
{platform_driver_unregister(&ideapad_acpi_driver);
}
module_exit(ideapad_acpi_driver_exit);

其实还是“旧瓶装新酒”,所谓“换汤不换药,还是那一套”。

ideapad_acpi_driver中各个成员的解析,且听下回分解。

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...