📄 start.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 + -