Как получить доступ (если возможно) к пространству ядра из пространства пользователя?
Как точно различается память памяти пользователей и ядер в ядре Linux (с точки зрения обеспечения безопасности для пространства ядра)?
Какими разными способами я могу писать в адресном пространстве ядра из пользовательского пространства?
Один из способов, которым я знаю, - это системный вызов. Существует несколько системных вызовов, которые мы можем использовать, но в конце они все системные вызовы. Даже в системных вызовах мы отправляем данные в пространство ядра, где он (драйвер или соответствующий модуль) вызывает такие функции, как copy_from_user(), для копирования данных из пользовательского пространства в пространство ядра. Здесь мы точно не записываем в адресное пространство. мы просто передаем указатель пользователя, который содержит данные, которые необходимо скопировать в буферы ядра.
Мой вопрос в том, можно ли каким-либо образом получить доступ к физическому адресу, который присутствует в ядре и выполнить на нем операции?
Во-вторых, Помимо системных вызовов есть ли какие-либо другие способы записи в пространство ядра из пользовательского приложения?
Я ссылался на эту ссылку из stackoverflow. Но я думаю, что на мой вопрос нет ответа и с другой точки зрения. Поэтому я подумал задать другой вопрос.
Поделитесь своими знаниями...
Спасибо.
Ответы
Ответ 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, ошибка страницы, общая ошибка защиты и т.д.). Ядро является первым, кто обрабатывает исключения. Ядро изменит свою память по мере необходимости в ответ на исключение. Он может загружать данные где-нибудь (например, диск) при ошибке страницы.