Подтвердить что ты не робот

Как получить доступ (если возможно) к пространству ядра из пространства пользователя?

Как точно различается память памяти пользователей и ядер в ядре Linux (с точки зрения обеспечения безопасности для пространства ядра)?

Какими разными способами я могу писать в адресном пространстве ядра из пользовательского пространства?

Один из способов, которым я знаю, - это системный вызов. Существует несколько системных вызовов, которые мы можем использовать, но в конце они все системные вызовы. Даже в системных вызовах мы отправляем данные в пространство ядра, где он (драйвер или соответствующий модуль) вызывает такие функции, как copy_from_user(), для копирования данных из пользовательского пространства в пространство ядра. Здесь мы точно не записываем в адресное пространство. мы просто передаем указатель пользователя, который содержит данные, которые необходимо скопировать в буферы ядра.

Мой вопрос в том, можно ли каким-либо образом получить доступ к физическому адресу, который присутствует в ядре и выполнить на нем операции?

Во-вторых, Помимо системных вызовов есть ли какие-либо другие способы записи в пространство ядра из пользовательского приложения?

Я ссылался на эту ссылку из stackoverflow. Но я думаю, что на мой вопрос нет ответа и с другой точки зрения. Поэтому я подумал задать другой вопрос.

Поделитесь своими знаниями... Спасибо.

4b9b3361

Ответ 1

Какими разными способами я могу писать в адресном пространстве ядра из пользовательское пространство?

Я не уверен, есть ли другие методы, но вы можете получить доступ к физической памяти с помощью /dev/mem и системного вызова mmap().

/dev/mem - это файл символьного устройства, являющийся образ основного память компьютера. Его можно использовать, например, для изучения (и даже патч). Адреса байтов в памяти интерпретируются как адреса физической памяти.

далее /dev/mem: http://linux.about.com/library/cmd/blcmdl4_mem.htm

далее mmap(): http://linux.die.net/man/2/mmap

Вы можете использовать mmap() для сопоставления раздела /dev/mem и использования в вашей пользовательской программе. Краткий пример кода:

#define MAPPED_SIZE //place the size here
#define DDR_RAM_PHYS  //place the physical address here

int _fdmem;
int *map = NULL;
const char memDevice[] = "/dev/mem";

/* open /dev/mem and error checking */
_fdmem = open( memDevice, O_RDWR | O_SYNC );

if (_fdmem < 0){
printf("Failed to open the /dev/mem !\n");
return 0;
}
else{
printf("open /dev/mem successfully !\n");
}

/* mmap() the opened /dev/mem */
map= (int *)(mmap(0,MAPPED_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,_fdmem,DDR_RAM_PHYS));

/* use 'map' pointer to access the mapped area! */
for (i=0,i<100;i++)
printf("content: 0x%x\n",*(map+i));

/* unmap the area & error checking */
if (munmap(map,MAPPED_SIZE)==-1){
perror("Error un-mmapping the file");
}

/* close the character device */
close(_fdmem);

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

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

Ответ 2

Как точно различается память памяти пользователей и ядер ядро Linux (с точки зрения обеспечения безопасности для пространства ядра)?

Не уверен, понял ли я ваш вопрос.

В ядро ​​нет технической разницы, это просто память. Зачем? Поскольку ядро, работающее в наиболее привилегированном режиме CPU, может получить доступ ко всей памяти.

Какими разными способами я могу писать в адресном пространстве ядра из пользовательское пространство?

Если в драйверах устройства ядра или ядра нет дыры в безопасности, вы не можете этого сделать, по крайней мере, не напрямую. Ядро (или один из его драйверов) может, однако, копировать данные из памяти приложения режима пользователя в память ядра.

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

То же самое, вы не должны иметь доступ к памяти с использованием физических адресов, если присутствует виртуальный перевод на физический адрес. Даже само ядро ​​не может избежать этого перевода после его включения. Он должен создавать соответствующие сопоставления виртуальных и физических адресов в таблицах страниц для доступа к памяти на произвольных физических адресах.

Помимо системных вызовов есть ли другие способы, которыми я могу писать пространства ядра из пользовательского приложения?

Вы также можете заставить ЦП переключиться на код ядра, вызвав исключение (например, деление на 0, ошибка страницы, общая ошибка защиты и т.д.). Ядро является первым, кто обрабатывает исключения. Ядро изменит свою память по мере необходимости в ответ на исключение. Он может загружать данные где-нибудь (например, диск) при ошибке страницы.