Аватар для Kastaneda
5232 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
1

Файл /dev/cpu/0/msr размером 0 байт. Как сделать, чтоб в нем появились нужные данные?

25.02.2012, 18:23. Показов 2021. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет!
Понадобилось содержимое файла /dev/cpu/CPUNUM/msr, для работы с утилитами rdmsr и wrmsr. Обнаружил, что у меня этого файла вообще нет, почитав маны, узнал, что нужно выполнить команду:
Bash
1
$ modprobe msr
после выполнения были созданы файлы /dev/cpu/0/msr и /dev/cpu/1/msr, но они абсолютно пустые, т.е. их размер 0 байт.

Долго гуглил, но решения не нашел. Может кто-нибудь знает, как сделать так, чтоб в этих файлах появилась полезная информация?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.02.2012, 18:23
Ответы с готовыми решениями:

Как сделать, чтобы в трее появились нужные значки?
Честно прочёл похожую тему, но ответа не нашёл на свой вопрос. Я умею зайти окно в "Выберите значки...

Как открыть новое окно и нем уже вывести нужные данные
Работаю в visual studio 2013. Вопрос следующий. Как открыть новое окно и нем уже вывести нужные...

Поместить в массив данные размером 16 байт
создаю массив заданного размера 256кб (или 262144 байт), заполненный нулями byte bytes = new...

Как открыть DBF-файл, выбрать нужные данные и передать их в Текстбоксы ? HELP ME !!!
1. Открываем c: empwork.dbf 2. выбираем (SQL) SELECT A1, A2, A3, A4 FROM WORK WHERE A1=Text1.Text...

5
Заблокирован
25.02.2012, 19:06 2
http://lxr.linux.no/#linux+v3.... rnel/msr.c

Добавлено через 25 минут
я уже где то в разделе С++ вскользь упоминал, что для файлов устройств обычные мерки не подходят. Попробую объяснить по другому. Обрати внимание как инициализируется драйвер
C
1
__register_chrdev(MSR_MAJOR, 0, NR_CPUS, "cpu/msr", &[B]msr_fops[/B])
C
1
2
3
4
5
6
7
8
9
static const struct file_operations msr_fops = {
        .owner = THIS_MODULE,
        .llseek = msr_seek,
        .read = msr_read,
        .write = msr_write,
        .open = msr_open,
        .unlocked_ioctl = msr_ioctl,
        .compat_ioctl = msr_ioctl,
};
этот файл ничего "в себе" не хранит. Когда ты открываешь его из юзерспейса, вызывается функция open, пишешь или читаешь - соответсвенно read или write
1
 Аватар для Kastaneda
5232 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
25.02.2012, 19:13  [ТС] 3
LosAngeles, т.е. чтоб мне что-то от туда прочитать, мне нужно что-то туда записать?)
0
Заблокирован
25.02.2012, 20:34 4
Нет, туда не нужно ничего записывать, чтобы потом это прочитать, не могу понять с чего ты предположил такое. Данный драйвер ничего не хранит и не запоминает в себе, в нём нет глобальных хранилищ вообще. Его функции предельно просты, рассмотрим что произошло если ты попытаешься прочитать из пользовательского пространства с помощью системного вызова read этот файл:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
static ssize_t msr_read(struct file *file, char __user *buf,
                       size_t count, loff_t *ppos)
{
       u32 __user *tmp = (u32 __user *) buf;
         u32 data[2];
       u32 reg = *ppos;
       int cpu = iminor(file->f_path.dentry->d_inode);
/*
    file->f_path.dentry->d_inode Возвращает dev_t - 32 битный идентификатор, состоящий из минорного и мажорного чисел, iminor получает из него минорное число, его можно посмотреть ls -l там два столбца с цифрами, минор - второй столбец
 
*/
        int err = 0;
        ssize_t bytes = 0;
 
        if (count % 8)
                return -EINVAL; /* количество байт для считывания должно быть кратно 8 */
 
       for (; count; count -= 8) {
                err = rdmsr_safe_on_cpu(cpu, reg, &data[0], &data[1]);
                //небольшая подпрограмма на С с ассемблерной вставкой, которая собственно и получает значения регистров, которые видимо 64 битные
               if (err)
                       break;
               if (copy_to_user(tmp, &data, 8)) {
               //Копировали то что считали обратно пользователю, tmp это buf, который ты передал, когда вызывал системный вызов read
                       err = -EFAULT;   //Если указатель хреновый    
                       break;
               }
              tmp += 2;
               bytes += 8;
       }
 
       return bytes ? bytes : err;
               //Вернули число считанных байт, как это обычно делает системный вызов read
}
Должно быть очевидно, что результат работы данной функции не зависит от того был ли вызван wright до этого момента. Драйвер просто читает и пишет MSR регистры.


Не по теме:


К слову сказать это очень древний драйвер, сейчас так символьные устройства никто уже не регистрирует, сейчас это делается через интерфейс cdev, тобишь это не пример для подражания

1
 Аватар для Kastaneda
