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中各个成员的解析,且听下回分解。

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...