⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 start.c

📁 一个简单的操作系统minix的核心代码
💻 C
字号:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
				src/kernel/start.c	 	 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

06500	/* This file contains the C startup code for Minix on Intel processors.
06501	 * It cooperates with mpx.s to set up a good environment for main().
06502	 *
06503	 * This code runs in real mode for a 16 bit kernel and may have to switch
06504	 * to protected mode for a 286.
06505	 *
06506	 * For a 32 bit kernel this already runs in protected mode, but the selectors
06507	 * are still those given by the BIOS with interrupts disabled, so the
06508	 * descriptors need to be reloaded and interrupt descriptors made.
06509	 */
06510	
06511	#include "kernel.h"
06512	#include <stdlib.h>
06513	#include <minix/boot.h>
06514	#include "protect.h"
06515	
06516	PRIVATE char k_environ[256];    /* environment strings passed by loader */
06517	
06518	FORWARD _PROTOTYPE( int k_atoi, (char *s) );
06519	
06520	
06521	/*==========================================================================*
06522	 *                              cstart                                      *
06523	 *==========================================================================*/
06524	PUBLIC void cstart(cs, ds, mcs, mds, parmoff, parmsize)
06525	U16_t cs, ds;                   /* Kernel code and data segment */
06526	U16_t mcs, mds;                 /* Monitor code and data segment */
06527	U16_t parmoff, parmsize;        /* boot parameters offset and length */
06528	{
06529	/* Perform system initializations prior to calling main(). */
06530	
06531	  register char *envp;
06532	  phys_bytes mcode_base, mdata_base;
06533	  unsigned mon_start;
06534	
06535	  /* Record where the kernel and the monitor are. */
06536	  code_base = seg2phys(cs);
06537	  data_base = seg2phys(ds);
06538	  mcode_base = seg2phys(mcs);
06539	  mdata_base = seg2phys(mds);
06540	
06541	  /* Initialize protected mode descriptors. */
06542	  prot_init();
06543	
06544	  /* Copy the boot parameters to kernel memory. */
06545	  if (parmsize > sizeof k_environ - 2) parmsize = sizeof k_environ - 2;
06546	  phys_copy(mdata_base + parmoff, vir2phys(k_environ), (phys_bytes) parmsize);
06547	
06548	  /* Convert important boot environment variables. */
06549	  boot_parameters.bp_rootdev = k_atoi(k_getenv("rootdev"));
06550	  boot_parameters.bp_ramimagedev = k_atoi(k_getenv("ramimagedev"));
06551	  boot_parameters.bp_ramsize = k_atoi(k_getenv("ramsize"));
06552	  boot_parameters.bp_processor = k_atoi(k_getenv("processor"));
06553	
06554	  /* Type of VDU: */
06555	  envp = k_getenv("video");
06556	  if (strcmp(envp, "ega") == 0) ega = TRUE;
06557	  if (strcmp(envp, "vga") == 0) vga = ega = TRUE;
06558	
06559	  /* Memory sizes: */
06560	  low_memsize = k_atoi(k_getenv("memsize"));
06561	  ext_memsize = k_atoi(k_getenv("emssize"));
06562	
06563	  /* Processor? */
06564	  processor = boot_parameters.bp_processor;     /* 86, 186, 286, 386, ... */
06565	
06566	  /* XT, AT or MCA bus? */
06567	  envp = k_getenv("bus");
06568	  if (envp == NIL_PTR || strcmp(envp, "at") == 0) {
06569	        pc_at = TRUE;
06570	  } else
06571	  if (strcmp(envp, "mca") == 0) {
06572	        pc_at = ps_mca = TRUE;
06573	  }
06574	
06575	  /* Decide if mode is protected. */
06576	#if _WORD_SIZE == 2
06577	  protected_mode = processor >= 286;
06578	#endif
06579	
06580	  /* Is there a monitor to return to?  If so then keep it safe. */
06581	  if (!protected_mode) mon_return = 0;
06582	  mon_start = mcode_base / 1024;
06583	  if (mon_return && low_memsize > mon_start) low_memsize = mon_start;
06584	
06585	  /* Return to assembler code to switch to protected mode (if 286), reload
06586	   * selectors and call main().
06587	   */
06588	}
	
	
06591	/*==========================================================================*
06592	 *                              k_atoi                                      *
06593	 *==========================================================================*/
06594	PRIVATE int k_atoi(s)
06595	register char *s;
06596	{
06597	/* Convert string to integer. */
06598	
06599	  return strtol(s, (char **) NULL, 10);
06600	}
	
	
06603	/*==========================================================================*
06604	 *                              k_getenv                                    *
06605	 *==========================================================================*/
06606	PUBLIC char *k_getenv(name)
06607	char *name;
06608	{
06609	/* Get environment value - kernel version of getenv to avoid setting up the
06610	 * usual environment array.
06611	 */
06612	
06613	  register char *namep;
06614	  register char *envp;
06615	
06616	  for (envp = k_environ; *envp != 0;) {
06617	        for (namep = name; *namep != 0 && *namep == *envp; namep++, envp++)
06618	                ;
06619	        if (*namep == '\0' && *envp == '=') return(envp + 1);
06620	        while (*envp++ != 0)
06621	                ;
06622	  }
06623	  return(NIL_PTR);
06624	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -