Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 微控制器上的时间测量值不同_C_Gcc_Microcontroller_Cpu Cycles - Fatal编程技术网

C 微控制器上的时间测量值不同

C 微控制器上的时间测量值不同,c,gcc,microcontroller,cpu-cycles,C,Gcc,Microcontroller,Cpu Cycles,我正在测量不同C函数的循环计数,我试图使其保持恒定的时间,以减轻侧通道攻击(加密) 我正在使用一个微控制器(来自英飞凌的aurix),它有一个板载循环计数器,每个时钟周期递增,我可以读出 考虑以下几点: int result[32], cnt=0; int secret[32]; /** some other code***/ reset_and_startCounter(); //resets cycles to 0 and starts the counter int tmp = read

我正在测量不同C函数的循环计数,我试图使其保持恒定的时间,以减轻侧通道攻击(加密)

我正在使用一个微控制器(来自英飞凌的aurix),它有一个板载循环计数器,每个时钟周期递增,我可以读出

考虑以下几点:

int result[32], cnt=0;
int secret[32];
/** some other code***/

reset_and_startCounter(); //resets cycles to 0 and starts the counter
int tmp = readCycles(); //read cycles before function call

function(secret) //I want to measure this function, should be constant time

result[cnt++] = readCycles() - tmp; //read out cycles and subtract to get correct result
void function(int* input){
    reset_and_startCounter(); 
    int tmp = readCycles(); 
   /*********************************
    ******calculations on input******
    *********************************/
    result[cnt++] = readCycles() - tmp;
}
当我测量如上所示的周期时,有时会收到不同数量的周期,具体取决于函数的输入。(~1-10个周期差,函数本身大约需要3000个周期)

我现在想知道它是否还不是完全恒定的时间,并且计算依赖于一些输入。我查看了函数并执行了以下操作:

int result[32], cnt=0;
int secret[32];
/** some other code***/

reset_and_startCounter(); //resets cycles to 0 and starts the counter
int tmp = readCycles(); //read cycles before function call

function(secret) //I want to measure this function, should be constant time

result[cnt++] = readCycles() - tmp; //read out cycles and subtract to get correct result
void function(int* input){
    reset_and_startCounter(); 
    int tmp = readCycles(); 
   /*********************************
    ******calculations on input******
    *********************************/
    result[cnt++] = readCycles() - tmp;
}
无论输入什么,我都会收到相同数量的循环

然后,我还测量了只调用函数和从函数返回所需的时间。无论输入什么,两个测量值都是相同的

我总是使用gcc编译器标志-O3,-fomit帧指针-O3因为运行时非常关键,我需要它的速度。同样重要的是,微控制器上没有运行其他代码(没有操作系统等)

有人对此有可能的解释吗。我想确保安全,我的代码是固定时间的,这些周期是任意的

很抱歉,这里没有提供可运行的代码,但我相信没有多少人有Aurix:O


谢谢

您使用的Infineon Aurix微控制器是为硬实时应用而设计的。它被有意设计为提供一致的运行时性能——它缺少在更复杂的CPU上可能导致性能不一致的大多数功能,如缓存或分支预测


虽然显示您的代码在此部件上具有恒定运行时是一个开始,但在其他CPU上运行时,您的代码仍然可能具有可变运行时。也有可能包含此CPU的设备可能通过其他通道泄漏信息,特别是通过电源分析。如果使您的应用程序抵抗侧通道分析是至关重要的,那么您可能需要考虑使用为加密应用程序设计的部件。(Aurix不是这样的一部分。)

您的代码中有任何条件吗?每次将数据提供给函数时,数据是否对齐。当您更改实验时,您的代码是否会更改对齐方式。你能保证测试过程中没有中断吗?您是否检查了与测试代码相关的每个实验的反汇编?预计会有变化,微控制器的一致性要比微处理器一致得多,这不是因为处理器,而是因为它们周围的系统以及它们的确定性与否。(但处理器也在如何获取和缓存以及其他因素方面发挥作用)。代码不包含条件。我没有处理数据对齐,我将看看对齐。代码本身不会更改对齐方式。不,我还没有看过汇编代码。中断被禁用且未使用缓存。tmp应该是易失性的,以避免干扰时间测量的优化。和/或检查反汇编。如果您依赖于函数来获取周期,那么如何使用专门读取和存储时间的汇编语言来包装测试中的代码呢?如果它确实是一个cpu寄存器,那么应该是测试中代码两侧的一行或几行代码。(是的,库调用应该是一致的,我们希望,但必须看到与库调用相关的所有代码)谢谢,是的,这是真的,在不同的设备上可能存在非常量运行时,但我专门为论文中的aurix设计了代码。定时侧通道是最容易利用的。。。这就是为什么我需要使代码的时间恒定。DPA等将是一个进一步的步骤,不是本文的一部分。你是否知道为什么不同的测量点会导致不同的输出?一个是常量时间,另一个不是?调用代码之前的前提条件总是一样的吗?也许处理器必须根据之前执行的代码清理一些内部寄存器。我只是移动测量的入口点和出口点。没有别的了。。。