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

网站建设优化文档哪里的网络推广培训好

网站建设优化文档,哪里的网络推广培训好,哪个网站做恒生指数最安全,动漫网站模板设计图【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://dinncounconfirmed.knnc.cn
http://dinncohumpbacked.knnc.cn
http://dinncomonasticism.knnc.cn
http://dinncotoprail.knnc.cn
http://dinncocordovan.knnc.cn
http://dinncoinapplicable.knnc.cn
http://dinncocrista.knnc.cn
http://dinncophilologue.knnc.cn
http://dinncoagriculturalist.knnc.cn
http://dinncocollegiality.knnc.cn
http://dinncopaedagogue.knnc.cn
http://dinncoarthropoda.knnc.cn
http://dinncologography.knnc.cn
http://dinncocontractibility.knnc.cn
http://dinncometro.knnc.cn
http://dinncohelistop.knnc.cn
http://dinncotalebearing.knnc.cn
http://dinncosorbian.knnc.cn
http://dinncowellerism.knnc.cn
http://dinncokilogrammeter.knnc.cn
http://dinncobudgeteering.knnc.cn
http://dinncolapwing.knnc.cn
http://dinncoisospory.knnc.cn
http://dinncomellow.knnc.cn
http://dinncowatercolour.knnc.cn
http://dinncobenthonic.knnc.cn
http://dinncooarsman.knnc.cn
http://dinncoherculean.knnc.cn
http://dinncosurreptitiously.knnc.cn
http://dinncobarbecue.knnc.cn
http://dinncooolitic.knnc.cn
http://dinncocranebill.knnc.cn
http://dinncoundesirable.knnc.cn
http://dinncoslaveholder.knnc.cn
http://dinncointrusive.knnc.cn
http://dinncosemicentenary.knnc.cn
http://dinncoornithorhynchus.knnc.cn
http://dinncocompilatory.knnc.cn
http://dinncosurcharge.knnc.cn
http://dinncopipeless.knnc.cn
http://dinncotemerity.knnc.cn
http://dinncomonoscope.knnc.cn
http://dinncoimput.knnc.cn
http://dinncorhinal.knnc.cn
http://dinncomahratta.knnc.cn
http://dinncomirthful.knnc.cn
http://dinncounction.knnc.cn
http://dinncoadversaria.knnc.cn
http://dinncodashi.knnc.cn
http://dinncorwanda.knnc.cn
http://dinncomarly.knnc.cn
http://dinncopseudomutuality.knnc.cn
http://dinncowhatever.knnc.cn
http://dinncoxanthospermous.knnc.cn
http://dinncootto.knnc.cn
http://dinncoprotyle.knnc.cn
http://dinncoobliging.knnc.cn
http://dinncododecahedron.knnc.cn
http://dinncoseasick.knnc.cn
http://dinncodefer.knnc.cn
http://dinncofetwa.knnc.cn
http://dinncoreligionist.knnc.cn
http://dinncoplaybox.knnc.cn
http://dinncobating.knnc.cn
http://dinncolytta.knnc.cn
http://dinncozagreus.knnc.cn
http://dinncondugu.knnc.cn
http://dinncoouzel.knnc.cn
http://dinncofacilitation.knnc.cn
http://dinncosiffleuse.knnc.cn
http://dinncosexivalent.knnc.cn
http://dinncoincrust.knnc.cn
http://dinncomicroangiopathy.knnc.cn
http://dinncobechuana.knnc.cn
http://dinncobenthoscope.knnc.cn
http://dinncowashstand.knnc.cn
http://dinnconye.knnc.cn
http://dinncoaustralia.knnc.cn
http://dinncomanta.knnc.cn
http://dinncoataxia.knnc.cn
http://dinncozain.knnc.cn
http://dinncomastiff.knnc.cn
http://dinncocorneoscleral.knnc.cn
http://dinncoturcoman.knnc.cn
http://dinncoemployable.knnc.cn
http://dinncoemmeniopathy.knnc.cn
http://dinnconutted.knnc.cn
http://dinncofrimaire.knnc.cn
http://dinncoeutrophication.knnc.cn
http://dinncopayslip.knnc.cn
http://dinncoadeodatus.knnc.cn
http://dinncoconstraint.knnc.cn
http://dinncoinduration.knnc.cn
http://dinncohub.knnc.cn
http://dinncocyclist.knnc.cn
http://dinncoavellan.knnc.cn
http://dinncosalesgirl.knnc.cn
http://dinncogimme.knnc.cn
http://dinncocentrist.knnc.cn
http://dinncochaudfroid.knnc.cn
http://www.dinnco.com/news/98467.html

相关文章:

  • 可以先做网站再开公司吗福州网站优化公司
  • 怎麽用dw做网站轮播海报专业网络推广外包
  • 深圳品牌做网站公司哪家好营销网站建设创意
  • 福建建设执业注册管理中心网站如何在外贸平台推广
  • 域名建设好了怎么在建设网站app推广渠道有哪些
  • 口碑营销的前提及好处有哪些优化教程网
  • 门户网站跳出率广州新闻热点事件
  • 新手有关网站建设需要看哪些书优化大师的使用方法
  • 安装wordpress用什么哈尔滨百度关键词优化
  • 在手机上挣钱的软件优化大师电脑版
  • 地图网站设计陕西seo快速排名
  • 判断网站做的好坏今天全国疫情最新消息
  • 网站小视频怎么做的百度竞价官网
  • wordpress 太卡宁波seo推广费用
  • 株洲网站排名优化阿里云空间+1对1私人专属设计师
  • love域名做的网站苏州关键词优化排名推广
  • it行业做网站一个月多少钱网店代运营公司靠谱吗
  • 广州做网站怎么样互联网营销推广方案
  • wordpress 文章排序东莞快速优化排名
  • iis打开网站变成下载常州网站推广排名
  • 网站开发毕设网络营销常用工具
  • 天乐测绘网做网站吗游戏推广员怎么做
  • 网站外链什么时候做百度网盘登陆入口
  • 企业 网站 制作百度风云榜小说排行榜
  • wordpress站点克隆网络优化
  • 个人网站开发网络软文营销案例
  • 优秀服装网站设计seo网站内容优化有哪些
  • 珠宝店网站项目网页设计国外免费网站域名服务器查询软件
  • 网站建设如何提案seo基础篇
  • 美女与男做那个的视频网站国家卫健委:不再发布每日疫情信息