为什么linux用户空间和内核空间之间存在代码运行速度差异?
当我在linux用户空间和内核空间中运行一些简单的while循环代码并测量运行时间时,我可以得到差异 测试代码是访问Arm Cortex SoC芯片中的一些硬件寄存器为什么linux用户空间和内核空间之间存在代码运行速度差异?,linux,ioctl,Linux,Ioctl,当我在linux用户空间和内核空间中运行一些简单的while循环代码并测量运行时间时,我可以得到差异 测试代码是访问Arm Cortex SoC芯片中的一些硬件寄存器 for(k = 0; k < 100000; k++) { //I tested this code in user space and kernel space with IOCTL. for(i = 0; i < 1000; i++) { tv2 = *(volatile
for(k = 0; k < 100000; k++)
{ //I tested this code in user space and kernel space with IOCTL.
for(i = 0; i < 1000; i++)
{
tv2 = *(volatile UInt32 *)(0xfe110080);
*(volatile UInt32 *)(0xfe628024) = i + tv2 ;
}
}
结果是
用户层:52002.16毫秒
内核层:32650.53毫秒
内核层比用户层快1.6倍。一般来说,用户层需要更多的时间,因为它很少额外调用来完成任务 例如,以读取文件为例。 要从用户层读取文件,我们称之为readfile\u name。这个读取调用在内部调用内核读取调用,内核读取调用与磁盘的设备驱动程序进行对话并获取数据
因此,内核层的性能更好,因为调用的数量减少了。一般来说,用户层需要更多的时间,因为它很少额外调用来完成任务 例如,以读取文件为例。 要从用户层读取文件,我们称之为readfile\u name。这个读取调用在内部调用内核读取调用,内核读取调用与磁盘的设备驱动程序进行对话并获取数据
因此,由于调用次数减少,内核层的性能更好。感谢您的回复。但我还是很困惑。因为没有需要调用系统调用或任何额外调用的代码。这只是在while循环中使用指针进行的内存访问。可能是用户代码需要更多的检查,以确定它是否具有访问该部分内存的权限。您的意思是,您需要一些权限来访问用户层上的注册表,并在我编译代码时自动添加权限检查代码?谢谢您的回复。但我还是很困惑。因为没有需要调用系统调用或任何额外调用的代码。这只是使用while循环中的指针进行的内存访问。可能是因为用户代码需要更多的检查,以确定它是否具有访问该部分内存的权限。您的意思是,您需要一些权限来访问用户层上的注册表,并在我编译代码时自动添加权限检查代码?