Лабораторная работа №1. Знакомство с рабочей средой SYNTACORE KIT
1.2.3. Получение сведений об аппаратном обеспечении в Linux
Для выполнения данной лабораторной работы вам потребуется программно получать информацию о текущей аппаратной платформе. Для того чтобы узнать архитектуру, на которой работает Linux-система можно использовать команду arch:
$ arch # Гостевая ОС x86_64 $ arch # RISC-V ОС riscv64
Расширенная информация о процессоре и ОЗУ содержится в procfs, в частности в /proc/cpuinfo и /proc/meminfo. С точки зрения ОС это текстовые файлы, содержимое которых можно вывести стандартными средствами (пример для гостевой ОС):
$ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 142 model name : Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz stepping : 9 cpu MHz : 2712.008 …… ~$ cat /proc/meminfo MemTotal: 2022664 kB MemFree: 177740 kB MemAvailable: 278060 kB Buffers: 6136 kB …..
1.3. Задание к лабораторной работе
Напишите программу на языке С, которая последовательно выводит информацию о процессоре (каждый пункт списка выводится в новой строке):
- архитектура
- название модели
- общее количество ядер и потоков,
- для каждого ядра: в одну строку - название модели, размер физического адреса (биты), размер виртуального адреса (биты).
Программа должна проверять доступность источников данных и в случае невозможности получить информацию от ОС выводить код возврата 1 и соответствующее сообщение об ошибке.
Программу необходимо скомпилировать и запустить последовательно в гостевой ОС и в RISC-V ОС (либо через qemu-riscv64).
1.3.1. Описание последовательности выполнения работы
Для выполнения поставленной задачи необходимо в первую очередь понять, с какими источниками данных о аппаратном обеспечении предстоит работать. В данном случае предлагается использовать чтение из служебного файла файл /proc/cpuinfo и захват вывода команды arch.
Далее необходимо составить универсальную программу, которая будет решать поставленную задачу вне зависимости от архитектуры процессора, под которую она скомпилирована. Авторы предлагают вынести в отдельные функции работу с /proc/cpuinfo и работу с командой arch. Обратите внимание на формат файла cpuinfo - каждое ядро процессора выводится отдельным блоком. Примеры кода можно посмотреть в разделе 1.2.
Далее необходимо скомпилировать и запустить программу в обоих виртуальных машинах. Для этого можно использовать как полностью консольный интерфейс (например, редактируя программу через терминал и редакторы vim или nano), так и графические среды разработки, включающие в себя кросс-компиляторы.
1.3.2. Пример выполнения задания на защиту
Напишите программу, которая считывает общий объем оперативной памяти компьютера.
#include <stdio.h> int main(void) { FILE *meminfo = fopen("/proc/meminfo", "r"); char line[256]; while(fgets(line, sizeof(line), meminfo)) { int ram; if(sscanf(line, "MemTotal: %d kB", &ram) == 1) { fclose(meminfo); printf("%d", ram); } } fclose(meminfo); return 0; }
1.4. Вопросы для контроля
- Как в Syntacore Kit реализуется возможность запуска программ для архитектуры RISC-V?
- В чем состоит назначение qemu-riscv64?
- Как узнать размер кэш-памяти для одного ядра процессора в Linux?