когдато увлеченно пытался получить этот самый доступ, потом както забросил, и вот опять приперло....
почитав хелпы написал мааленький модуль:
#-----------------
#define __KERNEL__
#define MODULE
#include
#include
#include
#include
#define DRIVER_AUTHOR "qqq "
#define DRIVER_DESC "driver ring0"
static int __init init_ring0(void)
{
printk(KERN_ALERT "ok.\n");
return 0;
}
static void __exit cleanup_ring0(void)
{
printk(KERN_ALERT "ok.\n");
}
module_init(init_ring0);
module_exit(cleanup_ring0);
MODULE_LICENSE("GPL");
#--------------------------------
в который добавил вот это:
cli
pushl %eax
pushl %ebx
xorl %eax,%eax
movl (%eax),%ebx
popl %ebx
popl %eax
sti
#-------------------------
.file "mymod.c"
.version "01.01"
gcc2_compiled.:
.section .modinfo,"a",@progbits
.type __module_kernel_version,@object
.size __module_kernel_version,24
__module_kernel_version:
.string "kernel_version=2.4.18-3"
.section .rodata
.LC0:
.string "<1>ok.\n"
.text
.align 4
.type init_ring0,@function
init_ring0:
cli
pushl %eax
pushl %ebx
xorl %eax,%eax
movl (%eax),%ebx
popl %ebx
popl %eax
sti
pushl %ebp
movl %esp, %ebp
subl $8, %esp
subl $12, %esp
pushl $.LC0
call printk
addl $16, %esp
movl $0, %eax
leave
ret
.Lfe1:
.size init_ring0,.Lfe1-init_ring0
.align 4
.type cleanup_ring0,@function
cleanup_ring0:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
subl $12, %esp
pushl $.LC0
call printk
addl $16, %esp
leave
ret
.Lfe2:
.size cleanup_ring0,.Lfe2-cleanup_ring0
.globl init_module
.set init_module,init_ring0
.globl cleanup_module
.set cleanup_module,cleanup_ring0
.section .modinfo
.type __module_license,@object
.size __module_license,12
__module_license:
.string "license=GPL"
.ident "GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.3 2.96-110)"
#---------------------------
но ничего не вышло, опять Segmentation Fault.
в хелпах которые я читал было написано что модули ядра выполняются в ring0(или как это называется?) и соответственно имеют полный доступ к памяти, но почему тогда этот код не прошел?
#-------------------
cli
pushl %eax
pushl %ebx
xorl %eax,%eax
movl (%eax),%ebx #записать 4ре байта с адреса 0х00000000 в %ebx
popl %ebx
popl %eax
sti
#-------------------
я не программист, просто увлекаюсь в свободное от работы время, так что сам разобратся не могу, если есть тут незанятые программеры обьясните в чем я ошибся а?
получение полного доступа к памяти (напишите как это сделать плз, если не трудно)
Модератор: Модераторы разделов
-
Zeus
- Сообщения: 694
Re: получение полного доступа к памяти
proglammer писал(а): ↑05.02.2006 02:00я не программист, просто увлекаюсь в свободное от работы время, так что сам разобратся не могу, если есть тут незанятые программеры обьясните в чем я ошибся а?
Это шутка такая? Вроде баяна про секретаршу с дискеткой?
В защищённом режиме адресация через таблицу дескрипторов производится, поэтому:
1. Просто писать в сегментый регистр "абы что" - чревато.
2. Если пытаешься лезть за границу сегмента (она указана в дескрипторе), то наверное тоже должна защита доступа к памяти срабатывать.
-
П-нер
- Сообщения: 31
Re: получение полного доступа к памяти
В UNIXе всё файлы. Память это /dev/mem, его (файл) можно открыть
int mem_fd = open ("/dev/mem", O_RDWR);
А дальше (читай man mmap):
my_mem = (char*)mmap (caddr_t(my_mem), my_size,
PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_FIXED,
mem_fd,
my_base);
Так можно писмть простенькие драйвера, и они работают
Успехов
int mem_fd = open ("/dev/mem", O_RDWR);
А дальше (читай man mmap):
my_mem = (char*)mmap (caddr_t(my_mem), my_size,
PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_FIXED,
mem_fd,
my_base);
Так можно писмть простенькие драйвера, и они работают
Успехов
-
proglammer
- Сообщения: 7
Re: получение полного доступа к памяти
>Это шутка такая? Вроде баяна про секретаршу с дискеткой?
нет это суровая реальность жизни ,
а про /dev/mem я знаю,спасибо. но хотелось бы обращатся к памяти напрямую а не через файл.
а по поводу таблицы дескрипторов - так я просто адресом ошибся? 0x00000000 просто нет? т.е. его надо через эту таблицу находить?
или мне доступ к нему закрыт, типа привилегий не хватает?
а про /dev/mem я знаю,спасибо. но хотелось бы обращатся к памяти напрямую а не через файл.
а по поводу таблицы дескрипторов - так я просто адресом ошибся? 0x00000000 просто нет? т.е. его надо через эту таблицу находить?
или мне доступ к нему закрыт, типа привилегий не хватает?