2010-02-04 05:26:34

by Oleg Kutkov

[permalink] [raw]
Subject: Problem with set_memory_rw

Hello, this is my first post in a mailing list, so excuse me if
something wrong...
I'm new in kernel and try to do some manipulation with memory pages.
For manipulating memory page attributes i used set_memory_rw(),
but function returning 0 and i can't continue writing to memory,
because page, that i want to change, is read only by default.
This is part of my code:


long unsigned addr;

addr = 0x0509940; //this is addres in memory, that i want
to overwrite (read only, for default)

set_memory_rw(addr, 1); //try to set rw permission on this addres for
one memory page.


So, function return zero, this is error, as i can understand. If i try
to write by this address - kernel write in log error messages, such as
"Unable to handle kernel request at address 0x0509940".
This is kernel bug or something wrong in my code?

Thank for any help.


Best regards,
Oleg.


2010-02-04 05:48:40

by Kamezawa Hiroyuki

[permalink] [raw]
Subject: Re: Problem with set_memory_rw

On Thu, 04 Feb 2010 07:26:25 +0200
Oleg Kutkov <[email protected]> wrote:

> Hello, this is my first post in a mailing list, so excuse me if
> something wrong...
> I'm new in kernel and try to do some manipulation with memory pages.
> For manipulating memory page attributes i used set_memory_rw(),
> but function returning 0 and i can't continue writing to memory,
> because page, that i want to change, is read only by default.
> This is part of my code:
>
>
> long unsigned addr;
>
> addr = 0x0509940; //this is addres in memory, that i want
> to overwrite (read only, for default)
>
> set_memory_rw(addr, 1); //try to set rw permission on this addres for
> one memory page.
>
>
> So, function return zero, this is error, as i can understand. If i try
> to write by this address - kernel write in log error messages, such as
> "Unable to handle kernel request at address 0x0509940".
> This is kernel bug or something wrong in my code?
>
> Thank for any help.
>

set_memory_rw()'s 1st argument requires virtual address.
So, you need virtual address of the page you want.

- phys_to_virt() ... convert physical address to virtual address.
- virt_to_phys() ... convert virtual address to physical.

Anyway, RW is vitual address mapping's attribute and not for physical.

Thanks,
-Kame

2010-02-04 08:43:00

by Oleg Kutkov

[permalink] [raw]
Subject: Re: Problem with set_memory_rw


"KAMEZAWA Hiroyuki" <[email protected]
<mailto:[email protected]>> wrote:
> set_memory_rw()'s 1st argument requires virtual address.
> So, you need virtual address of the page you want.
>
> - phys_to_virt() ... convert physical address to virtual address.
> - virt_to_phys() ... convert virtual address to physical.
>
> Anyway, RW is vitual address mapping's attribute and not for physical.
>
> Thanks,
> -Kame
>

Thank for answer!
But this is a very strange, because 0x0509940, i passed, - it a virtual
memory address (i got it from System.map, this is a system call table,
on my machine). set_memory_rw return zero, anyway. So i can't continue
writing to memory. Maybe, system call table is much write protected, so
i can't change attribute of memory page?
One more interesting thing:

struct page *pg;
pg = virt_to_page(addr);
unsigned long page_addr;
page_addr = (unsigned long) page_address(pg);


addr - this is my virtual address (provided by System.map)
But page_addr got another value!
What wrong?
Sorry, if my questions is to stupid.

P.S. I know, that overwriting system call table is very bad, i just
experimenting with my own network drivers and i need to replace some
network system calls..


Best regard,
Oleg.