int start_def_pager( __unused char *bs_device ) { /* MACH_PORT_FACE master_device_port; */ /* MACH_PORT_FACE security_port; */ __unused static char here[] = "main"; /* setup read buffers, etc */ default_pager_initialize(); #ifndef MACH_KERNEL default_pager(); #endif if (DEFAULT_PAGER_IS_ACTIVE) { /* start the backing store monitor, it runs on a callout thread */ default_pager_backing_store_monitor_callout = thread_call_allocate(default_pager_backing_store_monitor, NULL); if (!default_pager_backing_store_monitor_callout) panic("can't start backing store monitor thread"); thread_call_enter(default_pager_backing_store_monitor_callout); } return (0); }
int start_def_pager( __unused char *bs_device ) { /* MACH_PORT_FACE master_device_port; */ /* MACH_PORT_FACE security_port; MACH_PORT_FACE root_ledger_wired; MACH_PORT_FACE root_ledger_paged; */ __unused static char here[] = "main"; /* default_pager_host_port = ipc_port_make_send(realhost.host_priv_self); master_device_port = ipc_port_make_send(master_device_port); root_ledger_wired = ipc_port_make_send(root_wired_ledger_port); root_ledger_paged = ipc_port_make_send(root_paged_ledger_port); security_port = ipc_port_make_send(realhost.host_security_self); */ #if NORMA_VM norma_mk = 1; #else norma_mk = 0; #endif /* setup read buffers, etc */ default_pager_initialize(); #ifndef MACH_KERNEL default_pager(); #endif /* start the backing store monitor, it runs on a callout thread */ default_pager_backing_store_monitor_callout = thread_call_allocate(default_pager_backing_store_monitor, NULL); if (!default_pager_backing_store_monitor_callout) panic("can't start backing store monitor thread"); thread_call_enter(default_pager_backing_store_monitor_callout); return (0); }
int main( int argc, char **argv) { int my_node; mach_port_t master_device_port; mach_port_t security_port; mach_port_t root_ledger_wired; mach_port_t root_ledger_paged; static char here[] = "main"; int need_dp_init = 1; /* * Use 4Kbyte cthread wait stacks. */ cthread_wait_stack_size = 4 * 1024; if (bootstrap_ports(bootstrap_port, &default_pager_host_port, &master_device_port, &root_ledger_wired, &root_ledger_paged, &security_port)) Panic("privileged ports"); printf_init(master_device_port); panic_init(default_pager_host_port); norma_mk = (norma_node_self(default_pager_host_port, &my_node) == KERN_SUCCESS); printf("(default_pager): started%s\n", norma_mk ? " on a NORMA kernel" : ""); /* * Process arguments: * list of attributes, list of device names. * Must do device names after ports are initialised. */ while (--argc > 0) { argv++; if (!dp_parse_argument(*argv)) { if (need_dp_init) { /* * Set up ports, port sets and thread counts. */ default_pager_initialize(default_pager_host_port); need_dp_init = 0; } if (!bs_add_device(*argv, master_device_port)) printf("(default_pager): couldn't add device %s\n", *argv); else printf("(default_pager): added device %s\n", *argv); } } if (need_dp_init) { default_pager_initialize(default_pager_host_port); need_dp_init = 0; } /* * Change our scheduling policy to round-robin, and boost our priority. */ default_pager_set_policy(default_pager_host_port); /* Start threads and message processing. */ for (;;) { default_pager(); /*NOTREACHED*/ } }
int main (int argc, char **argv) { const task_t my_task = mach_task_self(); error_t err; memory_object_t defpager; err = get_privileged_ports (&bootstrap_master_host_port, &bootstrap_master_device_port); if (err) error (1, err, "cannot get privileged ports"); defpager = MACH_PORT_NULL; err = vm_set_default_memory_manager (bootstrap_master_host_port, &defpager); if (err) error (1, err, "cannot check current default memory manager"); if (MACH_PORT_VALID (defpager)) error (2, 0, "Another default memory manager is already running"); if (!(argc == 2 && !strcmp (argv[1], "-d"))) { /* We don't use the `daemon' function because we might exit back to the parent before the daemon has completed vm_set_default_memory_manager. Instead, the parent waits for a SIGUSR1 from the child before exitting, and the child sends that signal after it is set up. */ sigset_t set; signal (SIGUSR1, nohandler); sigemptyset (&set); sigaddset (&set, SIGUSR1); sigprocmask (SIG_BLOCK, &set, 0); switch (fork ()) { case -1: error (1, errno, "cannot become daemon"); case 0: setsid (); chdir ("/"); close (0); close (1); close (2); break; default: sigemptyset (&set); sigsuspend (&set); _exit (0); } } /* Mark us as important. */ mach_port_t proc = getproc (); if (proc == MACH_PORT_NULL) error (3, err, "cannot get a handle to our process"); err = proc_mark_important (proc); /* This might fail due to permissions or because the old proc server is still running, ignore any such errors. */ if (err && err != EPERM && err != EMIG_BAD_ID) error (3, err, "cannot mark us as important"); mach_port_deallocate (mach_task_self (), proc); printf_init(bootstrap_master_device_port); /* * Set up the default pager. */ partition_init(); /* * task_set_exception_port and task_set_bootstrap_port * both require a send right. */ (void) mach_port_insert_right(my_task, default_pager_exception_port, default_pager_exception_port, MACH_MSG_TYPE_MAKE_SEND); /* * Change our exception port. */ if (!debug) (void) task_set_exception_port(my_task, default_pager_exception_port); default_pager_initialize (bootstrap_master_host_port); if (!(argc == 2 && !strcmp (argv[1], "-d"))) kill (getppid (), SIGUSR1); /* * Become the default pager */ default_pager(); /*NOTREACHED*/ return -1; }