5232 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
26.02.2012, 10:57  [ТС] 5
LosAngeles, спасибо за подробный ответ. Просто я linux не на столько хорошо знаю.
Тогда опишу свою проблему более подробно, может поможешь.
Пишу программу с использованием prefetch'а. По результатам, которые показывает утилита perf (от слова performance) cache-miss'ов меньше не стало, т.е. как будто prefetch не работает.
Нагуглил, что нужно руками разрешить linux'у использовать prefetch. Делается это установкой определенного бита в специальном регистре. А для этого есть утилиты rdread и rdwrite из пакета msr-tools.
Вчера думал, что rdmsr вообще не работает, т.к. пробовал выполнять пример из мануала, но сегодня попробовал изменить читаемый бит и увидел, что он работает. Но на многие биты rdmsr выдает
Bash
1
rdmsr: CPU 0 cannot read MSR
Вот пытаюсь понять, что бы это значило. Вчера где-то прочитал, что может потребуется пересобрать ядро, чего очень не хотелось бы.
Короче моя цель - проверить разрешен ли prefetch и, если нет, то разрешить его, установив определенный бит.

Добавлено через 1 час 52 минуты
Все, нашел какой бит нужно проверять и устанавливать. Все работает.
Только prefetch все равно не работает, вот же блин...
0
Заблокирован
26.02.2012, 13:38 6
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
uint64_t 
msr_read(const int cpu, uint32_t reg)
{
     if (pread(fd, &data, sizeof data, reg) != sizeof data) 
    {
        if (errno == EIO)
        {
            fprintf(stderr, "rdmsr: CPU %d cannot read MSR %x\n", cpu, reg);
            exit(4);
        }
        else
        {
            perror("rdmsr: pread");
            exit(127);
        }
    }
}
pread записал в errno EIO и произошло это из-за 19-22 строк предыдущего листинга, rdmsr_safe_on_cpu которая представляет из себя коротенькую подпрограмму с ассемблерной вставкой содержит инструкцию rdmsr, которая при попытке чтения зарезервированных или нереализованных MSR кинет исключение #GP, что видимо и произошло, отсюда можно предположить что ты что-то не то пытался прочитать
0
26.02.2012, 13:38
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.02.2012, 13:38
Помогаю со студенческими работами здесь

Есть самописный DataGrid. Как сделать чтоб столбцы в нем можно было раздвигать мышкой?
Вот основные функции. void GDataGrid_Paint(object sender, PaintEventArgs e) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как вставить элемент в массив на указанный индекс в JavaScript
hw_wired 24.01.2025
Массивы являются одной из фундаментальных структур данных в JavaScript, предоставляющей разработчикам мощный инструмент для хранения и управления упорядоченными наборами данных. Они позволяют хранить. . .
Чем отличаются HashMap и Hashtable в Java
hw_wired 24.01.2025
В мире разработки на Java существует множество инструментов для работы с коллекциями данных, и среди них особое место занимают структуры данных для хранения пар ключ-значение. HashMap и Hashtable. . .
Как конвертировать видео в GIF
hw_wired 24.01.2025
В современном мире анимированные изображения стали неотъемлемой частью цифровой коммуникации. Формат GIF (Graphics Interchange Format) представляет собой особый тип файлов, который позволяет. . .
Как скопировать текст в буфер обмена на JavaScript во всех браузерах
hw_wired 24.01.2025
Копирование текста в буфер обмена стало неотъемлемой частью современных веб-приложений, значительно улучшающей пользовательский опыт и упрощающей работу с контентом. В эпоху активного обмена. . .
Как скрыть клавиатуру на Android
hw_wired 24.01.2025
При разработке Android-приложений часто возникает необходимость управлять видимостью экранной клавиатуры для улучшения пользовательского опыта. Одним из наиболее эффективных способов контроля. . .
Как обучить нейросеть создания картинок на Python
bytestream 24.01.2025
В эпоху цифровых технологий искусственный интеллект становится неотъемлемой частью творческого процесса. Особое место в этой области занимает разработка и обучение нейронных сетей для создания. . .
Как обучить нейросеть генерации текста на Python
bytestream 24.01.2025
В современном мире искусственный интеллект и машинное обучение становятся неотъемлемой частью многих технологических решений. Одной из наиболее интересных и востребованных задач в этой области. . .
Машинное обучение на Python
bytestream 24.01.2025
Введение в машинное обучение на Python Машинное обучение представляет собой одну из наиболее динамично развивающихся областей информационных технологий, которая позволяет компьютерным системам. . .
Как удалить вирус-майнер с компьютера
hw_wired 24.01.2025
Вирусы-майнеры стали одной из наиболее серьезных угроз для пользователей компьютеров. Эти вредоносные программы тайно используют вычислительные ресурсы зараженного устройства для добычи криптовалюты. . .
Что такое веб-сервер, для чего он нужен и как работает
bytestream 24.01.2025
В современную эпоху цифровых технологий веб-сервер является фундаментальным компонентом интернет-инфраструктуры, обеспечивающим функционирование множества онлайн-сервисов и веб-сайтов. Этот. . .
Как в цикле for перебрать все элементы в словаре в Python
bytestream 24.01.2025
Словари в Python представляют собой мощные структуры данных, которые позволяют хранить информацию в формате ключ-значение. Эта особенность делает их незаменимыми при работе с данными, где требуется. . .
Как отменить rebase в Git
hw_wired 24.01.2025
Git rebase представляет собой мощный инструмент для управления историей коммитов в системе контроля версий Git. Этот механизм позволяет разработчикам изменять последовательность, комбинировать или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru