программирование на ассемблере в пространстве пользователя - PullRequest
2 голосов
/ 25 января 2010

Возможно ли иметь такой код в пользовательском пространстве? Я имею в виду, можно ли читать / записывать регистр сопроцессора в пространстве пользователя в Netbsd / Linux?

XYZ]# cat pmc.c 

static inline int
arm11_pmc_ctrl_read(void)
{
    unsigned int val;

    __asm volatile ("mrc p15, 0, %0, c15, c12, 0" : "=r" (val));

    return val;
}
int main(){
    unsigned int ctrl;
        ctrl = arm11_pmc_ctrl_read();
}

Ответы [ 3 ]

1 голос
/ 25 января 2010

Пространство пользователя не имеет доступа к привилегированным инструкциям или регистрам. Посмотрите в руководстве по сборке, чтобы выяснить, являются ли используемые вами инструкции и регистры привилегированными.

0 голосов
/ 30 января 2010

Да, вы можете читать / записывать регистры сопроцессора как пользователь. Например, все инструкции с плавающей запятой являются инструкциями сопроцессора, и двоичные файлы пользовательского пространства вызывают их с удовольствием, считывая / записывая значения регистров FPU в / из регистров ARM.

Доступность инструкций зависит от режима ЦП, который отличается в пользовательских процессах от режима, когда ядро ​​что-то делает, поэтому может случиться так, что некоторые инструкции, будь то на сопроцессоре или главном процессоре, разрешены только в режиме ядра , Инструкция по остановке ЦП - это пример, не связанный с копрокомпьютером.

Если бы вы сказали в комментарии, чего должна достичь загадочная инструкция mrc, было бы легче определить, является ли это привилегированной инструкцией или нет.

Надеюсь, что поможет

0 голосов
/ 25 января 2010

Возможно, вам придется изменить разрешения двоичного исполняемого файла, применив к нему бит suid, и он будет работать как root, я знаю, это может звучать как дыра в безопасности, но, к сожалению, root будет иметь такую ​​привилегию для его запуска , а не обычный пользователь.

Или вы можете создать устройство, то есть /dev/mydev, используя mknod и написать драйвер устройства, в котором обычный пользователь может затем взаимодействовать с драйвером устройства, который, в свою очередь, работает в пространстве ядра и выполняет магию сборки и вернуть его обратно в пространство пользователя, этот метод предпочтительнее.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

...