안녕하세요 리눅스 디바이스 드라이버 개발업을 하고 있는 사람입니다.

지금 Arm Cortex기반 리눅스에서 루프안에 레지스터를 접근하는 테스트 코드를 만들어 속도를 측정하고 있는데요

user space에서 돌렸을때보다 IOCTL을 통해 kernel space에서 돌렸을때 훨씬 빠른 속도로 코드 수행을 하고 있습니다.


테스트 코드는 다음과 같은데요

 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 ;  
    }
}


루프 안에는 레지스터를 읽고 쓰는 코드 밖에 없습니다. 이 때 수행 결과를 보면 다음과 같이 1.6배정도 Kernel Layer 속도가 빠른데요.. kernel 모드로 진입하면 해당 프로세스의 스케쥴링 우선순위나 방법등이 달라지게 되는건가요? 아니면 User Layer에서 레지스터 접근시 SVC같은 모드로의 진입을 위해 추가적인 어셈블리 코드가 추가되는건지... 궁금합니다.

User Layer

Kernel Layer

52002.16 ms

32650.53 ms