博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
grub学习(2) 加载内核
阅读量:4068 次
发布时间:2019-05-25

本文共 2602 字,大约阅读时间需要 8 分钟。

grub_err_t grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), int argc, char *argv[]){	struct linux_kernel_header lh;	struct linux_kernel_params *params;	file = grub_file_open (argv[0]);	//打开linux文件		grub_file_read (file, &lh, sizeof (lh)	//读取linux header		setup_sects = lh.setup_sects; //获取setup.bin占用的扇区		real_size = setup_sects << GRUB_DISK_SECTOR_BITS;	prot_size = grub_file_size (file) - real_size - GRUB_DISK_SECTOR_SIZE;	//获取保护模式镜像大小		allocate_pages (prot_size)	=>grub_err_t allocate_pages (grub_size_t prot_size)	//为 linux_kernel_params params 和 内核镜像申请内存	{		/* Make sure that each size is aligned to a page boundary.  */		real_size = GRUB_LINUX_CL_END_OFFSET;		prot_size = page_align (prot_size);		mmap_size = find_mmap_size ();	//确定e820内存结构数组大小				real_mode_pages = ((real_size + mmap_size + efi_mmap_size) >> 12);		prot_mode_pages = (prot_size >> 12);				err = grub_relocator_alloc_chunk_addr (relocator, &ch,					   real_mode_target,					   (real_size + mmap_size 					    + efi_mmap_size));	//实模式 linux_kernel_params params 结构体和e820申请内存		real_mode_mem = get_virtual_current_address (ch);				prot_mode_target = GRUB_LINUX_BZIMAGE_ADDR;	//内核放在物理地址1MB的位置		grub_relocator_alloc_chunk_addr (relocator, &ch,					   prot_mode_target, prot_size);	//为保护模式内核申请内存		prot_mode_mem = get_virtual_current_address (ch);				/* 初始化linux_kernel_params params */		params = (struct linux_kernel_params *) real_mode_mem;		grub_memset (params, 0, GRUB_LINUX_CL_END_OFFSET);		grub_memcpy (&params->setup_sects, &lh.setup_sects, sizeof (lh) - 0x1F1);				len = 0x400 - sizeof (lh);		grub_file_read (file, (char *) real_mode_mem + sizeof (lh), len)	//读取协议		grub_file_seek (file, real_size + GRUB_DISK_SECTOR_SIZE);				if (grub_memcmp (argv[i], "mem=", 4) == 0) {	//获取内存总大小			char *val = argv[i] + 4;			linux_mem_size = grub_strtoul (val, &val, 0);			int shift = 0;			switch (grub_tolower (val[0]))			  {				case 'g':					shift += 10;				case 'm':					shift += 10;				case 'k':					shift += 10;				default:					break;			  }			linux_mem_size <<= shift;		} else if (grub_memcmp (argv[i], "quiet", sizeof ("quiet") - 1) == 0)		{			params->loadflags |= GRUB_LINUX_FLAG_QUIET;		}				/* Create kernel command line.  */		grub_memcpy ((char *)real_mode_mem + GRUB_LINUX_CL_OFFSET, LINUX_IMAGE,			  sizeof (LINUX_IMAGE));		grub_create_loader_cmdline (argc, argv,					  (char *)real_mode_mem + GRUB_LINUX_CL_OFFSET					  + sizeof (LINUX_IMAGE) - 1,					  GRUB_LINUX_CL_END_OFFSET - GRUB_LINUX_CL_OFFSET					  - (sizeof (LINUX_IMAGE) - 1));		len = prot_size;		grub_file_read (file, prot_mode_mem, len) != len) //加载内核	}}

 

转载地址:http://oflji.baihongyu.com/

你可能感兴趣的文章
环境分支-git版本管理
查看>>
uni-app 全局变量
查看>>
js判断空对象的几种方法
查看>>
java 不用递归写tree
查看>>
springboot2 集成Hibernate JPA 用 声明式事物
查看>>
fhs-framework jetcache 缓存维护之自动清除缓存
查看>>
SpringBoot 动态编译 JAVA class 解决 jar in jar 的依赖问题
查看>>
fhs-framework springboot mybatis 解决表关联查询问题的关键方案-翻译服务
查看>>
ZUUL2 使用场景
查看>>
Spring AOP + Redis + 注解实现redis 分布式锁
查看>>
elastic-job 和springboot 集成干货
查看>>
php开发微服务注册到eureka中(使用sidecar)
查看>>
mybatis mybatis plus mybatis jpa hibernate spring data jpa比较
查看>>
支付宝生活号服务号 用户信息获取 oauth2 登录对接 springboot java
查看>>
CodeForces #196(Div. 2) 337D Book of Evil (树形dp)
查看>>
uva 12260 - Free Goodies (dp,贪心 | 好题)
查看>>
uva-1427 Parade (单调队列优化dp)
查看>>
【设计模式】学习笔记13:组合模式(Composite)
查看>>
hdu 1011 Starship Troopers (树形背包dp)
查看>>
hdu 1561 The more, The Better (树形背包dp)
查看>>