Beispiel #1
0
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);
}
Beispiel #2
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);
}
Beispiel #3
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*/
	}
}
Beispiel #4
0
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;
}