Форум программистов, компьютерный форум, киберфорум
Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2

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

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

Студворк — интернет-сервис помощи студентам
Привет!
Понадобилось содержимое файла /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 byte; using (var bw = new...

5
Заблокирован
25.02.2012, 19:06
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 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
25.02.2012, 19:13  [ТС]
LosAngeles, т.е. чтоб мне что-то от туда прочитать, мне нужно что-то туда записать?)
0
Заблокирован
25.02.2012, 20:34
Нет, туда не нужно ничего записывать, чтобы потом это прочитать, не могу понять с чего ты предположил такое. Данный драйвер ничего не хранит и не запоминает в себе, в нём нет глобальных хранилищ вообще. Его функции предельно просты, рассмотрим что произошло если ты попытаешься прочитать из пользовательского пространства с помощью системного вызова 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 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
26.02.2012, 10:57  [ТС]
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
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.02.2012, 13:38
Помогаю со студенческими работами здесь

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru