首页 > 其他分享 >RK3568驱动指南|驱动基础进阶篇-进阶8 内核运行ko文件总结

RK3568驱动指南|驱动基础进阶篇-进阶8 内核运行ko文件总结

时间:2024-01-31 14:56:32浏览次数:23  
标签:__ 初始化 函数 RK3568 module init 驱动 进阶

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。


【公众号】迅为电子

【粉丝群】824412014(加群获取驱动文档+例程)

【视频观看】嵌入式学习之Linux驱动(驱动基础进阶篇_全新升级)_基于RK3568

【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板

进阶8 内核运行ko文件总结
8.1 内核运行ko流程分析
当我们使用系统调用时,内核会执行SYSCALL_DEFINE3宏定义的函数,如

SYSCALL_DEFINE3(finit_module, int, fd, const char __user *, uargs, int, flags)或SYSCALL_DEFINE3(init_module, void __user *, umod, unsigned long, len, const char __user *, uargs)。这些函数最终都会调用load_module函数,而在load_module函数中,会通过do_one_initcall(mod->init)来执行驱动程序的入口函数。

do_one_initcall函数的作用是执行一个初始化调用函数,并检查执行过程中是否存在抢占不平衡或中断被禁用的情况。如果存在错误信息,会打印警告信息。最后,返回初始化调用函数的返回值。这个函数通常在内核初始化过程中使用,用于执行各个模块的初始化函数。

为什么mod->init就是驱动的入口函数呢?

打开include/linux/module.h文件,找到以下代码,如下图所示:

 

 

图8-1

上述代码是用于定义模块的初始化函数和清理函数的宏定义。通过使用module_init宏和module_exit宏,开发人员可以指定模块的入口函数和清理函数。这些宏定义了一些内联函数和与之关联的特殊命名的函数,以及一些属性和别名,用于在编译时进行检查并将用户定义的函数与特定的模块函数关联起来。

在上图的代码中,int init_module(void) __copy(initfn) __attribute__((alias(#initfn)));:定义一个名为init_module的函数,用于作为模块的入口函数。__copy(initfn)表示复制用户定义的初始化函数,__attribute__((alias(#initfn)))表示将init_module函数与用户定义的初始化函数initfn关联起来。将init_module作为函数initfn的别名。init_module是驱动加载函数的统一别名,当我们编译ko文件的时候,会生成一个.mod.c 的文件。

8.2 内核加载ko文件总结
本篇内容讲解的知识点比较零散,为了更好的总结学习,我们画了以下流程图。

 

 

图 8-2

总结一下,要加载内核模块,通常需要使用insmod命令或类似工具触发系统调用,然后在内核中执行相应的系统调用函数(如sys_finit_module或sys_init_module)来加载模块。在加载过程中,会调用load_module函数,进而执行模块的初始化函数。这些过程构成了加载内核模块的流程。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/BeiJingXunWei/article/details/135600709

标签:__,初始化,函数,RK3568,module,init,驱动,进阶
From: https://www.cnblogs.com/topeet/p/17999261

相关文章

  • RHEL 按NIVDIA驱动
    在RedHat或基于RedHat的系统(如CentOS或Fedora)上禁用nouveau驱动并安装NVIDIA官方驱动的步骤如下:步骤1:禁用nouveau驱动编辑/etc/default/grub文件,在GRUB_CMDLINE_LINUX行添加rd.driver.blacklist=nouveau和modprobe.blacklist=nouveau参数。同时,你也......
  • chrome驱动 selenium
    chrome驱动selenimchromedriver下载地址:ChromeDriver-WebDriverforChrome-Downloads官网下载地址: https://chromedriver.com/官网下载地址114版本以下:ChromeDriver114andolderversionsdownloadChromeDriverDownloadReleaseStable/Beta/Dev/Canary......
  • AP5165B 高端电流采样 36V/1A 高调光比LED恒流驱动IC SOT89-5
    产品应用原理图                                                                                  ......
  • AP5165B 高端电流采样 36V/1A 高调光比LED恒流驱动IC SOT89-5
    产品应用原理图                                                                                 ......
  • GC9008 12V 全桥驱动芯片,可替代TMI8118,应用于摄像机、消费类产品上
    GC9008是一款12V全桥驱动芯片,为提供高性价比的方案。它能提供0.1A的持续输出电流。可以工作在4.5~15V的电源电压上。具有PWM(IN1/IN2)输入接口,与行业标准器件兼容.是SOP8封装,GC9008D是DIP封装芯片特点●H桥电机驱动器--电源电压4.5~15V导通阻抗10Ω(HS+LS)●0.1A持......
  • Unity架构师进阶:红点系统的架构与设计
     面试的时候经常被问道如何来设计一个红点系统,本文将详细地介绍如何设计一个红点系统,有哪些接口,并完整地给出实现。红点系统的需求分析首先我们来分析一下红点系统的设计需求: 红点系统严格意义上来说不属于框架,而是游戏逻辑,所以代码不要放到通用的框架里面,并不属于基础服务......
  • 项目驱动式教学法
    简介项目驱动式教学法是一种以项目为主体,教学与项目实施相结合的教学方式。该方法强调对学生实际工作能力的培养,要求学生以小组协作方式制定计划并共同完成项目。在项目驱动式教学过程中,学生需要在实践中学习相关知识,培养实践能力,同时学会从不同角度思考问题,对知识点进行综合运用......
  • 【C语言进阶篇】动态内存常考笔试题
    (文章目录)......
  • 【20.0】MySQL进阶知识之索引
    【一】索引的概念索引(在MySQL中也叫做“键(key)”)是存储引擎用于快速找到记录的一种数据结构,这也是索引最基本的功能。索引对于良好的性能非常关键。数据量越大时,索引对性能的影响也越重要,好的索引可以将查询性能提高几个数量级。在数据量较小且负载较低时,不恰当的索引对性能......
  • 【19.0】MySQL进阶知识之流程控制
    【零】各种语言中的流程控制语句【1】Pythonif条件:子代码elif条件:子代码else:子代码【2】JavaScriptif(条件){子代码}elseif(条件){子代码}else{子代码}【3】MySQLif语句if条件then子代码elseif条件then子代码else......