亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? asmstub.c

?? Linux啟動(dòng)程序grub的源碼分析與實(shí)現(xiàn);
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/* asmstub.c - a version of shared_src/asm.S that works under Unix *//* *  GRUB  --  GRand Unified Bootloader *  Copyright (C) 1999,2000,2001,2002,2004  Free Software Foundation, Inc. * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *//* Try to use glibc's transparant LFS support. */#define _LARGEFILE_SOURCE	1/* lseek becomes synonymous with lseek64.  */#define _FILE_OFFSET_BITS	64/* Simulator entry point. */int grub_stage2 (void);#include <stdlib.h>#include <string.h>#include <ctype.h>#include <assert.h>#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <time.h>#include <errno.h>#include <string.h>#include <unistd.h>#include <setjmp.h>#include <sys/time.h>#include <termios.h>#include <signal.h>#ifdef __linux__# include <sys/ioctl.h>		/* ioctl */# if !defined(__GLIBC__) || \	((__GLIBC__ < 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ < 1)))/* Maybe libc doesn't have large file support.  */#  include <linux/unistd.h>	/* _llseek */# endif /* (GLIBC < 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR < 1)) */# ifndef BLKFLSBUF#  define BLKFLSBUF	_IO (0x12,97)	/* flush buffer cache */# endif /* ! BLKFLSBUF */#endif /* __linux__ *//* We want to prevent any circularararity in our stubs, as well as   libc name clashes. */#define WITHOUT_LIBC_STUBS 1#include <shared.h>#include <device.h>#include <serial.h>#include <term.h>/* Simulated memory sizes. */#define EXTENDED_MEMSIZE (3 * 1024 * 1024)	/* 3MB */#define CONVENTIONAL_MEMSIZE (640 * 1024)	/* 640kB */unsigned long install_partition = 0x20000;unsigned long boot_drive = 0;int saved_entryno = 0;char version_string[] = VERSION;char config_file[128] = "/boot/grub/menu.lst"; /* FIXME: arbitrary */unsigned long linux_text_len = 0;char *linux_data_tmp_addr = 0;char *linux_data_real_addr = 0;unsigned short io_map[IO_MAP_SIZE];struct apm_info apm_bios_info;/* Emulation requirements. */char *grub_scratch_mem = 0;struct geometry *disks = 0;/* The map between BIOS drives and UNIX device file names.  */char **device_map = 0;/* The jump buffer for exiting correctly.  */static jmp_buf env_for_exit;/* The current color for console.  */int console_current_color = A_NORMAL;/* The file descriptor for a serial device.  */static int serial_fd = -1;/* The file name of a serial device.  */static char *serial_device = 0;#ifdef SIMULATE_SLOWNESS_OF_SERIAL/* The speed of a serial device.  */static unsigned int serial_speed;#endif /* SIMULATE_SLOWNESS_OF_SERIAL *//* The main entry point into this mess. */intgrub_stage2 (void){  /* These need to be static, because they survive our stack transitions. */  static int status = 0;  static char *realstack;  char *scratch, *simstack;  int i;  auto void doit (void);    /* We need a nested function so that we get a clean stack frame,     regardless of how the code is optimized. */  void doit (void)    {      /* Make sure our stack lives in the simulated memory area. */      asm volatile ("movl %%esp, %0\n\tmovl %1, %%esp\n"		    : "=&r" (realstack) : "r" (simstack));            /* Do a setjmp here for the stop command.  */      if (! setjmp (env_for_exit))	{	  /* Actually enter the generic stage2 code.  */	  status = 0;	  init_bios_info ();	}      else	{	  /* If ERRNUM is non-zero, then set STATUS to non-zero.  */	  if (errnum)	    status = 1;	}            /* Replace our stack before we use any local variables. */      asm volatile ("movl %0, %%esp\n" : : "r" (realstack));    }  assert (grub_scratch_mem == 0);  scratch = malloc (0x100000 + EXTENDED_MEMSIZE + 15);  assert (scratch);  grub_scratch_mem = (char *) ((((int) scratch) >> 4) << 4);  /* FIXME: simulate the memory holes using mprot, if available. */  assert (disks == 0);  disks = malloc (NUM_DISKS * sizeof (*disks));  assert (disks);  /* Initialize DISKS.  */  for (i = 0; i < NUM_DISKS; i++)    disks[i].flags = -1;  if (! init_device_map (&device_map, device_map_file, floppy_disks))    return 1;    /* Check some invariants. */  assert ((SCRATCHSEG << 4) == SCRATCHADDR);  assert ((BUFFERSEG << 4) == BUFFERADDR);  assert (BUFFERADDR + BUFFERLEN == SCRATCHADDR);  assert (FSYS_BUF % 16 == 0);  assert (FSYS_BUF + FSYS_BUFLEN == BUFFERADDR);#ifdef HAVE_LIBCURSES  /* Get into char-at-a-time mode. */  if (use_curses)    {      initscr ();      cbreak ();      noecho ();      nonl ();      scrollok (stdscr, TRUE);      keypad (stdscr, TRUE);      wtimeout (stdscr, 100);      signal (SIGWINCH, SIG_IGN);    }#endif  /* Make sure that actual writing is done.  */  sync ();  /* Set our stack, and go for it. */  simstack = (char *) PROTSTACKINIT;  doit ();  /* I don't know if this is necessary really.  */  sync ();#ifdef HAVE_LIBCURSES  if (use_curses)    endwin ();#endif  /* Close off the file descriptors we used. */  for (i = 0; i < NUM_DISKS; i ++)    if (disks[i].flags != -1)      {#ifdef __linux__	/* In Linux, invalidate the buffer cache. In other OSes, reboot	   is one of the solutions...  */	ioctl (disks[i].flags, BLKFLSBUF, 0);#else# warning "In your operating system, the buffer cache will not be flushed."#endif	close (disks[i].flags);      }  if (serial_fd >= 0)    close (serial_fd);    /* Release memory. */  restore_device_map (device_map);  device_map = 0;  free (disks);  disks = 0;  free (scratch);  grub_scratch_mem = 0;  if (serial_device)    free (serial_device);  serial_device = 0;    /* Ahh... at last we're ready to return to caller. */  return status;}/* Assign DRIVE to a device name DEVICE.  */voidassign_device_name (int drive, const char *device){  /* If DRIVE is already assigned, free it.  */  if (device_map[drive])    free (device_map[drive]);  /* If the old one is already opened, close it.  */  if (disks[drive].flags != -1)    {      close (disks[drive].flags);      disks[drive].flags = -1;    }  /* Assign DRIVE to DEVICE.  */  if (! device)    device_map[drive] = 0;  else    device_map[drive] = strdup (device);}voidstop (void){#ifdef HAVE_LIBCURSES  if (use_curses)    endwin ();#endif  /* Jump to doit.  */  longjmp (env_for_exit, 1);}voidgrub_reboot (void){  stop ();}voidgrub_halt (int no_apm){  stop ();}/* calls for direct boot-loader chaining */voidchain_stage1 (unsigned long segment, unsigned long offset,	      unsigned long part_table_addr){  stop ();}voidchain_stage2 (unsigned long segment, unsigned long offset, int second_sector){  stop ();}/* do some funky stuff, then boot linux */voidlinux_boot (void){  stop ();}/* For bzImage kernels. */voidbig_linux_boot (void){  stop ();}/* booting a multiboot executable */voidmulti_boot (int start, int mb_info){  stop ();}/* sets it to linear or wired A20 operation */voidgateA20 (int linear){  /* Nothing to do in the simulator. */}/* Set up the int15 handler.  */voidset_int15_handler (void){  /* Nothing to do in the simulator.  */}/* Restore the original int15 handler.  */voidunset_int15_handler (void){  /* Nothing to do in the simulator.  */}/* The key map.  */unsigned short bios_key_map[KEY_MAP_SIZE + 1];unsigned short ascii_key_map[KEY_MAP_SIZE + 1];/* Copy MAP to the drive map and set up the int13 handler.  */voidset_int13_handler (unsigned short *map){  /* Nothing to do in the simulator.  */}intget_code_end (void){  /* Just return a little area for simulation. */  return BOOTSEC_LOCATION + (60 * 1024);}/* memory probe routines */intget_memsize (int type){  if (! type)    return CONVENTIONAL_MEMSIZE >> 10;  else    return EXTENDED_MEMSIZE >> 10;}/* get_eisamemsize() :  return packed EISA memory map, lower 16 bits is *		memory between 1M and 16M in 1K parts, upper 16 bits is *		memory above 16M in 64K parts.  If error, return -1. */intget_eisamemsize (void){  return (EXTENDED_MEMSIZE >> 10);}#define MMAR_DESC_TYPE_AVAILABLE 1 /* available to OS */#define MMAR_DESC_TYPE_RESERVED 2 /* not available */#define MMAR_DESC_TYPE_ACPI_RECLAIM 3 /* usable by OS after reading ACPI */#define MMAR_DESC_TYPE_ACPI_NVS 4 /* required to save between NVS sessions */#define MMAR_DESC_LENGTH	20/* Fetch the next entry in the memory map and return the continuation   value.  DESC is a pointer to the descriptor buffer, and CONT is the   previous continuation value (0 to get the first entry in the   map).  */intget_mmap_entry (struct mmar_desc *desc, int cont){  /* Record the memory map statically.  */  static struct mmar_desc desc_table[] =  {    /* The conventional memory.  */    {      MMAR_DESC_LENGTH,      0,      CONVENTIONAL_MEMSIZE,      MMAR_DESC_TYPE_AVAILABLE    },    /* BIOS RAM and ROM (such as video memory).  */    {      MMAR_DESC_LENGTH,      CONVENTIONAL_MEMSIZE,      0x100000 - CONVENTIONAL_MEMSIZE,      MMAR_DESC_TYPE_RESERVED    },    /* The extended memory.  */    {      MMAR_DESC_LENGTH,      0x100000,      EXTENDED_MEMSIZE,      MMAR_DESC_TYPE_AVAILABLE    }  };    int num = sizeof (desc_table) / sizeof (*desc_table);  if (cont < 0 || cont >= num)    {      /* Should not happen.  */      desc->desc_len = 0;    }  else    {      /* Copy the entry.  */      *desc = desc_table[cont++];      /* If the next entry exists, return the index.  */      if (cont < num)	return cont;    }    return 0;}/* Track the int13 handler.  */voidtrack_int13 (int drive){  /* Nothing to do in the simulator.  */}/* Get the ROM configuration table.  */unsigned longget_rom_config_table (void){  return 0;}/* Get APM BIOS information.  */voidget_apm_info (void){  /* Nothing to do in the simulator.  */}/* Get VBE controller information.  */intget_vbe_controller_info (struct vbe_controller *controller){  /* Always fails.  */  return 0;}/* Get VBE mode information.  */intget_vbe_mode_info (int mode_number, struct vbe_mode *mode){  /* Always fails.  */  return 0;}/* Set VBE mode.  */intset_vbe_mode (int mode_number){  /* Always fails.  */  return 0;}/* low-level timing info */intgetrtsecs (void){  /* FIXME: exact value is not important, so just return time_t for now. */  return time (0);}intcurrticks (void){  struct timeval tv;  long csecs;  int ticks_per_csec, ticks_per_usec;  /* Note: 18.2 ticks/sec.  */  /* Get current time.  */  gettimeofday (&tv, 0);  /* Compute centiseconds.  */  csecs = tv.tv_sec / 10;  /* Ticks per centisecond.  */  ticks_per_csec = csecs * 182;  /* Ticks per microsecond.  */  ticks_per_usec = (((tv.tv_sec - csecs * 10) * 1000000 + tv.tv_usec)		    * 182 / 10000000);  /* Sum them.  */  return ticks_per_csec + ticks_per_usec;}/* displays an ASCII character.  IBM displays will translate some   characters to special graphical ones */voidconsole_putchar (int c){  /* Curses doesn't have VGA fonts.  */  switch (c)    {    case DISP_UL:      c = ACS_ULCORNER;      break;    case DISP_UR:      c = ACS_URCORNER;      break;    case DISP_LL:      c = ACS_LLCORNER;      break;    case DISP_LR:      c = ACS_LRCORNER;      break;    case DISP_HORIZ:      c = ACS_HLINE;      break;    case DISP_VERT:      c = ACS_VLINE;      break;    case DISP_LEFT:      c = ACS_LARROW;      break;    case DISP_RIGHT:      c = ACS_RARROW;      break;    case DISP_UP:      c = ACS_UARROW;      break;    case DISP_DOWN:      c = ACS_DARROW;      break;    default:      break;    }#ifdef HAVE_LIBCURSES  if (use_curses)    {      /* In ncurses, a newline is treated badly, so we emulate it in our	 own way.  */      if (c == '\n')	{	  int x, y;	  getyx (stdscr, y, x);	  if (y + 1 == LINES)	    scroll (stdscr);	  else	    move (y + 1, x);	}      else if (isprint (c))	{	  int x, y;	  getyx (stdscr, y, x);	  if (x + 1 == COLS)	    {	      console_putchar ('\r');	      console_putchar ('\n');	    }	  addch (c | console_current_color);	}      else	{	  addch (c);	}      #ifdef REFRESH_IMMEDIATELY      refresh ();#endif    }  else#endif    {      /* CR is not used in Unix.  */      if (c != '\r')	putchar (c);    }}/* The store for ungetch simulation. This is necessary, because   ncurses-1.9.9g is still used in the world and its ungetch is   completely broken.  */#ifdef HAVE_LIBCURSESstatic int save_char = ERR;#endifstatic intconsole_translate_key (int c){  switch (c)    {    case KEY_LEFT:      return 2;    case KEY_RIGHT:      return 6;    case KEY_UP:      return 16;    case KEY_DOWN:      return 14;    case KEY_DC:      return 4;    case KEY_BACKSPACE:      return 8;    case KEY_HOME:      return 1;    case KEY_END:      return 5;    case KEY_PPAGE:      return 7;    case KEY_NPAGE:      return 3;    default:      break;    }

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一二三区在线观看| 亚洲成a人片在线不卡一二三区| 国产综合成人久久大片91| 国产偷国产偷精品高清尤物| jlzzjlzz亚洲日本少妇| 亚洲在线视频免费观看| 精品久久久久久最新网址| 91色porny| 国产一区二区三区精品视频| 香蕉乱码成人久久天堂爱免费| 精品国产一区二区三区不卡 | 青青草91视频| 一区二区三区免费| 欧美国产在线观看| 日韩欧美国产不卡| 欧美日韩精品久久久| www.视频一区| 成人免费毛片app| 国产成人在线视频免费播放| 久久99国内精品| 日韩高清在线一区| 依依成人精品视频| 亚洲色图另类专区| 一区二区在线看| 国产精品福利一区二区三区| 亚洲免费观看高清在线观看| 日本一区二区成人在线| 亚洲视频在线一区观看| 国产精品成人免费在线| 一区二区三区欧美在线观看| 亚洲精品乱码久久久久久黑人| 亚洲人精品午夜| 亚洲电影一区二区三区| 首页亚洲欧美制服丝腿| 天天影视网天天综合色在线播放| 美日韩一区二区三区| 国内外成人在线视频| jvid福利写真一区二区三区| 色综合一区二区三区| 欧美丰满少妇xxxbbb| 久久美女艺术照精彩视频福利播放 | 秋霞午夜鲁丝一区二区老狼| 久久91精品国产91久久小草| www.欧美.com| 91精品国产一区二区三区香蕉| 国产午夜亚洲精品羞羞网站| 国产精品蜜臀av| 成人午夜激情在线| 日韩一区二区免费高清| 亚洲欧洲韩国日本视频| 奇米色一区二区| 91免费视频网| 久久精品视频在线免费观看| 日韩精品国产欧美| zzijzzij亚洲日本少妇熟睡| 日韩手机在线导航| 丝袜国产日韩另类美女| 色94色欧美sute亚洲线路一ni| 国产婷婷色一区二区三区| 免费看精品久久片| 欧美二区在线观看| 日韩专区一卡二卡| 欧美视频中文一区二区三区在线观看 | 亚洲精品久久久久久国产精华液| 成人av影院在线| 中文字幕一区二区三区四区| 国产福利91精品一区二区三区| 精品伦理精品一区| 日本aⅴ免费视频一区二区三区 | 91精品啪在线观看国产60岁| 亚洲二区视频在线| 欧美日韩一区成人| 日韩在线a电影| 精品粉嫩超白一线天av| 国产精品香蕉一区二区三区| 中文字幕国产精品一区二区| 色成年激情久久综合| 天堂精品中文字幕在线| 日韩精品一区国产麻豆| 懂色av一区二区夜夜嗨| 亚洲日本在线观看| 日韩午夜电影在线观看| 成人一级片在线观看| 亚洲一区二区美女| 久久久久久毛片| 欧美专区在线观看一区| 国产精品18久久久久| 亚洲精品国产无套在线观| 欧美大尺度电影在线| 99re热这里只有精品视频| 男男gaygay亚洲| 一区二区三区在线播放| 六月丁香婷婷久久| 国产精品女同互慰在线看| 国产欧美一区二区精品性色 | 欧美一区二区免费| 成人午夜免费av| 久久97超碰色| 一区二区三区高清不卡| 中文字幕乱码一区二区免费| 欧美大片日本大片免费观看| 欧美日韩久久不卡| 欧美在线观看一区二区| 欧美午夜在线一二页| 成人av资源站| 成人免费视频视频在线观看免费| 美女视频一区二区| 日本一不卡视频| 国产主播一区二区三区| 粉嫩av一区二区三区粉嫩| 一区二区成人在线观看| 精品国偷自产国产一区| 中文字幕制服丝袜成人av| 蜜桃精品视频在线| 国产成人午夜视频| 色综合久久天天| 欧美日韩色一区| 久久久久国产免费免费| 中文字幕在线不卡国产视频| 玉足女爽爽91| 韩国三级在线一区| 国产99久久久精品| 日韩欧美综合在线| 国产精品久久久久婷婷| 一二三四区精品视频| 美日韩黄色大片| 欧美午夜精品久久久久久孕妇 | 91香蕉视频黄| 欧美在线一二三| 久久精品人人做人人综合| 国产精品进线69影院| 麻豆91免费看| 欧美群妇大交群中文字幕| 国产精品美女视频| 日本午夜精品一区二区三区电影| 在线观看一区日韩| 中文字幕一区二区日韩精品绯色| 国内一区二区视频| 欧美日韩高清一区| 欧美高清在线视频| 国产一区二区美女| 欧美成人官网二区| 亚洲电影你懂得| 色哟哟精品一区| 亚洲精品免费一二三区| 色视频成人在线观看免| 国产精品美日韩| 99免费精品在线| 亚洲另类一区二区| 91久久香蕉国产日韩欧美9色| 国产精品萝li| caoporn国产精品| 国产精品人人做人人爽人人添| 国产精品资源在线| 中文字幕av资源一区| 99久久免费精品| 亚洲香蕉伊在人在线观| 欧美肥妇毛茸茸| 国产麻豆精品一区二区| 中文字幕高清一区| 欧美主播一区二区三区| 久99久精品视频免费观看| 久久精品水蜜桃av综合天堂| 国产精品88888| 一区二区在线观看免费视频播放| 精品视频一区三区九区| 国产综合成人久久大片91| 国产精品视频在线看| 欧美日韩高清一区| 成人一二三区视频| 日本不卡中文字幕| 久久久久久久综合| 在线一区二区三区四区| 另类专区欧美蜜桃臀第一页| 亚洲色图欧美在线| 久久综合色综合88| 92精品国产成人观看免费| 免费成人美女在线观看.| 自拍偷拍欧美精品| 欧美va亚洲va在线观看蝴蝶网| 99re在线视频这里只有精品| 韩国在线一区二区| 亚洲国产成人精品视频| 国产精品久久久久久久岛一牛影视| 欧美丰满美乳xxx高潮www| 99精品国产热久久91蜜凸| 国产一区二区在线影院| 日产欧产美韩系列久久99| 亚洲最快最全在线视频| 综合色中文字幕| 中文字幕亚洲一区二区va在线| 久久精品亚洲麻豆av一区二区| 欧美一区二区视频在线观看 | 久久综合九色综合欧美就去吻| 欧美午夜一区二区三区免费大片| av电影一区二区| 色偷偷一区二区三区| 色国产精品一区在线观看| 在线视频一区二区三| 欧美日韩高清一区二区三区|