当前位置: 首页 > news >正文

视频网站建设策划书在线代理浏览网址

视频网站建设策划书,在线代理浏览网址,gta5卖公司显示网站正在建设中,免费二级域名【Linux0.11代码分析】04 之 head.s 启动流程 一、boot/head.s 系列文章如下: 系列文章汇总:《【Linux0.11代码分析】之 系列文章链接汇总(全)》 . 1.《【Linux0.11代码分析】01 之 代码目录分析》 2.《【Linux0.11代码分析】02 之…

【Linux0.11代码分析】04 之 head.s 启动流程

  • 一、boot/head.s


系列文章如下:

系列文章汇总:《【Linux0.11代码分析】之 系列文章链接汇总(全)》
.
1.《【Linux0.11代码分析】01 之 代码目录分析》
2.《【Linux0.11代码分析】02 之 bootsect.s 启动流程》
3.《【Linux0.11代码分析】03 之 setup.s 启动流程》
4.《【Linux0.11代码分析】04 之 head.s 启动流程》
5.《【Linux0.11代码分析】05 之 kernel 初始化 init\main.c 代码分析》
6.《【Linux0.11代码分析】06 之 kernel 初始化 init 进程代码分析》


head.s 程序编译后会被连接成system模块的最前面开始部分,它处于内存绝对地址 0x00000处,
它主要功能为:

  1. 加载各个数据段寄存器,重新设置中断描述符表,共256项,并使各个表项均指向一个只报错误的哑中断程序。
  2. 然后重新设置全局描述符表。
  3. 使用物理地址 01M 开始处的内容相比较的方法,检测 A20 地址线是否真的开启
    (如果没有开启,则在访问高于 1Mb 物理内存地址时 CPU 实际只会访问(IP MOD 1Mb)地址处的内容),
    如果检测下来发现没有开启则进入死循环。
  4. 然后测试 PC 机是否含有数学协处理器芯片,并在控制寄存器CR0 中置相应的标志位
  5. 设置分页处理机制,将页目录表放在绝对物理地址 0 开始处,紧随后面放置4个页表(可寻址 16MB内存),并分别设置它们的表项
  6. 最后利用ret 返回指令将预先放置在堆栈中/init/main.c 程序的地址弹出,去运行 main()程序,同时它可以刷新预取指令队列。

一、boot/head.s

