Re: question about get_user

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Nidhi,

       I have thought about this possibility but that seems to be
incredibly complicated. I need to go through all the paging mechanism
or even deal with page fault manually! That is a bit too far than I
plan to do.

Thanks!

Fangkai



On Wed, Apr 28, 2010 at 2:55 AM, nidhi mittal hada
<nidhimittal19@xxxxxxxxx> wrote:
>
> that clearly shows that
> the process you will call module from is not the one  .... whose address you
> want to get value of ...
>
>
> i think with using pid you will search list of processes maintained by
> kernel
> and then you need to traverse mm_struct of reqd process
> then virtual memory address space of the process vm_areas
>
> and then you will find what is the value present at a particular address
> for a particular process
>
>
> Nidhi
>
> On Wed, Apr 28, 2010 at 12:24 PM, Yang Fangkai <wolfgang.yang@xxxxxxxxx>
> wrote:
>>
>> Hi, Nidhi,
>>
>>       Thanks! Now I know what is the problem.
>>
>>       But in my project, I am developing a virtual char device driver
>> such that user can read any process's memory contents by specifying
>> its pid and virtual address. Therefore, a device /dev/gh is
>> registered, and the user try to do something like:
>>
>> echo -n targetpid>/dev/gh & echo -n addr>/dev/gh
>>
>> Therefore, the target process can't be modified. The device driver
>> will retrieve the value by pid and virtual address and return it to
>> user at terminal. I don't know how to solve this problem with get_user
>> under my scenario. Thank you!
>>
>> Fangkai
>>
>> On Wed, Apr 28, 2010 at 1:42 AM, nidhi mittal hada
>> <nidhimittal19@xxxxxxxxx> wrote:
>> > you should somehow call the kernel module from user space program ...
>> > may be using ioctl ..
>> > so that you are in same process context --- as the one you are sending
>> > address from .
>> >
>> > write char dev driver with ioctl method defined
>> > then call ioctl from user space
>> >
>> > ioctl(fd,<IOCTL_CMD>,addrees you want to send)
>> >
>> >
>> > Now in kernel module
>> >
>> > get_user(kernel data variable, <user space address>);
>> >
>> > Nidhi
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> > On Wed, Apr 28, 2010 at 11:55 AM, Yang Fangkai <wolfgang.yang@xxxxxxxxx>
>> > wrote:
>> >>
>> >> Hi, Nidhi,
>> >>
>> >>        Thanks for your reply! Yes, you are right. I pass the address
>> >> to the module from bash command echo, therefore when the address is
>> >> referred, the current pid is bash's pid, instead of the simple program
>> >> I wrote.
>> >>
>> >>         But how can I fix this problem?
>> >>
>> >>         Thank you!
>> >>
>> >> Fangkai
>> >>
>> >> On Wed, Apr 28, 2010 at 1:01 AM, nidhi mittal hada
>> >> <nidhimittal19@xxxxxxxxx> wrote:
>> >> >
>> >> > in your kernel module try to print current->pid
>> >> > is it same as the user space process id ?
>> >> > i think when in kernel module you are not in the same process context
>> >> > whihc
>> >> > you want to refer ...
>> >> >
>> >> >
>> >> > Nidhi
>> >> >
>> >> > On Wed, Apr 28, 2010 at 10:38 AM, Yang Fangkai
>> >> > <wolfgang.yang@xxxxxxxxx>
>> >> > wrote:
>> >> >>
>> >> >> Hi, all,
>> >> >>
>> >> >> I have a problem with get_user() macro. What I did is as follows:
>> >> >>
>> >> >> I run the following program
>> >> >>
>> >> >> int main()
>> >> >> {
>> >> >>       int a = 20;
>> >> >>       printf("address of a: %p", &a);
>> >> >>       sleep(200);
>> >> >>       return 0;
>> >> >> }
>> >> >>
>> >> >> When the program runs, it outputs the address of a, say, 0xbff91914.
>> >> >>
>> >> >> Then I pass this address to a module running in Kernel Mode that
>> >> >> retrieves the contents at this address (at the time when I did this,
>> >> >> I
>> >> >> also made sure the process didn't terminate, because I put it to
>> >> >> sleep
>> >> >> for 200 seconds... ):
>> >> >>
>> >> >> The address is firstly sent as a string, and I cast them into
>> >> >> pointer
>> >> >> type.
>> >> >>
>> >> >> int * ptr = (int*)simple_strtol(buffer, NULL,16);
>> >> >> printk("address: %p",ptr); // I use this line to make sure the cast
>> >> >> is
>> >> >> correct. When running, it does output bff91914
>> >> >> int val = 0;
>> >> >> int res;
>> >> >> res= get_user(val, (int*) ptr);
>> >> >>
>> >> >> However, res is always not 0, meaning that get_user returns error. I
>> >> >> am wondering what is the problem....
>> >> >>
>> >> >> Thank you!!
>> >> >>
>> >> >> --
>> >> >> To unsubscribe from this list: send an email with
>> >> >> "unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx
>> >> >> Please read the FAQ at http://kernelnewbies.org/FAQ
>> >> >>
>> >> >
>> >> >
>> >> >
>> >> > --
>> >> > Thanks & Regards
>> >> > Nidhi Mittal Hada
>> >> > Scientific officer D
>> >> > Computer Division
>> >> > Bhabha Atomic Research Center
>> >> > Mumbai
>> >> >
>> >> >
>> >> >
>> >
>> >
>> >
>> > --
>> > Thanks & Regards
>> > Nidhi Mittal Hada
>> > Scientific officer D
>> > Computer Division
>> > Bhabha Atomic Research Center
>> > Mumbai
>> >
>> >
>> >
>
>
>
> --
> Thanks & Regards
> Nidhi Mittal Hada
> Scientific officer D
> Computer Division
> Bhabha Atomic Research Center
> Mumbai
>
>
>

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx
Please read the FAQ at http://kernelnewbies.org/FAQ



[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux