CN108519947A - 一种Linux下读写寄存器的方法及工具 - Google Patents
一种Linux下读写寄存器的方法及工具 Download PDFInfo
- Publication number
- CN108519947A CN108519947A CN201810280339.XA CN201810280339A CN108519947A CN 108519947 A CN108519947 A CN 108519947A CN 201810280339 A CN201810280339 A CN 201810280339A CN 108519947 A CN108519947 A CN 108519947A
- Authority
- CN
- China
- Prior art keywords
- register
- read
- write
- specified
- parameter
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Stored Programmes (AREA)
Abstract
本申请公开了一种Linux下读写寄存器的方法及工具。该方法包括:从应用层获取指定寄存器的参数;对指定寄存器的参数进行解析,并根据寄存器位宽将解析后的数据分别传输至内核层;将指定寄存器的物理地址重映射到内核的线程空间;在内核层根据指定寄存器的读写接口对指定寄存器进行读写;将对指定寄存器读写的结果返回至应用层。该读写寄存器的工具包括regeditor模块和ker_rw模块。本申请中读写寄存器的工具,能够在不同的寄存器之间跨平台使用,有利于提高其通用性。采用本申请中的方法对寄存器进行读写,能够为项目调试提供一些关键的调试信息,有利于缩短问题的定位时间,有利于提高项目调试的效率。
Description
技术领域
本申请涉及寄存器调试技术领域,特别是涉及一种Linux下读写寄存器的方法及工具。
背景技术
项目开发调试中,经常会遇到上层业务逻辑触发硬件寄存器读写的情况,而寄存器状态是软件对硬件施加影响后的硬件现场记录。项目调试过程中,一个问题的出现可能来自上层业务、底层驱动、硬件设计或对端逻辑中的任何一方。这时,通过对硬件寄存器进行读写,获取到硬件寄存器的状态信息,就可以定位出问题出在哪里,并进一步配合细节调试。因此,项目开发调试过程中,如果出现I/O异常,就有监测/改写寄存器的调试需求。
目前,常用的硬件寄存器读写方法主要是采用/dev/mem设备节点编写读写寄存器的工具。具体地,通过编程生成/dev/mem设备文件,然后通过/dev/mem设备文件以及mmap函数,将硬件寄存器的地址映射到用户空间,直接在应用层对硬件寄存器进行读写操作。
然而,目前常用的硬件读写寄存器的工具及其实现方法中,/dev/mem设备文件与硬件寄存器工具所在平台的总线位宽有关,不同的/dev/mem设备文件适用于不用总线位宽的平台,如:在32位ARM平台上编译得到的硬件读写寄存器的工具,拿到64位X86平台上就不能使用。因此,目前常用的硬件读写寄存器的工具不具备跨平台的通用性,使用起来非常不方便,不便于推广。
发明内容
本申请提供了一种Linux下读写寄存器的方法及工具,以解决现有技术中硬件读写寄存器的工具不具备跨平台的通用性的问题。
为了解决上述技术问题,本申请实施例公开了如下技术方案:
一种Linux下读写寄存器的方法,所述方法包括:
从应用层获取指定寄存器的参数,所述参数包括:寄存器位宽、物理地址以及待读取数据的个数,或,寄存器位宽、物理地址以及待写入的寄存器值;
对指定寄存器的参数进行解析,并根据寄存器位宽将解析后的数据分别传输至内核层;
将指定寄存器的物理地址重映射到内核的线程空间;
在内核层根据指定寄存器的读写接口对指定寄存器进行读写;
将对指定寄存器读写的结果返回至应用层。
可选地,所述方法还包括:将对指定寄存器读写的结果返回至应用层后,对指定寄存器的物理地址解除重映射。
可选地,从应用层获取指定寄存器的参数之后,所述方法还包括:
对所获取的指定寄存器的参数进行检测,判断所述参数是否符合预设的参数输入规则;
如果是,对指定寄存器的参数进行解析;
如果否,通过调用print_usage()函数,打印参数输入规则至应用层,直到所获取的参数符合要求为止。
可选地,在内核层根据指定寄存器的读写接口对指定寄存器进行读写时,根据当前指定寄存器的硬件逻辑设置一超时时间,用于控制指定寄存器的工作状态。
可选地,所述在内核层根据指定寄存器的读写接口对指定寄存器进行读写时,根据当前的指定寄存器的硬件逻辑设置一超时时间,用于控制指定寄存器的工作状态,包括:
判断当前的指定寄存器是否处于工作状态;
如果是,根据当前的指定寄存器的硬件逻辑设置一超时时间,直到指定寄存器处于空闲状态时开始读写;
如果否,直接在内核层根据指定寄存器的读写接口对指定寄存器进行读写。
一种Linux下读写寄存器的工具,所述读写寄存器的工具包括:regeditor模块和ker_rw模块;
所述regeditor模块面向应用层,用于获取指定寄存器的参数,其中,所述参数包括:寄存器位宽、物理地址以及待读取数据的个数,或,寄存器位宽、物理地址以及待写入的寄存器值;
所述regeditor模块,还用于对指定寄存器的参数进行解析,并根据寄存器位宽将解析后的数据分别传输至ker_rw模块;
所述ker_rw模块面向内核层,用于将指定寄存器的物理地址重映射到ker_rw模块内核的线程空间,并根据指定寄存器的读写接口对指定寄存器进行读写;
所述ker_rw模块,还用于将对指定寄存器读写的结果返回至regeditor模块。
可选地,所述regeditor模块,还用于对所获取的指定寄存器的参数进行检测,判断所述参数是否符合预设的参数输入规则。
可选地,所述ker_rw模块,还用于将对指定寄存器读写的结果返回至regeditor模块后,对指定寄存器的物理地址解除重映射。
可选地,所述ker_rw模块中设置有延时单元,用于在内核层根据指定寄存器的读写接口对指定寄存器进行读写时,根据当前的指定寄存器的硬件逻辑设置一超时时间,用于控制指定寄存器的工作状态。
可选地,所述读写寄存器的工具包括:一面向应用层的可执行文件和一面向内核层的.ko文件。
本申请的实施例提供的技术方案可以包括以下有益效果:
本申请提供一种Linux下读写寄存器的方法,该方法主要通过面向应用层和内核层进行编程,来实现对寄存器的读写。其中,首先从应用层获取指定寄存器的参数;其次对指定寄存器的参数进行解析,并根据寄存器位宽将解析后的数据分别传输至内核层;然后,在内核层中,将指定寄存器的物理地址重映射到内核的线程空间,并在内核层根据指定寄存器的读写接口对指定寄存器进行读写;最后,将对指定寄存器读写的结果返回至应用层,以作为调试用的关键信息供工作人员查看。本申请中对寄存器的参数解析后,是根据寄存器位宽将解析后的数据分别传输至内核层,且在内核层根据指定寄存器的读写接口对指定寄存器进行读写,能够使本申请中读写寄存器的方法应用于不同位宽的寄存器,从而使本方法能够在不同的寄存器之间跨平台使用,有利于提高其通用性。而且,本方法涉及应用层和内核层两部分的编程,深入应用层和内核层对寄存器进行读写,从而对寄存器的状态进行跟踪记录,能够为项目调试提供一些关键的调试信息,有利于缩短问题的定位时间,有利于提高项目调试的效率。
另外,本申请的一个实施例中还包括:在内核层根据指定寄存器的读写接口对指定寄存器进行读写时,根据当前指定寄存器的硬件逻辑设置一超时时间,用于控制指定寄存器的工作状态。当指定寄存器当前处于工作状态时,设置一超时时间,直到其处于空闲状态时再进行读写。超时时间的设置,能够根据指定寄存器当前的工作状态灵活调整读写工作,从而能够使本方法兼顾更多的读写情形。
本申请还提供一种Linux下读写寄存器的工具。该工具主要包括regeditor模块和ker_rw模块,其中regeditor模块面向应用层,用于获取指定寄存器的参数,还用于对指定寄存器的参数进行解析,并根据寄存器位宽将解析后的数据分别传输至ker_rw模块;ker_rw模块面向内核层,用于将指定寄存器的物理地址重映射到ker_rw模块内核的线程空间,并根据指定寄存器的读写接口对指定寄存器进行读写,还用于将对指定寄存器读写的结果返回至regeditor模块。本申请实施例中的regeditor模块,是根据寄存器位宽将解析后的数据分别传输至ker_rw模块,而且ker_rw模块根据指定寄存器的读写接口对指定寄存器进行读写,因此,能够使得本申请适用于不同位宽的寄存器,实现跨平台兼容性,有利于提高本申请实施例的通用性。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例所提供的一种Linux下读写寄存器的方法的流程示意图;
图2为本申请实施例所提供的另一种Linux下读写寄存器的方法的流程示意图;
图3为本申请实施例所提供的一种Linux下读写寄存器的工具的结构示意图;
图4为本申请实施例中读写寄存器的原理图。
具体实施方式
为了使本技术领域的人员更好地理解本申请中的技术方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
为了更好地理解本申请,下面结合附图来详细解释本申请的实施方式。
实施例一
参见图1,图1为本申请实施例所提供的一种Linux下读写寄存器的方法的流程示意图。由图1可知,本实施例中读写寄存器的方法主要包括如下步骤:
S1:从应用层获取指定寄存器的参数。
其中,指定寄存器的参数包括:寄存器位宽、物理地址以及待读取数据的个数,或,寄存器位宽、物理地址以及待写入的寄存器值。也就是说,如果指定的操作为读寄存器,那么从应用层获取的参数包括:寄存器位宽、物理地址以及待读取数据的个数。如果指定的操作为写寄存器,那么从应用层获取的参数包括:寄存器位宽、物理地址以及待写入的寄存器值。
本申请中读写寄存器的方法可以通过编程来实现,主要涉及应用层和内核层两部分编程,应用层部分负责功能逻辑的实现,内核层部分负责搭建“基础设施”。
其中,步骤S1中的方法是面向应用层的,可以通过接收用户在命令行输入的指定寄存器的参数,来实现从应用层获取指定寄存器的参数。
获取到指定寄存器的参数后,执行步骤S4:对指定寄存器的参数进行解析,并根据寄存器位宽将解析后的数据分别传输至内核层。
以寄存器位宽为第一参数,物理地址为第二参数,待读取数据的个数或待写入的寄存器值为第三参数为例。对指定寄存器的参数进行解析时,通常先对第二参数和第三参数进行解析,将指定寄存器的物理地址以及与该地址相应的待读取数据的个数或者与该地址相应的待写入的寄存器值保存到本地。然后再解析第一个参数,并通过解析第一个参数判断要读写的指定寄存器的位宽,根据寄存器位宽这个参数,将解析后的数据分别传输至内核层中相应的处理分支中。例如:如果命令行输入的是“r8”,表示要读取8bit位宽的寄存器,进入处理分支后,会通过一个for循环将要求的num个待读取数据多次通过接口发送至内核层。如果命令行输入的是“w64”,表示是要写入64bit位宽的寄存器,同样通过判断进入与64bit位宽的寄存器相应的处理分支后,通过接口将待写入的寄存器值传递至内核层。
本实施例中将指定寄存器的参数从应用层传输至内核层时,可以利用ioctl接口进行传输,即可以调用ioctl()函数进行传输。
由以上步骤S1和S4可知,本申请中获取寄存器参数时,同时采集指定寄存器的位宽这一参数。将指定寄存器的参数从应用层传输至内核层时,是根据寄存器位宽将解析后的数据分别传输至内核层。其中,本实施例中寄存器的位宽可以包括:8bit/16bit/32bit/64bit。
本实施例中可以根据寄存器的不同位宽,将指定寄存器的参数分别传输至内核层中不同的处理分支,因此,本申请能够兼容不同位宽的平台的寄存器读写,从最简单的8bit单片机寄存器到64bit的X86平台寄存器,都可以通过各自的编译器编译后得到可执行文件来直接使用,实现读写寄存器的功能,能够大大提高本申请的通用性。
继续参见图1可知,执行完步骤S4后,进入步骤S5:将指定寄存器的物理地址重映射到内核的线程空间。
为实现在内核层对指定寄存器进行读写,需要获取指定寄存器的虚拟地址,也就是首先需要将指定寄存器的物理地址重映射到本地,即:重映射到内核的线程空间。
本实施例中,映射是指将寄存器物理地址映射为linux使用的虚拟地址,重映射是指对寄存器的物理地址进行的再次映射。根据操作系统的进程调度模块的设计原则,目标软件所调度的内核线程的地址空间和目标软件调试工具的内核线程的地址空间是隔离的。而对当前正在调试的目标软件来说,内核肯定已对其做过一次映射,本实施例为了在内核层对指定寄存器进行读写,需要再次进行映射,也就是重映射。经过重映射后,Linux系统下会存在两组虚拟地址对应同一组寄存器的物理地址的情况,对任一虚拟地址进行读写操作,都可以作用到实际物理寄存器中。
重映射完成后,执行步骤S6:在内核层根据指定寄存器的读写接口对指定寄存器进行读写。
由于不同硬件平台的寄存器读写接口有可能是不同的,在内核层对指定寄存器进行读写时,根据硬件平台的不同,有选择地使用相应的读写接口对其进行读写。这种方法,使本实施例能够兼容多个不同的寄存器读写接口,有利于实现跨平台使用。
S7:将对指定寄存器读写的结果返回至应用层。
在内核层对指定寄存器进行读写后,获取到该指定寄存器的读写结果,也就是指定寄存器的硬件状态信息,将此结果返回至应用层,工作人员才能查看到指定寄存器的硬件状态信息。
采用本实施例中的方法进行代码编写时,遵守POXIS(Portable OperatingSystem Interface of UNIX,可移植操作系统接口)标准,能够确保采用本申请中的方法所编写的代码兼容多种平台,有利于进一步提高本申请的通用性,便于推广使用。
实施例二
在图1所示实施例的基础之上参见图2,图2为本申请实施例所提供的另一种Linux下读写寄存器的方法的流程示意图。由图2可知,本实施例中执行步骤S1从应用层获取指定寄存器的参数后,进入步骤S2:对所获取的指定寄存器的参数进行检测,判断参数是否符合预设的参数输入规则。如果参数符合预设的参数输入规格,直接进入步骤S4。如果参数不符合预设的参数输入规格,执行步骤S3:通过调用print_usage()函数,打印参数输入规则至应用层,直到所获取的参数符合要求为止,再进入步骤S4。
本实施例中预设的参数输入规则,是指对所输入的参数设定的命令格式。如:
Usage:
./regeditor r8addr[num]
./regeditor r16addr[num]
./regeditor r32addr[num]
./regeditor w8addr val
./regeditor w16addr val
./regeditor w32addr val
其中,参数指的是./regeditor后面的内容。
步骤S2和S3的设置,能够对步骤S1中所获取的寄存器参数进行进一步的确认和检测,有利于提高所获取参数的准确性,从而提高读写寄存器的效率。
继续参见图2可知,在内核层根据指定寄存器的读写接口对指定寄存器进行读写时,根据当前指定寄存器的硬件逻辑设置一超时时间,用于控制指定寄存器的工作状态,具体包括如下过程:
S61:判断当前的指定寄存器是否处于工作状态。
S62:如果是,根据当前的指定寄存器的硬件逻辑设置一超时时间,直到指定寄存器处于空闲状态时开始读写。
S63:如果否,直接在内核层根据指定寄存器的读写接口对指定寄存器进行读写。
本实施例中,在内核层根据指定寄存器的读写接口对指定寄存器进行读写时,可以根据当前指定寄存器的工作状态设置一超时时间。
该超时时间根据当前的指定寄存器的硬件逻辑进行设定,为一经验值,时间的长度与寄存器的硬件逻辑有关。超时时间可以直接使用内核提供的相关接口函数来设置,一般几十毫秒。例如:由于原本驱动线程占用或者其他原因,如果读写寄存器的工具在指定时间内,也就是超时时间内,没有读到或者写入寄存器,即认为无法继续读写了,就不再等待,直接返回。
由以上步骤S61-S63可知,超时时间的设置,能够根据指定寄存器当前的工作状态灵活调整读写工作,从而能够使本申请兼顾到更多的读写情形,有利于提高本申请的通用性。而且超时时间的设置,避免寄存器读写被中断,有利于节省寄存器读写时间。
继续参见图2可知,本实施例中执行步骤S7:将对指定寄存器读写的结果返回至应用层之后,还包括步骤S8:对指定寄存器的物理地址解除重映射。
为在内核层对指定寄存器进行读写,步骤S5中将指定寄存器的物理地址重映射到内核的线程空间中。当执行完步骤S7后,重映射的虚拟地址已经无效,通过执行步骤S5对指定寄存器的物理地址解除重映射,能够释放系统空间,节省系统资源占用。
当然,本申请还包括其他一些实施例,如:包括步骤S1、S2、S3、S4、S5、S6和S7的实施例;包括步骤S1、S4、S5、S6、S7和S8的实施例;包括步骤S1、S4、S5、S61、62、S63和S7的实施例;包括S1、S2、S3、S4、S5、S6、S7和S8的实施例;包括S1、S2、S3、S4、S5、S61、62、S63和S7的实施例;包括S1、S4、S5、S61、62、S63、S7和S8的实施例。
该实施例未详细描述的部分可参照图1所示的实施例一,两者之间可以互相参照,在此不再详细阐述。
实施例三
在图1和图2所示实施例的基础之上参见图3,图3为本申请实施例所提供的一种Linux下读写寄存器的工具的结构示意图。由图3可知,本申请中读写寄存器的工具主要包括regeditor模块和ker_rw模块两个部分。其中,regeditor模块面向应用层,用于获取指定寄存器的参数,参数包括:寄存器位宽、物理地址以及待读取数据的个数,或,寄存器位宽、物理地址以及待写入的寄存器值;regeditor模块还用于对指定寄存器的参数进行解析,并根据寄存器位宽将解析后的数据分别传输至ker_rw模块。ker_rw模块面向内核层,用于将指定寄存器的物理地址重映射到ker_rw模块内核的线程空间,并根据指定寄存器的读写接口对指定寄存器进行读写;ker_rw模块还用于将对指定寄存器读写的结果返回至regeditor模块。
进一步地,本实施例中regeditor模块可以包括:信息获取单元、解析单元和传输单元。其中,信息获取单元用于获取指定寄存器的寄存器位宽、物理地址以及待读取数据的个数,或,指定寄存器的寄存器位宽、物理地址以及待写入寄存器值;解析单元用于对指定寄存器的参数进行解析,获取解析后的数据;传输单元用于将解析后的数据根据寄存器位宽,分别传输至ker_rw模块。
ker_rw模块包括:重映射单元、读写单元和返回单元。其中,重映射单元用于将指定寄存器的物理地址重映射到ker_rw模块内核的线程空间;读写单元用于根据指定寄存器的读写接口对指定寄存器进行读写;返回单元用于将对指定寄存器读写的结果返回至regeditor模块。
本实施例中读写寄存器的原理可以参见图4,由图4可知,本实施例在应用层设置regeditor模块,在内核层设置ker_rw模块。regeditor模块通过ioctl接口将所采集的寄存器的数据传输至ker_rw模块,ker_rw模块将硬件寄存器的物理地址重映射到内核层,并对寄存器进行读写,读写完毕后解除重映射,并通过ioctl接口将数据返回至应用层的regeditor模块。
本实施例中,regeditor模块负责接收命令行输入的指定寄存器的参数信息,并将其解析后传递到内核ker_rw模块。为进一步确保regeditor模块所获取的参数的准确性,本实施例的regeditor模块中还可以设置一参数检测单元和打印单元。其中,参数检测单元用于对所获取的指定寄存器的参数进行检测,判断参数是否符合预设的参数输入规则;打印单元用于调用print_usage()函数,打印参数输入规则至应用层。如果参数检测单元检测到参数符合要求,解析单元对参数进行解析;如果参数检测单元检测到参数不符合要求,打印单元调用print_usage()函数,打印参数输入规则至应用层,直到所获取的参数符合要求为止,然后打开ker_rw模块在Linux系统中自动创建的/dev/ker_rw节点,获取文件描述符,再由解析单元对参数进行解析。
需要注意的是,在Linux系统下,本实施例中只要在ker_rw模块的入口函数中调用内核标准接口class_create()/device_create(),应用层的mdev或udev就会在系统启动时自动创建设备节点。
本实施例中regeditor模块的生成,可以采用如下的代码逻辑:
需要注意的是:以上代码逻辑中省略了函数返回值检测的代码。
本实施例中regeditor模块的用法,以#./regeditor r8addr[num]和#./regeditor w32addr val为例。regeditor是编译后生成的工具名,r8表示读8bit位宽的寄存器,w32表示写32bit位宽的寄存器,本实施例至少支持8/16/32/64bit位宽的寄存器读写。addr是寄存器物理起始地址,num表示要读取的数据个数,val是待写入的寄存器值。
本实施例中的ker_rw模块,主要用于对指定寄存器进行读写,并将读写的结果返回至应用层的regeditor模块,以便为工作人员提供调试用的关键信息,而为了对指定寄存器进行读写,首先需要将指定寄存器的物理地址重映射到ker_rw模块内核的线程空间。由此可见,本实施例中的ker_rw模块并不对具体的某个硬件寄存器进行驱动初始化,只是承担设备驱动中与硬件进行交互的功能,因此,ker_rw模块能够适配不同位宽的寄存器,有利于提高读写寄存器的工具的通用性。
进一步地,本实施例的ker_rw模块还用于将对指定寄存器读写的结果返回至regeditor模块后,对指定寄存器的物理地址解除重映射。具体可以在ker_rw模块中设置一重映射解除单元,用于将对指定寄存器读写的结果返回至regeditor模块后,对指定寄存器的物理地址解除重映射。重映射解除单元的设置,能够及时释放无效的系统资源,有利于节省系统空间,提高寄存器读写效率。
本实施例中ker_rw模块在软件实现上可分为两部分:一部分是ker_rw模块的出入口函数中字符设备的注册、注销及相关资源的申请、释放等;另一部分是面向应用层的,与应用层进行数据交互的函数集file_operations的实现。
其中,入口函数中字符设备的注册以及相关资源的申请,可以采用如下的代码逻辑:
需要注意的是,以上代码逻辑省略了函数返回值检测。由以上代码逻辑可知,入口函数ker_rw_init()的主要工作是字符设备的创建及初始化。该入口函数首先调用alloc_chrdev_region()申请字符设备号“reg_rw”,接着调用cdev_init()初始化字符设备并与所创建的ker_rw_ops这一file_operations进行绑定,然后调用cdev_add()将初始化好的字符设备注册进内核。另外,为了实现自动创建设备节点,可以调用class_create()和device_create()创建/sys下属性文件。
ker_rw模块的出口函数为入口函数反过程,即字符设备的注销和相关资源的释放,在此不再举例。
ker_rw模块中,与应用层进行数据交互的函数集file_operations的实现,可以采用如下代码逻辑:
static struct file_operations ker_rw_ops={
.owner=THIS_MODULE,
.open=ker_rw_open,
.unlocked_ioctl=ker_rw_ioctl,
};
以上代码中,ker_rw_open用于打开设备文件节点,并将filp->private_data指定为我们在入口函数中初始化好的reg_devp。ker_rw_ioctl用于处理所有的数据交互过程,其代码逻辑所示如下:
由以上代码逻辑可知,指定寄存器的参数由regeditor模块传输至ker_rw模块时,首先调用copy_from_user()将用户空间数据拷贝到本地,随后根据传入的命令码进入不同位宽寄存器的读写分支,例如:要写64位宽的寄存器,则会进入case KER_RW_W64分支。然后开始进行重映射,首先调用ioremap()函数将待读取寄存器的物理地址重映射到本地,然后将应用层传入的寄存器值写入指定内存地址,最后调用iounmap()解除映射关系。
进一步地,本实施的ker_rw模块中设置有延时单元,用于在内核层根据指定寄存器的读写接口对指定寄存器进行读写时,根据当前的指定寄存器的硬件逻辑设置一超时时间,用于控制指定寄存器的工作状态。
本实施例中ker_rw模块遵守设备模型进行设计,遵守设备模块设计的ker_rw模块,能够更加充分地利用Linux系统现有的高效的设备模型,发挥Linux软件框架的优势,有利于代码的长期维护和升级,从而有利于ker_rw模块的维护和更新。
进一步地,本申请实施例中读写寄存器的工具包括:一面向应用层的可执行文件和一面向内核层的.ko文件。
本实施中的读写寄存器的工具可以采用通过代码编程形成文件的形式,即:形成可执行文件和.ko文件。使用该读写寄存器的工具时,先加载.ko文件,再执行应用层的可执行文件。
通常情况下,Linux内核下的模块可以直接编译到最后的内核镜像中,也可以单独编译成.ko后缀的文件。本实施例中面向内核的ker_rw模块采用.ko文件的形式,用的时候通过insmod ker_rw.ko命令,现场进行安装;用完后通过rmmod ker_rw命令进行卸载即可。面向内核层的ker_rw模块采用.ko文件的形式,能够在不同的应用场景下灵活进行安装和卸载,有利于提高读写寄存器的工具的灵活性,从而有利于其推广使用。
该实施例未详细描述的部分可参照图1所示的实施例一和图2所示的实施例二,三者之间可以互相参照,在此不再详细阐述。
以上所述仅是本申请的具体实施方式,使本领域技术人员能够理解或实现本申请。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (10)
1.一种Linux下读写寄存器的方法,其特征在于,所述方法包括:
从应用层获取指定寄存器的参数,所述参数包括:寄存器位宽、物理地址以及待读取数据的个数,或,寄存器位宽、物理地址以及待写入的寄存器值;
对指定寄存器的参数进行解析,并根据寄存器位宽将解析后的数据分别传输至内核层;
将指定寄存器的物理地址重映射到内核的线程空间;
在内核层根据指定寄存器的读写接口对指定寄存器进行读写;
将对指定寄存器读写的结果返回至应用层。
2.根据权利要求1所述的一种Linux下读写寄存器的方法,其特征在于,所述方法还包括:将对指定寄存器读写的结果返回至应用层后,对指定寄存器的物理地址解除重映射。
3.根据权利要求1所述的一种Linux下读写寄存器的方法,其特征在于,从应用层获取指定寄存器的参数之后,所述方法还包括:
对所获取的指定寄存器的参数进行检测,判断所述参数是否符合预设的参数输入规则;
如果是,对指定寄存器的参数进行解析;
如果否,通过调用print_usage()函数,打印参数输入规则至应用层,直到所获取的参数符合要求为止。
4.根据权利要求1-3中任意一项所述的一种Linux下读写寄存器的方法,其特征在于,在内核层根据指定寄存器的读写接口对指定寄存器进行读写时,根据当前指定寄存器的硬件逻辑设置一超时时间,用于控制指定寄存器的工作状态。
5.根据权利要求4所述的一种Linux下读写寄存器的方法,其特征在于,所述在内核层根据指定寄存器的读写接口对指定寄存器进行读写时,根据当前的指定寄存器的硬件逻辑设置一超时时间,用于控制指定寄存器的工作状态,包括:
判断当前的指定寄存器是否处于工作状态;
如果是,根据当前的指定寄存器的硬件逻辑设置一超时时间,直到指定寄存器处于空闲状态时开始读写;
如果否,直接在内核层根据指定寄存器的读写接口对指定寄存器进行读写。
6.一种Linux下读写寄存器的工具,其特征在于,所述读写寄存器的工具包括:regeditor模块和ker_rw模块;
所述regeditor模块面向应用层,用于获取指定寄存器的参数,其中,所述参数包括:寄存器位宽、物理地址以及待读取数据的个数,或,寄存器位宽、物理地址以及待写入的寄存器值;
所述regeditor模块,还用于对指定寄存器的参数进行解析,并根据寄存器位宽将解析后的数据分别传输至ker_rw模块;
所述ker_rw模块面向内核层,用于将指定寄存器的物理地址重映射到ker_rw模块内核的线程空间,并根据指定寄存器的读写接口对指定寄存器进行读写;
所述ker_rw模块,还用于将对指定寄存器读写的结果返回至regeditor模块。
7.根据权利要求6所述的一种Linux下读写寄存器的工具,其特征在于,所述regeditor模块,还用于对所获取的指定寄存器的参数进行检测,判断所述参数是否符合预设的参数输入规则。
8.根据权利要求6所述的一种Linux下读写寄存器的工具,其特征在于,所述ker_rw模块,还用于将对指定寄存器读写的结果返回至regeditor模块后,对指定寄存器的物理地址解除重映射。
9.根据权利要求6所述的一种Linux下读写寄存器的工具,其特征在于,所述ker_rw模块中设置有延时单元,用于在内核层根据指定寄存器的读写接口对指定寄存器进行读写时,根据当前的指定寄存器的硬件逻辑设置一超时时间,用于控制指定寄存器的工作状态。
10.根据权利要求6-9中任意一项所述的一种Linux下读写寄存器的工具,其特征在于,所述读写寄存器的工具包括:一面向应用层的可执行文件和一面向内核层的.ko文件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810280339.XA CN108519947A (zh) | 2018-04-02 | 2018-04-02 | 一种Linux下读写寄存器的方法及工具 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810280339.XA CN108519947A (zh) | 2018-04-02 | 2018-04-02 | 一种Linux下读写寄存器的方法及工具 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN108519947A true CN108519947A (zh) | 2018-09-11 |
Family
ID=63430988
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810280339.XA Pending CN108519947A (zh) | 2018-04-02 | 2018-04-02 | 一种Linux下读写寄存器的方法及工具 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108519947A (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109614147A (zh) * | 2018-12-03 | 2019-04-12 | 郑州云海信息技术有限公司 | 一种phy寄存器读写方法和装置 |
CN110209605A (zh) * | 2019-05-31 | 2019-09-06 | 广州大学 | Pcie总线网卡的寄存器读写方法和计算设备 |
CN110703943A (zh) * | 2019-09-29 | 2020-01-17 | 广东美的制冷设备有限公司 | 液晶面板的静电防护方法、装置、电子设备及存储介质 |
CN114035855A (zh) * | 2021-09-30 | 2022-02-11 | 鸣芯信息科技(上海)有限公司 | 固件的调试方法、装置、终端及存储介质 |
CN117687626A (zh) * | 2024-02-04 | 2024-03-12 | 双一力(宁波)电池有限公司 | 一种上位机和主程序匹配系统及方法 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1908885A (zh) * | 2006-08-11 | 2007-02-07 | 华为技术有限公司 | 静态存储器接口装置及其数据传输方法 |
CN101841640A (zh) * | 2010-04-19 | 2010-09-22 | 深圳市九洲电器有限公司 | 一种数据流处理可编程逻辑芯片及机顶盒 |
CN102799419A (zh) * | 2012-09-05 | 2012-11-28 | 无锡江南计算技术研究所 | 寄存器写冲突检测方法及装置、以及处理器 |
CN105573932A (zh) * | 2015-12-11 | 2016-05-11 | 中国航空工业集团公司西安航空计算技术研究所 | 一种基于寄存器的多位宽数据跨时钟域访问方法 |
CN105760318A (zh) * | 2016-02-16 | 2016-07-13 | 烽火通信科技股份有限公司 | 一种基于Linux系统读写光模块寄存器的方法 |
CN107704489A (zh) * | 2017-08-21 | 2018-02-16 | 北京小米移动软件有限公司 | 读写超时的处理方法、装置及计算机可读存储介质 |
-
2018
- 2018-04-02 CN CN201810280339.XA patent/CN108519947A/zh active Pending
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1908885A (zh) * | 2006-08-11 | 2007-02-07 | 华为技术有限公司 | 静态存储器接口装置及其数据传输方法 |
CN101841640A (zh) * | 2010-04-19 | 2010-09-22 | 深圳市九洲电器有限公司 | 一种数据流处理可编程逻辑芯片及机顶盒 |
CN102799419A (zh) * | 2012-09-05 | 2012-11-28 | 无锡江南计算技术研究所 | 寄存器写冲突检测方法及装置、以及处理器 |
CN105573932A (zh) * | 2015-12-11 | 2016-05-11 | 中国航空工业集团公司西安航空计算技术研究所 | 一种基于寄存器的多位宽数据跨时钟域访问方法 |
CN105760318A (zh) * | 2016-02-16 | 2016-07-13 | 烽火通信科技股份有限公司 | 一种基于Linux系统读写光模块寄存器的方法 |
CN107704489A (zh) * | 2017-08-21 | 2018-02-16 | 北京小米移动软件有限公司 | 读写超时的处理方法、装置及计算机可读存储介质 |
Non-Patent Citations (1)
Title |
---|
绿叶清风: "linux驱动调试之自制工具-寄存器编辑器", 《CSDN:HTTPS://BLOG.CSDN.NET/PZ0605/ARTICLE/DETAILS/73008909》 * |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109614147A (zh) * | 2018-12-03 | 2019-04-12 | 郑州云海信息技术有限公司 | 一种phy寄存器读写方法和装置 |
CN109614147B (zh) * | 2018-12-03 | 2022-02-22 | 郑州云海信息技术有限公司 | 一种phy寄存器读写方法和装置 |
CN110209605A (zh) * | 2019-05-31 | 2019-09-06 | 广州大学 | Pcie总线网卡的寄存器读写方法和计算设备 |
CN110703943A (zh) * | 2019-09-29 | 2020-01-17 | 广东美的制冷设备有限公司 | 液晶面板的静电防护方法、装置、电子设备及存储介质 |
CN110703943B (zh) * | 2019-09-29 | 2024-03-19 | 广东美的制冷设备有限公司 | 液晶面板的静电防护方法、装置、电子设备及存储介质 |
CN114035855A (zh) * | 2021-09-30 | 2022-02-11 | 鸣芯信息科技(上海)有限公司 | 固件的调试方法、装置、终端及存储介质 |
CN114035855B (zh) * | 2021-09-30 | 2023-10-27 | 鸣芯信息科技(上海)有限公司 | 固件的调试方法、装置、终端及存储介质 |
CN117687626A (zh) * | 2024-02-04 | 2024-03-12 | 双一力(宁波)电池有限公司 | 一种上位机和主程序匹配系统及方法 |
CN117687626B (zh) * | 2024-02-04 | 2024-05-03 | 双一力(宁波)电池有限公司 | 一种上位机和主程序匹配系统及方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108519947A (zh) | 一种Linux下读写寄存器的方法及工具 | |
CN109783342A (zh) | 脚本调试方法、设备及计算机存储介质 | |
US9063817B2 (en) | Application platform and method for operating a data processing arrangement having such an application platform | |
US20090172664A1 (en) | Adding a profiling agent to a virtual machine to permit performance and memory consumption analysis within unit tests | |
KR20060102479A (ko) | 어플리케이션 호스트 환경에서 유닛 테스트를 실행하기위한 장치 및 방법 | |
CN106325970A (zh) | 编译方法和编译系统 | |
CN102859489B (zh) | 可恢复的方法 | |
CN103645945A (zh) | 一种虚拟网卡的自动探测及驱动加载方法 | |
CN113553124B (zh) | 一种应用程序的运行方法、计算设备及存储介质 | |
CN104216771B (zh) | 软件程序的重启方法及装置 | |
CN105843697B (zh) | 一种浏览器控件的中断恢复方法及系统 | |
CN109656844A (zh) | 一种AT24xx EEPROM驱动方法和装置 | |
CN106990983A (zh) | 单片机烧写方法、装置、系统及单片机 | |
US20110231865A1 (en) | Application Platform And Method For Operating A Data Processing Arrangement Having Such An Application Platform | |
CN101493775A (zh) | 嵌入式系统的动态加载系统及其加载方法 | |
CN111562436B (zh) | 双芯智能电表的设备驱动方法和装置 | |
CN109062805A (zh) | 一种aep内存固件升降级测试方法、装置、终端及存储介质 | |
CN103678099A (zh) | 一种实现硬件平台与软件平台通讯的方法以及装置 | |
CN107544751A (zh) | 一种远程访问磁盘的方法和装置 | |
CN109558217A (zh) | 数据处理脚本程序运行方法以及数据处理容器 | |
CN115878267A (zh) | 对固件系统的仿真装置、方法、存储介质及电子设备 | |
CN107066508A (zh) | 信息快照方法、设备及cpu | |
CN101763292B (zh) | 基于地址窗口的处理器推测访问过滤装置及其过滤方法 | |
CN113849397A (zh) | 执行引擎、虚拟机、相关装置和相关方法 | |
KR20090085048A (ko) | 프로그램 코드 변환에 관한 프로세스 파일시스템을 관리하는 방법 및 기기 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20180911 |
|
RJ01 | Rejection of invention patent application after publication |