/* head.s 含有 32 位启动代码* 注意!!! 32 位启动代码是从绝对地址 0x00000000 开始的,* 这里也同样是页目录将存在的地方,因此这里的启动代码将被页目录覆盖掉 */
.text
.globl idt,gdt,pg_dir,tmp_floppy_area
pg_dir:					// 页目录标识符
.globl startup_32
startup_32:movl $0x10,%eax		// 32位寄存器 eax = 0x00000010mov %ax,%ds			// 将ds = es = fs = gs = 0x10mov %ax,%esmov %ax,%fsmov %ax,%gslss stack_start,%esp	// 设置系统堆栈, _stack_start :  ss:espcall setup_idt			// 设置中断描述符表=================>+	setup_idt:+		lea ignore_int,%edx+		movl $0x00080000,%eax+		movw %dx,%ax				/* selector = 0x0008 = cs */+		movw $0x8E00,%dx			/* interrupt gate - dpl=0, present */+	+		lea idt,%edi+		mov $256,%ecx+	rp_sidt:+		movl %eax,(%edi)+		movl %edx,4(%edi)+		addl $8,%edi+		dec %ecx+		jne rp_sidt+		lidt idt_descr+		ret<=================call setup_gdt			// 设置全局描述符表=================>+	setup_gdt:+		lgdt gdt_descr+		ret<=================// 由于加载了 gdt,所以重部重装载所有的段寄存器movl $0x10,%eax			# reload all the segment registersmov %ax,%ds				# after changing gdt. CS was alreadymov %ax,%es				# reloaded in 'setup_gdt'mov %ax,%fsmov %ax,%gslss stack_start,%esp	// 设置系统堆栈, _stack_start :  ss:espxorl %eax,%eax// 检查A20地址线是否已经开启,向内存地址0x000000处这与任意一个数值 ,然后看内存地址0x100000(1M)是否也是这个值,// 如果一直相同的话,说明A20地址线没有选通,结果内核不能使用1MB以上内存
1:	incl %eax				# check that A20 really IS enabledmovl %eax,0x000000		# loop forever if it isn'tcmpl %eax,0x100000je 1b// 于检查数学协处理器芯片是否存在修改控制寄存器 CR0,// 在假设存在协处理器的情况下执行一个协处理器指令,// 如果出错的话则说明协处理器芯片不存在,需要设置 CR0 中的协处理器仿真位 EM(位 2),并复位协处理器存在标志 MP(位 1)。movl %cr0,%eax		# check math chipandl $0x80000011,%eax	# Save PG,PE,ET
/* "orl $0x10020,%eax" here for 486 might be good */orl $2,%eax		# set MPmovl %eax,%cr0call check_x87====================>+	// 下面 fninit 和 fstsw 是数学协处理器(80287/80387)的指令。+	// finit 向协处理器发出初始化命令,它会把协处理器置于一个未受以前操作影响的已知状态,设置+	// 其控制字为默认值、清除状态字和所有浮点栈式寄存器。非等待形式的这条指令(fninit)还会让+	// 协处理器终止执行当前正在执行的任何先前的算术操作。fstsw 指令取协处理器的状态字。如果系+	// 统中存在协处理器的话,那么在执行了 fninit 指令后其状态字低字节肯定为 0。+	check_x87:+		fninit					// 向协处理器发出初始化命令+		fstsw %ax				// 取协处理器状态字到 ax 寄存器中+		cmpb $0,%al				// 初始化后状态字应该为 0,否则说明协处理器不存在+		je 1f					/* no coprocessor: have to set bits */+		movl %cr0,%eax			// 如果存在则向前跳转到标号 1 处,否则改写 cr0+		xorl $6,%eax		/* reset MP, set EM */+		movl %eax,%cr0+		ret<====================jmp after_page_tables// 分别压栈: 0, 0, 0, L6的地址, main()的地址
after_page_tables:pushl $0			# These are the parameters to main :-)pushl $0pushl $0pushl $L6			# return address for main, if it decides to.pushl $mainjmp setup_paging
L6:jmp L6			# main should never return here, but# just in case, we know what happens./* Setup_paging通过设置控制寄存器cr0的标志(PG位31)来启动对内存的分页处理功能,* 并设置各个页表项的内容,以恒等映射前 16MB 的物理内存* 尽管所有的物理地址都应该由这个子程序进行恒等映射,但只有内核页面管理函数能直接使用>1Mb 的地址 * * 在内存物理地址 0x0 处开始存放 1 页页目录表和 4 页页表。页目录表是系统所有进程公用的,* 而这里的 4 页页表则属于内核专用,它们一一映射线性地址起始 16MB 空间范围到物理内存上。* 对于新的进程,系统会在主内存区为其申请页面存放页表。另外,1 页内存长度是 4096 字节。*/
.align 2						// 按 4 字节方式对齐内存地址边界
setup_paging:					首先对 5 页内存(1 页目录 + 4 页页表)清零movl $1024*5,%ecx			/* 5 pages - pg_dir+4 page tables */xorl %eax,%eaxxorl %edi,%edi				/* pg_dir is at 0x000 */cld;rep;stosl// 设置页目录表中的项,因为我们(内核)共有 4 个页表所以只需设置 4 项// 页目录项的结构与页表中项的结构一样,4 个字节为 1 项// 如"$pg0+7"表示:0x00001007,是页目录表中的第 1 项// 第 1 个页表的属性标志 = 0x00001007 & 0x00000fff = 0x07,表示该页存在、用户可读写。movl $pg0+7,pg_dir			/* set present bit/user r/w */movl $pg1+7,pg_dir+4		/*  --------- " " --------- */movl $pg2+7,pg_dir+8		/*  --------- " " --------- */movl $pg3+7,pg_dir+12		/*  --------- " " --------- */// 填写 4 个页表中所有项的内容,共有:4(页表)*1024(项/页表)=4096 项(0 - 0xfff),也即能映射物理内存 4096*4Kb = 16Mb// 每项的内容是:当前项所映射的物理内存地址 + 该页的标志(这里均为 7)// 使用的方法是从最后一个页表的最后一项开始按倒退顺序填写。// 一个页表的最后一项在页表中的位置是 1023*4 = 4092。因此最后一页的最后一项的位置就是$pg3+4092。movl $pg3+4092,%edimovl $0xfff007,%eax				/*  16Mb - 4096 + 7 (r/w user,p) */std				// 方向位置位,edi 值递减(4 字节)
1:	stosl			/* fill pages backwards - more efficient :-) */subl $0x1000,%eaxjge 1bxorl %eax,%eax		/* pg_dir is at 0x0000 */				// 页目录表在 0x0000 处movl %eax,%cr3		/* cr3 - page directory start */		// 设置启动使用分页处理(cr0 的 PG 标志,位 31)movl %cr0,%eaxorl $0x80000000,%eax										// 添上 PG 标志movl %eax,%cr0		/* set paging (PG) bit */// 在改变分页处理标志后要求使用转移指令刷新预取指令队列,这里用的是返回指令 ret。// 该返回指令的另一个作用是将堆栈中的 main 程序的地址弹出,并开始运行/init/main.c 程序。// 本程序到此真正结束了。 ret			/* this also flushes prefetch-queue */.align 2
.word 0
idt_descr:.word 256*8-1		# idt contains 256 entries.long idt
.align 2
.word 0
gdt_descr:.word 256*8-1		# so does gdt (not that that's any.long gdt		# magic number, but it works for me :^).align 8
idt:	.fill 256,8,0		# idt is uninitializedgdt:	.quad 0x0000000000000000	/* NULL descriptor */.quad 0x00c09a0000000fff	/* 16Mb */.quad 0x00c0920000000fff	/* 16Mb */.quad 0x0000000000000000	/* TEMPORARY - don't use */.fill 252,8,0			/* space for LDT's and TSS's etc */
http://www.mnyf.cn/news/48471.html

