在查看英特尔数字随机数发生器(DRNG)软件实施指南之后,我对RDRAND调用时生成器的内部状态会发生什么问题提出了一些问题.不幸的是,答案似乎不在指南中.
根据该指南,在DRNG内部有四个128位缓冲器,用于提供随机位以RDRAND进行漏极.RDRAND本身将提供16位,32位或64位随机数据,具体取决于目标寄存器的宽度:
rdrand ax   ; put 16 random bits in ax
rdrand eax  ; put 32 random bits in eax
rdrand rax  ; put 64 random bits in rax
使用更大的目标寄存器会更快地清空这些128位缓冲区吗?例如,如果我只需要2位随机性,那么我是否应该经历在64位寄存器上使用16位寄存器的麻烦?这会对DRNG的吞吐量产生任何影响吗?我想避免消耗比必要更多的随机性.
指南说执行后将设置进位标志RDRAND:
CF = 1   Destination register valid. Non-zero random value
         available at time of execution. Result placed in register.
CF = 0   Destination register all zeros. Random value not available
         at time of execution. May be retried.
"不可用"是什么意思?随机数据是否可用,因为RDRAND调用过快地耗尽了这些128位缓冲区?或者不可用意味着DRNG未通过健康检查而无法生成任何新数据?基本上,我试图理解CF …
我刚开始研究系统调用.我想知道在进行系统调用时导致开销的原因.
例如,如果我们考虑getpid(),当对getpid()进行系统调用时,我的猜测是如果控件当前在子进程中,则必须进行上下文切换以进入父进程以获取pid .这会导致开销吗?
此外,当调用getpid()时,将在用户空间边界上进行一些元数据传输并进入和退出内核.那么用户空间和内核之间的常量切换是否也会导致一些开销?
英特尔C++编译器和/或GCC是否支持以下内在函数,例如自2012/2013年以来MSVC的内在函数?
int _rdrand16_step(uint16_t*);
int _rdrand32_step(uint32_t*);
int _rdrand64_step(uint64_t*);
int _rdseed16_step(uint16_t*);
int _rdseed32_step(uint32_t*);
int _rdseed64_step(uint64_t*);
如果支持这些内在函数,那么它们支持哪个版本(请使用编译时常量)?