Thanks for the example mousse, but I'm not really sure that this
does... I compiled it and ran it like so:
$ cc example.c
$ sudo ./a.out
And got a lot of output along these lines:
addr = 800000
error = 268435459
addr = 802000
error = 268435459
addr = 802000
error = 268435459
addr = 803000
error = 268435459
addr = 803000
Am I correct in my understanding that task_wire(self,true) tells OS X
not to page the program out from memory? What then is vm_wire() used
for?
Also, how do I use this for my purposes (which is to share memory
between my kext and the user-land program)?
Thanks, and sorry for the lack of knowledge on my part, in my defense
I would read the documentation if I knew what documentation to
read! :-p
- Greg
On Mar 3, 2008, at 2:37 PM, mm w wrote:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <mach/vm_map.h>
int main(int argc, char *argv[]) {
vm_map_t self;
kern_return_t kret;
self = mach_task_self();
kret = task_wire(self, true);
if (kret == KERN_INVALID_HOST)
fprintf(stderr, "vm_wire KERN_INVALID_HOST.\n");
else if (kret)
fprintf(stderr,"error = %d\n", kret);
vm_size_t size;
host_priv_t host;
host = mach_host_self();
void *ptr;
int i = 0;
host_page_size(host, &size);
do {
fork();
ptr = malloc(size);
printf("addr = %X\n" , ptr);
kret = vm_wire(host, self, (vm_address_t) ptr, size,
VM_PROT_READ
| VM_PROT_WRITE);
if (kret == KERN_INVALID_HOST)
fprintf(stderr, "vm_wire KERN_PROTECTION_FAILURE.\n");
else if (kret == KERN_INVALID_HOST)
fprintf(stderr, "vm_wire KERN_INVALID_HOST.\n");
else if (kret)
fprintf(stderr,"error = %d\n", kret);
} while(++i < 5);
return 0;
}
On Mon, Mar 3, 2008 at 11:06 AM, Greg <email@hidden> wrote:
On Mar 3, 2008, at 11:23 AM, mm w wrote:
Hi Greg,
In the doc there is a small chapter regarding Memory wiring
called:
Memory Mapping and Block Copying, I guess it's exactly what you
asked,
as Michael said most people think that not using IOKit is more
efficient, for the most of cases, it's really wrong, as you have
may
be noticed IOKit is not a full C++, it's based on Embedded C++,
Iokit
provides many facilities and kern controls,
The only reason that I don't want to make an IOKit kext is that I
feel
it would over-complicate my code. I don't have much time to learn
all
the paradigms of creating a driver and then a userclient when all I
need is one function to start the kernel extension (kextname_start)
and one function to stop it (kextname_stop).
and sure it depends on what you want to accomplish, if it's to
learn
or implement something that doesn't exist, your are on the way, if
it's for implementing something that already exists not sure :),
and
sure the xnu source is always your best doc: osfmk/vm/vm_user.c
Are the functions in vm_user.c the only functions available to do
what
I want? And are you saying that no actual documentation on how to
use
those functions to do memory mapping exists?
Because if that's the case then converting my extension to IOKit
stuff
might be easier than wading through kernel code.
Thanks,
- Greg
--
-mmw
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Darwin-kernel mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden