Skip to content

[RISC‐V 64] 2. cpuinfo.c 구현 과정

최기철 edited this page Aug 27, 2023 · 1 revision

1. 다른 아키텍처의 cpuinfo.c 파일 분석

  • 모든 아키텍처의 cpuinfo.c 파일은 아래와 같이 /proc/cpuinfo 파일을 열어 cpu 정보를 확인하는 구조이다.

    fp = fopen("/proc/cpuinfo", "r");
    if (fp == NULL)
    	return -1;

1-1. x86_64 아키텍처의 cpuinfo 확인 방법

  • x86_64 아키텍처는 /proc/cpuinfo 파일을 열어 아래와 같이 각 줄에서 “model name\t” 문자열과 일치하는 줄이 있는지 확인한다.

    while (fgets(buf, sizeof(buf), fp) != NULL) {
    	if (!strncmp(buf, "model name\t:", 12)) {
    		......
    	}
    }

  • x86_64 아키텍처의 cpuinfo 결과 예시는 아래와 같다.

    image

1-2. aarch64 아키텍처의 cpuinfo 확인 방법

  • aarch64 아키텍처는 /proc/cpuinfo 파일을 열어 아래와 같이 각 줄에서 "CPU architecture:” 문자열과 일치하는 줄이 있는지 확인한다.

    while (fgets(buf, sizeof(buf), fp) != NULL) {
    	if (!strncmp(buf, "CPU architecture:", 17)) {
    		......
    	}
    }

  • aarch64 아키텍처의 cpuinfo 결과 예시는 아래와 같다.
    • 해당 부분에 aarch64 아키텍처의 cpuinfo 결과 예시 추가하기

2. RISC-V 64bit의 cpuinfo.c 파일 구현

2-1. RISC-V 64bit의 /proc/cpuinfo 결과 예시

  • 아래 결과 예시는 Qemu에서 동작하는 risc-v 64bit Ubuntu 22.04에서 확인한 결과이며, 동작하는 시스템의 Extension 적용 결과와 코어 수에 따라 출력되는 다를 수 있다.
    • Qemu 에서 동작하는 RISC-V 64bit CPU는 “isa\t\t:” 문자열을 확인해야 하는 것을 확인할 수 있다.

    • 문자열 사이의 공백이 빈칸인지 탭인지 확인하고 싶다면, vi /proc/cpuinfo 명령을 실행 후 esc를 누르고 :set list 입력 후 엔터를 누르면 탭은 ^I로 표기되고 엔터는 ^M으로 표기된다.

      image

2-2. RISC-V 64bit의 cpuinfo.c 파일 구현

  • RISC-V 64bit의 최종 코드

    #include <stdio.h>
    #include <string.h>
    
    int arch_fill_cpuinfo_model(int fd)
    {
    	char buf[1024];
    	FILE *fp;
     int ret = -1;
    
     fp = fopen("/proc/cpuinfo", "r");
     if (fp == NULL)
     	return -1;
    
     while (fgets(buf, sizeof(buf), fp) != NULL) {
     	if (!strncmp(buf, "isa\t\t:", 6)) {
     		dprintf(fd, "cpuinfo:desc=%s", &buf[7]);
     		ret = 0;
     		break;
     	}
     }
    
     fclose(fp);
     return ret;
    }