Форум программистов, компьютерный форум, киберфорум
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. Показов 2241. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru