получение полного доступа к памяти (напишите как это сделать плз, если не трудно)

Модератор: Модераторы разделов

proglammer
Сообщения: 7

получение полного доступа к памяти

Сообщение proglammer »

когдато увлеченно пытался получить этот самый доступ, потом както забросил, и вот опять приперло....
почитав хелпы написал мааленький модуль:
#-----------------
#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: получение полного доступа к памяти

Сообщение Zeus »

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);
Так можно писмть простенькие драйвера, и они работают
Успехов
Спасибо сказали:
proglammer
Сообщения: 7

Re: получение полного доступа к памяти

Сообщение proglammer »

>Это шутка такая? Вроде баяна про секретаршу с дискеткой?
:) нет это суровая реальность жизни ,
а про /dev/mem я знаю,спасибо. но хотелось бы обращатся к памяти напрямую а не через файл.
а по поводу таблицы дескрипторов - так я просто адресом ошибся? 0x00000000 просто нет? т.е. его надо через эту таблицу находить?
или мне доступ к нему закрыт, типа привилегий не хватает?
Спасибо сказали: