Не могу до конца разобраться как работать с local APIC. Конкретнее нужен Timer. В интеловском мануале написано, что необходимо запрограмить 4 регистра... но вот я нифига не могу понять как это сделать Кто может объясните... ещё было бы не плохо если с примерами.. заранее благодарен!
если бы я их понял те темы которые находил на форуме, то не задавал бы вопросы... в большенстве случаев какие то уровкы и т.п...
Код (Text): mov ebx, 0xFEE00000 mov dword [ebx + 0x3E0], 0xB ; devide configuration register (devide by 1) mov eax, 0x10000 ; count of system bus cycles mov dword [ebx + 0x380], eax ; initial count register mov dword [ebx + 0x390], eax ; current count register mov dword [ebx + 0x320], 0x400 ; timer LVT (NMI, one-shot, edge, active high)
"Intel 64 and IA-32 Architectures Software Developers Manual. Volume 3A" прочёл уже не один раз ... теорию я знаю .... Однако основная проблема заключаеться в том, что я практически не имел опыта в написания подобного рода штуках, и вообще по большей части я раньше занимался только middle уровнем програмирования (так низко не приходилось) УФ начнём по порядку: Я создаю драйвер с использованием DDK для того что бы можно было использовать функици на нулевом кольце. правильно?
поставили мне задачу - сделать высокоточный, "мелкошаговый" таймер... то есть по сути мне нужно иметь счётчик времени с частотой 1милисек (возможно даже и ниже)... всё что связано с rdtsc отметаеться сразу, так как частота плавает... всё что связано с регистрами (MSR) производительности с трудом представляю как использовать.... из специфики того, что шина может быть загружена под завязку использовать таймера и т.д которые находяться каким либо образом вне ядра - не получаеться (задержки вызваные загрузкой шины всё портят) вообщем вот такая вот загвоздка. если есть local APIС то можно очень хорошо с его помощью это реализовать.
2rei3er ну она всё таки меняеться не так часто, как частота процессора. 2all народ пошлите меня по нужным сылкам... а т онифига не могу сам разобраться
Смотря что иметь ввду под частотой шины, если частота сигналов синхронизации, квитирования и др., то они задаются кварцованными синхрогенераторами и частота высокостабильна.
На данный момент я не понимаю как работать с физической памятью ядра (на сколько я понял из мануала Intel-овского, именно там расположены адреса 0xFEE00000, ...)
Попробовать вызвать MmMapIoSpace на IRQL=CLOCK2_LEVEL ? Интересно какой бсод будет ? Проще выполнить для определения физического адреса апик MmGetVirtualForPhysical(), наверно при любых IRQL