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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? linux.c

?? 有助于了解操作系統如何啟動之過程
?? C
字號:
/* linux.c - boot Linux *//* *  GRUB  --  GRand Unified Bootloader *  Copyright (C) 2003, 2004, 2005, 2007  Free Software Foundation, Inc. * *  GRUB 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 3 of the License, or *  (at your option) any later version. * *  GRUB 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 GRUB.  If not, see <http://www.gnu.org/licenses/>. */#include <grub/elf.h>#include <grub/elfload.h>#include <grub/loader.h>#include <grub/dl.h>#include <grub/mm.h>#include <grub/rescue.h>#include <grub/misc.h>#include <grub/ieee1275/ieee1275.h>#include <grub/machine/loader.h>#define ELF32_LOADMASK (0xc0000000UL)#define ELF64_LOADMASK (0xc000000000000000ULL)static grub_dl_t my_mod;static int loaded;static grub_addr_t initrd_addr;static grub_size_t initrd_size;static grub_addr_t linux_addr;static grub_size_t linux_size;static char *linux_args;typedef void (*kernel_entry_t) (void *, unsigned long, int (void *),				unsigned long, unsigned long);static grub_err_tgrub_linux_boot (void){  kernel_entry_t linuxmain;  grub_ssize_t actual;  /* Set the command line arguments.  */  grub_ieee1275_set_property (grub_ieee1275_chosen, "bootargs", linux_args,			      grub_strlen (linux_args) + 1, &actual);  grub_dprintf ("loader", "Entry point: 0x%x\n", linux_addr);  grub_dprintf ("loader", "Initrd at: 0x%x, size 0x%x\n", initrd_addr,		initrd_size);  grub_dprintf ("loader", "Boot arguments: %s\n", linux_args);  grub_dprintf ("loader", "Jumping to Linux...\n");  /* Boot the kernel.  */  linuxmain = (kernel_entry_t) linux_addr;  linuxmain ((void *) initrd_addr, initrd_size, grub_ieee1275_entry_fn, 0, 0);  return GRUB_ERR_NONE;}static grub_err_tgrub_linux_release_mem (void){  grub_free (linux_args);  linux_args = 0;  if (linux_addr && grub_ieee1275_release (linux_addr, linux_size))    return grub_error (GRUB_ERR_OUT_OF_MEMORY, "Can not release memory");  if (initrd_addr && grub_ieee1275_release (initrd_addr, initrd_size))    return grub_error (GRUB_ERR_OUT_OF_MEMORY, "Can not release memory");  linux_addr = 0;  initrd_addr = 0;  return GRUB_ERR_NONE;}static grub_err_tgrub_linux_unload (void){  grub_err_t err;  err = grub_linux_release_mem ();  grub_dl_unref (my_mod);  loaded = 0;  return err;}static grub_err_tgrub_linux_load32 (grub_elf_t elf){  Elf32_Addr entry;  int found_addr = 0;  /* Linux's entry point incorrectly contains a virtual address.  */  entry = elf->ehdr.ehdr32.e_entry & ~ELF32_LOADMASK;  if (entry == 0)    entry = 0x01400000;  linux_size = grub_elf32_size (elf);  if (linux_size == 0)    return grub_errno;  /* Pad it; the kernel scribbles over memory beyond its load address.  */  linux_size += 0x100000;  /* On some systems, firmware occupies the memory we're trying to use.   * Happily, Linux can be loaded anywhere (it relocates itself).  Iterate   * until we find an open area.  */  for (linux_addr = entry; linux_addr < entry + 200 * 0x100000; linux_addr += 0x100000)    {      grub_dprintf ("loader", "Attempting to claim at 0x%x, size 0x%x.\n",		    linux_addr, linux_size);      found_addr = grub_claimmap (linux_addr, linux_size);      if (found_addr != -1)	break;    }  if (found_addr == -1)    return grub_error (GRUB_ERR_OUT_OF_MEMORY, "Could not claim memory.");  /* Now load the segments into the area we claimed.  */  auto grub_err_t offset_phdr (Elf32_Phdr *phdr, grub_addr_t *addr);  grub_err_t offset_phdr (Elf32_Phdr *phdr, grub_addr_t *addr)    {      /* Linux's program headers incorrectly contain virtual addresses.       * Translate those to physical, and offset to the area we claimed.  */      *addr = (phdr->p_paddr & ~ELF32_LOADMASK) + linux_addr;      return 0;    }  return grub_elf32_load (elf, offset_phdr, 0, 0);}static grub_err_tgrub_linux_load64 (grub_elf_t elf){  Elf64_Addr entry;  int found_addr = 0;  /* Linux's entry point incorrectly contains a virtual address.  */  entry = elf->ehdr.ehdr64.e_entry & ~ELF64_LOADMASK;  if (entry == 0)    entry = 0x01400000;  linux_size = grub_elf64_size (elf);  if (linux_size == 0)    return grub_errno;  /* Pad it; the kernel scribbles over memory beyond its load address.  */  linux_size += 0x100000;  /* On some systems, firmware occupies the memory we're trying to use.   * Happily, Linux can be loaded anywhere (it relocates itself).  Iterate   * until we find an open area.  */  for (linux_addr = entry; linux_addr < entry + 200 * 0x100000; linux_addr += 0x100000)    {      grub_dprintf ("loader", "Attempting to claim at 0x%x, size 0x%x.\n",		    linux_addr, linux_size);      found_addr = grub_claimmap (linux_addr, linux_size);      if (found_addr != -1)	break;    }  if (found_addr == -1)    return grub_error (GRUB_ERR_OUT_OF_MEMORY, "Could not claim memory.");  /* Now load the segments into the area we claimed.  */  auto grub_err_t offset_phdr (Elf64_Phdr *phdr, grub_addr_t *addr);  grub_err_t offset_phdr (Elf64_Phdr *phdr, grub_addr_t *addr)    {      /* Linux's program headers incorrectly contain virtual addresses.       * Translate those to physical, and offset to the area we claimed.  */      *addr = (phdr->p_paddr & ~ELF64_LOADMASK) + linux_addr;      return 0;    }  return grub_elf64_load (elf, offset_phdr, 0, 0);}voidgrub_rescue_cmd_linux (int argc, char *argv[]){  grub_elf_t elf = 0;  int i;  int size;  char *dest;  grub_dl_ref (my_mod);  if (argc == 0)    {      grub_error (GRUB_ERR_BAD_ARGUMENT, "no kernel specified");      goto out;    }  elf = grub_elf_open (argv[0]);  if (! elf)    goto out;  if (elf->ehdr.ehdr32.e_type != ET_EXEC)    {      grub_error (GRUB_ERR_UNKNOWN_OS,		  "This ELF file is not of the right type\n");      goto out;    }  /* Release the previously used memory.  */  grub_loader_unset ();  if (grub_elf_is_elf32 (elf))    grub_linux_load32 (elf);  else  if (grub_elf_is_elf64 (elf))    grub_linux_load64 (elf);  else    {      grub_error (GRUB_ERR_BAD_FILE_TYPE, "Unknown ELF class");      goto out;    }  size = sizeof ("BOOT_IMAGE=") + grub_strlen (argv[0]);  for (i = 0; i < argc; i++)    size += grub_strlen (argv[i]) + 1;  linux_args = grub_malloc (size);  if (! linux_args)    goto out;  /* Specify the boot file.  */  dest = grub_stpcpy (linux_args, "BOOT_IMAGE=");  dest = grub_stpcpy (dest, argv[0]);    for (i = 1; i < argc; i++)    {      *dest++ = ' ';      dest = grub_stpcpy (dest, argv[i]);    }out:  if (elf)    grub_elf_close (elf);  if (grub_errno != GRUB_ERR_NONE)    {      grub_linux_release_mem ();      grub_dl_unref (my_mod);      loaded = 0;    }  else    {      grub_loader_set (grub_linux_boot, grub_linux_unload, 1);      initrd_addr = 0;      loaded = 1;    }}voidgrub_rescue_cmd_initrd (int argc, char *argv[]){  grub_file_t file = 0;  grub_ssize_t size;  grub_addr_t first_addr;  grub_addr_t addr;  int found_addr = 0;  if (argc == 0)    {      grub_error (GRUB_ERR_BAD_ARGUMENT, "no initrd specified");      goto fail;    }  if (!loaded)    {      grub_error (GRUB_ERR_BAD_ARGUMENT, "You need to load the kernel first.");      goto fail;    }  file = grub_file_open (argv[0]);  if (! file)    goto fail;  first_addr = linux_addr + linux_size;  size = grub_file_size (file);  /* Attempt to claim at a series of addresses until successful in     the same way that grub_rescue_cmd_linux does.  */  for (addr = first_addr; addr < first_addr + 200 * 0x100000; addr += 0x100000)     {      grub_dprintf ("loader", "Attempting to claim at 0x%x, size 0x%x.\n", 		    addr, size);      found_addr = grub_claimmap (addr, size);      if (found_addr != -1)	break;    }  if (found_addr == -1)    {      grub_error (GRUB_ERR_OUT_OF_MEMORY, "Can not claim memory");      goto fail;    }  grub_dprintf ("loader", "Loading initrd at 0x%x, size 0x%x\n", addr, size);  if (grub_file_read (file, (void *) addr, size) != size)    {      grub_ieee1275_release (addr, size);      grub_error (GRUB_ERR_FILE_READ_ERROR, "Couldn't read file");      goto fail;    }  initrd_addr = addr;  initrd_size = size; fail:  if (file)    grub_file_close (file);}GRUB_MOD_INIT(linux){  grub_rescue_register_command ("linux", grub_rescue_cmd_linux,				"load a linux kernel");  grub_rescue_register_command ("initrd", grub_rescue_cmd_initrd,				"load an initrd");  my_mod = mod;}GRUB_MOD_FINI(linux){  grub_rescue_unregister_command ("linux");  grub_rescue_unregister_command ("initrd");}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91国偷自产一区二区三区观看| 国产精品1区2区3区在线观看| 中文字幕 久热精品 视频在线| 欧美一区二区三区免费在线看| 欧美性感一区二区三区| 91蜜桃网址入口| 在线视频国内一区二区| 欧美性受极品xxxx喷水| 欧美日韩情趣电影| 717成人午夜免费福利电影| 337p亚洲精品色噜噜狠狠| 这里只有精品99re| 久久先锋资源网| 国产欧美精品一区aⅴ影院 | 国产精品一区久久久久| 国产精品白丝jk黑袜喷水| 国产高清在线精品| 色综合欧美在线视频区| 欧美日韩精品综合在线| www久久精品| 亚洲欧洲国产日韩| 天涯成人国产亚洲精品一区av| 日本午夜精品一区二区三区电影| 韩国av一区二区三区在线观看| 国产精品66部| 欧美伊人久久久久久午夜久久久久| 欧美乱妇20p| 日本一区二区久久| 香港成人在线视频| 国产精品夜夜爽| 欧美三级三级三级| 久久夜色精品国产欧美乱极品| 亚洲婷婷在线视频| 美女mm1313爽爽久久久蜜臀| zzijzzij亚洲日本少妇熟睡| 9191精品国产综合久久久久久| 国产午夜精品一区二区| 亚洲午夜精品网| 国产91高潮流白浆在线麻豆| 欧美日韩在线播放| 国产精品色呦呦| 美女精品一区二区| 91搞黄在线观看| 日本一区二区三区高清不卡| 日韩电影在线一区二区| 97久久超碰精品国产| 亚洲精品一区二区三区福利| 亚洲在线免费播放| 风流少妇一区二区| 精品久久久久一区二区国产| 亚洲国产精品视频| 91小宝寻花一区二区三区| 精品日韩av一区二区| 亚洲一二三四在线观看| 成人免费毛片高清视频| 精品国产乱码久久久久久免费| 亚洲永久免费视频| 99久久99久久综合| 中文字幕成人av| 国产制服丝袜一区| 日韩精品一区二区三区中文不卡| 亚洲一区二区黄色| 日本乱人伦aⅴ精品| ...av二区三区久久精品| 国产一区视频导航| 日韩欧美高清在线| 麻豆精品在线看| 欧美一级xxx| 日本aⅴ亚洲精品中文乱码| 欧美性受xxxx黑人xyx性爽| 亚洲欧美视频一区| 97久久精品人人做人人爽50路| 国产三级欧美三级日产三级99| 狠狠色丁香婷婷综合久久片| 日韩欧美一级二级三级久久久| 五月天激情综合| 欧美精品三级在线观看| 日韩国产精品久久久| 日韩一区二区三区视频| 蜜臀av亚洲一区中文字幕| 日韩美女一区二区三区四区| 青娱乐精品在线视频| 欧美一级理论性理论a| 久久成人免费网| 国产亚洲精品bt天堂精选| 成人福利视频在线| 亚洲一区免费在线观看| 欧美一区二区三区在线| 精品一区二区三区免费视频| 久久精品一区八戒影视| 成人短视频下载 | 色综合天天性综合| 一区二区免费看| 欧美日韩国产a| 国产综合色视频| 亚洲欧美色综合| 69av一区二区三区| 国产高清成人在线| 亚洲你懂的在线视频| 91精品久久久久久蜜臀| 国产麻豆精品久久一二三| 亚洲欧洲成人自拍| 91精品婷婷国产综合久久性色| 韩国毛片一区二区三区| 亚洲欧美一区二区久久| 在线播放视频一区| 国产曰批免费观看久久久| 亚洲天堂福利av| 欧美va亚洲va| 在线一区二区三区| 国产一区二区主播在线| 亚洲午夜久久久久久久久电影网 | 日韩欧美视频在线| 成人va在线观看| 日韩电影免费在线观看网站| 国产日本一区二区| 欧美一区二区啪啪| 91麻豆精东视频| 国产精品综合二区| 午夜免费久久看| 中文字幕一区在线观看视频| 884aa四虎影成人精品一区| 高清不卡一二三区| 蜜桃av噜噜一区二区三区小说| 国产精品国产三级国产专播品爱网| 在线播放中文一区| 在线观看成人免费视频| 高潮精品一区videoshd| 日韩av不卡在线观看| 亚洲蜜臀av乱码久久精品| 精品999在线播放| 欧美日韩国产精品成人| 97国产精品videossex| 国产成人免费av在线| 九一久久久久久| 日韩影院在线观看| 亚洲电影第三页| 亚洲精品videosex极品| 日本精品一级二级| 久久99国产精品尤物| 日韩成人精品视频| 亚洲成av人片在线观看无码| 中文字幕日韩欧美一区二区三区| 久久综合色天天久久综合图片| 欧美电影一区二区三区| 欧美久久久久免费| 欧美色窝79yyyycom| 欧美日韩一区不卡| 欧美性色黄大片| 欧美影院精品一区| 欧美午夜电影一区| 欧美日韩国产a| 欧美一区二区三区小说| 欧美一级精品在线| 精品国一区二区三区| 欧美不卡一二三| 久久久久久99精品| 国产视频视频一区| 国产精品久久久久久久久免费丝袜| 日本一区二区三区在线不卡| 欧美国产日韩亚洲一区| 中文字幕在线观看不卡视频| 自拍偷拍欧美激情| 亚洲与欧洲av电影| 免费看欧美女人艹b| 国产乱子伦一区二区三区国色天香| 国内成+人亚洲+欧美+综合在线| 国产精品自在欧美一区| 成人av集中营| 欧美日韩视频一区二区| 日韩一区二区视频| 久久精品人人做人人爽97| 中文字幕一区二区三区不卡| 一区二区三区.www| 青椒成人免费视频| 成人午夜激情片| 欧洲视频一区二区| 精品人在线二区三区| 国产精品你懂的在线欣赏| 洋洋成人永久网站入口| 久久超碰97中文字幕| 成人不卡免费av| 欧美高清一级片在线| 中文字幕 久热精品 视频在线| 一区二区三区免费看视频| 免费看欧美美女黄的网站| 成人一级片在线观看| 欧美老年两性高潮| 日本一二三四高清不卡| 丝袜亚洲另类欧美综合| 丁香六月久久综合狠狠色| 欧美日韩国产高清一区二区| 久久精品视频在线免费观看| 午夜精品视频一区| 成人免费毛片app| 8v天堂国产在线一区二区| 亚洲丝袜制服诱惑| 国内精品伊人久久久久av影院 | 一区二区三区四区不卡视频| 麻豆成人av在线|