相关文章:

  • 河南建设监理协会青岛seo推广专员
  • 正规刷手机单做任务网站必应搜索引擎国际版
  • 东营网站建设报价郑州网站优化平台
  • 文学网站模板下载指数基金是什么意思
  • 深圳福田做网站新网站推广方法
  • 设计师网站源码怎么制作自己的个人网站
  • 网站维护中 源码seo快速排名站外流量推广
  • 智慧团建网站登录电脑版谷歌google官方网站
  • 建立网站第一步是什么专门制作小程序的公司
  • 紫金网站建设图片外链生成工具在线
  • 做自己卖东西的网站网站网络推广服务
  • 看到一个电商网站帮做淘宝seo策略
  • flash做ppt的模板下载网站申请网址怎么申请的
  • 自动全屏网站模板百度手机助手官网下载
  • asp.net做网站的流程静态网页制作
  • pc端的移动端网站建设长春seo排名扣费
  • 轻松学html css网站开发游戏推广论坛
  • 动态网站特点可以推广赚钱的软件
  • 搭建网站需要什么语言网址提交百度收录
  • 山东网站制作策划站长平台
  • 网站设计基础语言不包括这些内容方法seo
  • 日照网站建设公司什么是竞价推广
  • 福州网站建设电话电商平台推广怎么做
  • 西安网站建设中心如何进行搜索引擎优化?
  • 如何在国外网站开发新客人win10系统优化软件
  • 网站做的和别人一样违法中国关键词官网
  • 美工网站设计是什么网站关键词优化软件效果
  • 做网站需不需要服务器图片百度搜索
  • 工作人员对考生进行安检工作时以下说法正确的是大侠seo外链自动群发工具
  • 国外做游戏评测的视频网站seo是做什么工作的