文档库 最新最全的文档下载
当前位置:文档库 › bootstrap xv6

bootstrap xv6

bootstrap xv6
bootstrap xv6

代码阅读报告——bootstrap

一、源代码中重要函数或语句及关键技术的代码分析和注释

bootasm.S:

.code16 //在实模式下运行的代码

.globl start //设定为全局函数,可以从外部进行调用

start: //首先执行的函数

cli //使硬件不能进行中断

xorw %ax,%ax //将ax寄存器初始化为零

movw %ax,%ds //初始化数据

seta20.1:

inb $0x64,%al //等待硬件空闲

movb $0xd1, %al //将0xd1输出到第0x64号I\O端口

seta20.2:

//以上代码的作用是打开A20地址线.在默认的情况下,第20根地址线一直为0,这样做的目的是为了向下兼容早期的PC.由早期的PC仅仅只是在实模式下进行寻址,这样所可能理论上可以寻到的最大地址应该是0xFFF0+0xFFFF.这看上去超过了1MB的地址空间,然而因为早期的PC 只有20根地址线,于是相当于最高位的进位时被忽略了,地址最终还是在1MB以内.所以当PC 有了32根地址线并且能够在保护模式下寻址4G的地址空间后,为了向下兼容,在默认情况下将第20根地址线一直置零,这样就可以让仅在实模式下运行的程序不会出现最高为的进位,相当于还是只有20根地址线在起作用.

lgdt gdtdesc //将GDT 表的首地址加载到GDTR

movl %cr0, %eax //将cr0寄存器的最低位置置1,

orl $CR0_PE, %eax //标志进入保护模式

movl %eax, %cr0 //

ljmp $(SEG_KCODE<<3), $start32 //跳转到32位模式,并执行32位模式的代码 .code32 //32位模式的代码

start32: //32位函数

call bootmain //调用main.c中的bootmain

spin: //无限循环,但是理论上不会返回.

jmp spin

.p2align 2 //GDT表4字节对齐

gdt:

//定义GDT表

bootmain.c:

#define SECTSIZE 512 //每个磁盘片为512字节

void readseg(uchar*, uint, uint); //函数声明

void

bootmain(void)

{

struct elfhdr *elf; //指向elf的指针

elf = (struct elfhdr*)0x10000; // 指向地址0x10000

readseg((uchar*)elf, 4096, 0); //首先读入4096字节,确保全部都读进去 if(elf‐>magic != ELF_MAGIC)

return; // 通过查看magic来确定elf是否正确组织. ph = (struct proghdr*)((uchar*)elf + elf‐>phoff); //指针指向程序头表的首地址

eph = ph + elf‐>phnum; //明确文件段的个数

for(; ph < eph; ph++) {

va = (uchar*)(ph‐>va & 0xFFFFFF); //由虚拟地址映射为物理地址

readseg(va, ph‐>filesz, ph‐>offset); //将文件的每一段读入内存中相应的位置 if(ph‐>memsz > ph‐>filesz)

stosb(va + ph‐>filesz, 0, ph‐>memsz – ph‐>filesz); //如果memsz

} //的大小大于fiesz,则将多余地址均赋为0

entry = (void(*)(void))(elf‐>entry & 0xFFFFFF); //将内核加载到内存中后转移

//到内核入口转移到内核入口地址处执行,并且不会再返回.

entry();

}

void

waitdisk(void)

{

while((inb(0x1F7) & 0xC0) != 0x40) //等待硬盘空闲,否则循环.

;

}

void

readsect(void *dst, uint offset) //读入一个磁盘分区

{

outb(0x1F2, 1); // count = 1 //把1输出到端口0x1F2

outb(0x1F3, offset); //将offset输出到0x1F3

outb(0x1F4, offset >> 8);

outb(0x1F5, offset >> 16);

outb(0x1F6, (offset >> 24) | 0xE0);

outb(0x1F7, 0x20);

// 以上为将参数输出到端口

waitdisk();

}

void

readseg(uchar* va, uint count, uint offset) //从硬盘读文件

{

uchar* eva;

eva = va + count; //找到内存中加载地址的最末端

va ‐= offset % SECTSIZE; //将链接地址转换成加载地址

offset = (offset / SECTSIZE) + 1; //将在硬盘中的偏移字节由字节数换成扇区数,

//由于内核可执行程序是从磁盘的第二扇区开始存储的,所以要加1 for(; va < eva; va += SECTSIZE, offset++)

readsect(va, offset); //一扇区一扇区的读取文件

二、操作系统启动引导的流程分析

1.PC启动时,首先进入的是实模式,并且开始执行位于地址0xFFFF0处得代码,也

就是BIOS的起始位置的代码。

2.BIOS先进行一系列的系统自检,然后初始化位于地址0的中断向量表。最后BIOS

将启动盘的第一个扇区装入到0x7C00,并开始执行此处的代码。

3.先初始化寄存器值,然后打开A20地址线。转换为保护模式,跳转执行32位代码。

4.启动保护模式数据段寄存器,初始值化寄存器。,调用bootmain函数。

5.建立elf指针,指向0x10000,读入指向地址后的4096个字节。并验证elf是否组

织良好。

6.将elf中的内核文件从磁盘中读入到内存。

7.将控制权交给内核。

三、 简答题目的简要回答

(1)仔细阅读Makefile,分析xv6.img 是如何一步一步生成的。

1.先生成bio.o console.o exec.o file.o fs.o ide.o ioapic.o kalloc.o kbd.o lapic.o

main.o mp.o picirq.o pipe.o proc.o spinlock.o string.o swtch.o syscall.o sysfile.o

sysproc.o timer.o trapasm.o trap.o uart.o vectors.o vm.o

2.定义TOOLPREFIX,并判断是否存在,如果存在侧在正确的端口中输出,不存在在

错误的端口中输出。

3.定义QEMU,并判断是否存在,如果存在侧在正确的端口中输出,不存在在错误

的端口中输出。

4.编译bootmain.c生成bootmain.o,编译bootasm.S生成bootmain.o,链接

bootmain.o ,bootasm.S生成bootblock.o,并将程序入口函数定位start,令start的

内存地址为0x7C00。将bootblock.o中的内容复制到bootblock中,并且声明不复

制重分配和符号信息。

5.编译bootother.S生成bootother.o,链接bootother.o生成bootother.out,并将程序入

口函数定位start,令start的内存地址为0x7C00。将bootother.out中的内容复制

到bootother中,并且声明不复制重分配和符号信息。

6.编译initcode.S生成initcode.o,链接initcode.o生成initcode.out,并将程序入口函数

定位start,令start的内存地址为0。将initcode.out中的内容复制到initcode中,

并且声明不复制重分配和符号信息。

7.生成tags,vectors.S,通过规则生成ulib.o usys.o printf.o umalloc.o,通过规则生成

_forktest。

8.通过mkfs.c fs.h生成mkfs。

9.将/dev/zero中的1000字节输出到xv6.img,将bootblock不间断的输出到xv6.img,

将kernel从磁盘1不间断的输出到xv6.img,生成xv6.img。

(2)xv6如何做准备(建立GDT表等进入保护模式的)

1. 初始化寄存器数据

2. 建立GDT表。

3. 将cr0寄存器的最低位置置1,标识进入保护模式

4. 跳转执行32位代码,进入保护模式。

(3) 引导程序如何读取硬盘扇区的?又是如何加载ELF 格式的OS的?

1.确定读的文件数,文件首地址和偏置后,通过 readseg(),readsect()函数读取硬盘扇

区。具体实现,见第一部分的readseg()和readsect()函数的分析。

2. 通过定义elf型的指针,指向0x10000.加载前4096个字节,并判断magic是否组织

良好,这样来加载elf的OS。

四、对本部分原理和技术的阅后心得

本部分旨在将控制权交给内核之前的引导工作。读后,对操作系统内核是怎样被加载到内存中的有了一定了解。看见了软件与硬件结合的部分,对代码的运行机制和软件与硬件的联系有了一定的了解。感觉,想要彻底的了解操作系统,还需要部分的硬件知识,感觉以后应该多修修硬件课,这样可能会对以后的软件编写有大大的益处。

《BootStrap开发技术》课程标准.doc

《bootstrap》课程标准 教研室主任: 专业带头人:系(部)主任:教务处处长: 教学副院长: 审核批准日期: 二○一七年五月

《bootstrap》课程标准 (基本信息) 课程编码: 课程类别:专业方向课程 适应专业:网页设计 开设时间:大三上期 学时数:56学时 一、课程概述 (一)课程性质 Bootstrap,来自 Twitter,是目前最受欢迎的前端框架。Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快捷。本教程将向您讲解 Bootstrap 框架的基础,通过学习这些内容,您将可以轻松地创建 Web 项目。教程被分为 Bootstrap 基本结构、Bootstrap CSS、Bootstrap 布局组件和Bootstrap 插件几个部分。每个部分都包含了与该主题相关的

简单有用的实例。 (二)课程基本理念 本课程通过企业项目开发流程为情景,学习并掌握BootStrap 开发的基础知识和基本开发技能。学生在学习本课程后具有一定的专业能力,可激发学生对后续专业课程的学习兴趣。课程结构上遵循企业 开发“流程化”、项目“兴趣化”、教学“项目实战化”、模式“前瞻化”、教材“权威化”、授课“案例化”等国内领先的IT工程师培养模式,并且结合科学的考核评价模式。通过全方位课程设计、全真的工作环境、探索研究工学结合的培养模式,提高学生职业技能,最终实现岗位无缝对接。 (三)课程的设置与设计思路 本课程立足于培养学生的动手实践能力,教学活动基本上围绕着职业导向而进行,对课程内容的选择标准进行创造性的根本改革,打破以书本知识传授为主要特征的传统学科课程模式,转变为以工作情景任务为中心组织课程内容和实施课程教学,让学生在完成具体项目的过程中发展职业能力并掌握相关理论知识,真正做到学以致用,从而发展职业能力。 本课程的框架结构,经过与企业专家系统的讨论分析,按实际需要及由简入繁的原则,最终确定了学习培养标准。最终达到掌握BootStrap主流框架的目标,本课程共80课时,其中实践50课时。

BootStrap入门教程

本作品由VentLam创作,采用知识共享署名-非商业性使用-相同方式共享2.5 中国大陆许可协议进行许可。 BootStrap入门教程(一) 2011年,twitter的“一小撮”工程师为了提高他们内部的分析和管理能力,用业余时间为他们的产品构建了一套易用、优雅、灵活、可扩展的前端工具集--BootStrap。Bootstrap由MARK OTTO和Jacob Thornton所设计和建立,在github上开源之后,迅速成为该站上最多人watch&fork的项目。大量工程师踊跃为该项目贡献代码,社区惊人地活跃,代码版本进化非常快速,官方文档质量极其高(可以说是优雅),同时涌现了许多基于Bootstrap建设的网站:界面清新、简洁;要素排版利落大方。如下图所示: https://https://www.wendangku.net/doc/224269805.html,/ http://www.fleetio.co m/

GitHub上这样介绍bootstrap:简单灵活可用于架构流行的用户界面和交互接口的html,css,javascript工具集。基于html5、css3的bootstrap,具有大量的诱人特性:友好的学习曲线,卓越的兼容性,响应式设计,12列格网,样式向导文档,自定义JQuery插件,完整的类库,基于Less等。本系列教程遵循官方文档结构来介绍bootstrap,包括手脚架(Scaffolding),基础CSS,组件,javascript插件,使用LESS与自定义.本文主要介绍Boo tstrap的基础布局--Scaffolding. Bootstrap建立了一个响应式的12列格网布局系统,它引入了fixed和fluid-with两种布局方式。我们从全局样式(Global Style),格网系统(Grid System),流式格网(Fluid grid System),自定义(Customing),布局(Layouts),响应式设计(Responsive Design)这六五个方面深入讲解Boostrap的scaffolding. 全局样式(Global Style).Bootstrap要求html5的文件类型,所以必须在每个使用bootstrap页面的开头都引用: ...

Bootstrap方法简介

Bootstrap 方法简介 1 Bootstrap 抽样方法 Bootstrap 方法是Efron 在 1977 年提出的一种数据处理方法,其本质上是对已知数据的再抽样。Bootstrap 的数学原理大致如下:1(,,)n T T T =是来自总体分布函数为()F T 的独立同分布随机样本。()n F T 是由样本T 得到的分布函数(在产品可靠性分析中,()n F T 一般是指数函数或多参数weibull 函数),由() n F T 得到的参数估计??()F θθ=,它可以作为样本参数θ的准确值。再从新总体()n F T 中抽取与样本T 相同的伪样本1(, ,)m m T T T =,一般取m n =。用伪样本m T 求出参数θ的估计值。重复操作M 次(一般取1000M =)可得到M 个基于伪样本m T 而得 到的θ估计值[4]。 Bootstrap 方法在应用中,重复抽样带来的误差不可避免。误差主要来源于样本数据的抽样误差和从样本分布中的再抽样误差。对于再抽样误差,只要 Bootstrap 再抽样样本数充分大,由样本分布所得的再抽样误差就会趋于消失,Bootstrap 估计的所有误差就会接近于抽样误差[5] 。Bootstrap 方法根据抽样方式的不同可分为参数和非参数两种。非参数方法主要用于在不知道抽样函数服从什么分布情况下,对经验分布不做过多的假设,把试验数据按从小到大排序获得经验分布,然后从中抽取伪样本的一种方法;参数方法主要用于经验分布已知情况下,当试验数据分布明确时,运用参数方法比运用非参数方法效率更高[6]。 由于多方面的原因,使得收集到的故障间隔时间数据中常含有分离群数据,这些数据会导致估计精度降低。但是,对于高可靠度的现代机电产品来说收集到的每一个数据都来之不易,所以不易轻易舍去。因此,可以应用改进的参数 Bootstrap 方法,具体过程如下: (1) 将试验样本数据12(,, ,)n X X X X =从小到大排序,每次从中去掉一个样本 i X ,剩下1n -个样本用传统方法建模,得出样本分布函数(1)()n i F T -的估计参 数值?m 和?η。 (2) 重复(1)n 次,获得参数?i m 和?i η,取其均值11??n i i m m n ==∑和1 1??n i i n n n ==∑作为经 验分布()n F T 的尺度和形状参数。 (3) 再从经验分布中随机抽取Bootstrap 样本,伪样本容量与原样本容量相等, 共抽取1000组(一般抽取200组就可以获得较高精度)。 (4) 根据每组伪样本****12(,,,)i n X X X X =用传统方法建模,得到1000个?m 和?η。 通过上述Bootstrap 方法我们可以获得多次经验分布参数,减少了抽样误差,比一次计算获得的经验分布更具有说服力。

bootstrap中文手册指南

Bootstrap简易指南 看完使用手册后所作的笔记,可以当做简易使用指南使用。 1.框架 1.1全局样式 使用HTML5的doctype,scaffolding.less中定义全局样式,从2开始使用normalize.css,并使用reset.less进行简化 1.2默认栅格系统 940px宽12列栅格,使用row与span[NUM]的class来控制,使用offset[NUM]来控制偏移,于non-fluid可以直接嵌套,提供了四种响应式方案 1.3流动栅格系统 基于百分比,将row改为row-fluid即可使用,内嵌注意宽度是按照父列的百分比进行计算的 1.4自定义栅格 于variables.css中改变变量,默认列12,宽60px,间隔20px,要保证响应性还得修改responsive.less中内容 1.5布局 container为940px居中,container-fluid则为流体布局 1.6 响应式设计 responsive.less中提供了一组media query:

智能手机《=480px;流式列,非固定宽度 垂直平板《=767px;流式列,非固定宽度 水平平板》=768px;42px 20px 默认》=980px;? ? ?60px ?20px 大分辨率》=1200px;70px 30px 要求添加meta标签, 有诸如.visible-phone等支持类 2.基础CSS 2.1 排版 整个排版单位基于variables.less中@baseFontSize与@baseLineHeight两个变量; 强调:string加粗,em倾斜,abbr缩写【title属性存放显示信息,.initialism会减小缩略词字体】,address【使用br换行】 引用:blockquote【cite属性存放来源URL,.pull-left或right决定内容居左右】,small用于引言作者【会在内容前加入破折号】 列表:ul无序号有黑点,ul.unstyled无样式,ol有数字序号,dl描述,dl.dl-horizontal水平描述 2.2代码 code行级代码,pre块级【<>需要转义,.pre-scrollable可以设置350px最大高度】,应用.prettyprint和.linenums来美化代码【使用google prettify】

BootStrap开发技术课程标准.doc

v1.0可编辑可修改《b ootstrap 》课程标准 教研室主任: 专业带头人: 系 ( 部) 主任: 教务处处长: 教学副院长: 审核批准日期: 二○一七年五月 《 bootstrap》课程标准 (基本信息)

v1.0可编辑可修改 课程编码: 课程类别:专业方向课程 适应专业:网页设计 开设时间:大三上期 学时数: 56 学时 一、课程概述 (一)课程性质 Bootstrap ,来自 Twitter ,是目前最受欢迎的前端框架。 Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架。 Bootstrap 是基于HTML、CSS、JAVASCRIPT的,它简洁灵活,使得 Web 开发更加快捷。本教程将向您讲解 Bootstrap 框架的基础,通过学习这些内容,您将可以轻松地创建 Web 项目。教程被分为 Bootstrap 基本结构、Bootstrap CSS、Bootstrap 布局组件和 Bootstrap 插件几个部分。每个部分都包含了与该主题相关的简单有用的实例。 (二)课程基本理念 本课程通过企业项目开发流程为情景,学习并掌握 BootStrap 开发的基础知识和基本开发技能。学生在学习本课程后具有一定的专业能力,可激发学生对后续专业课程的学习兴趣。课程结构上遵循企业开发“流程化”、项目“兴趣化”、教学“项目实战化” 、模式“前瞻化” 、教材“权威化”、授课“案例化”等国内领先的 IT 工程师培养模式,并且结合科学的考核评价模式。通过全方位课程设计、全真的工作环境、探索研究工学结合的培养模式,提高学生职业技能,最终实现岗位无缝对接。 (三)课程的设置与设计思路 本课程立足于培养学生的动手实践能力,教学活动基本上围绕着

bootstrap2和bootstrap3的用法区别概述(一)

bootstrap2和bootstrap3的用法区别概述(一) 一、表格中 1. 3增加了响应式表格为

外层div添加.table-responsive类,如果屏幕很窄此时表格会出现横向滚动条 二、表单中 1. 3中
表格头
表格内容

BootStrap入门教程==

Bootstrap组件丰富同时具有良好可扩展性,能够很好地应用在生产环境。这些组件包括按钮(Button),导航(Navigation),缩略图( thumbnails),提醒(Alert),进度条(progress bar)等,能够很好减少前端工程师的代码量,实现更加丰富充实的页面。 Bootstrap作为一套良好的前端工具,要实现现代的动态页面效果,javascript插件是必不可少的。它提供了12个基于JQuery类库的插件,包括模态窗口(Modals),滚动监控(Scrollspy),标签效果(Tabs),提示效果(Tooltip),“泡芙”效果(popovers),警告区域(Alerts),折叠效果(Collapse),旋转木马(carousel),输入提示(typeahead)等.这些内容会分作两讲来阐述,本讲将深入讲解modals等插件。在bootstrap中所有涉及动画效果的javascript插件,都必须先引用Transitions JS,包括modals,alerts等来实现淡出效果。 1.模态窗口 (Modals) 模态窗口是指除非采取有效的关闭手段,用户的鼠标焦点或者输入光标将一直停留在其上的窗口(对话框).Bootstrap对于模态窗口的实现十分精简灵活,用户只需要使用少量的代码和智能的默认设置,即能实现传统实现传统的Javascript效果的模态窗口。默认的Bootstrap模态窗口效果,包括对话框从屏幕上方落下,屏幕其他区域变暗淡,模态窗口的隐藏等。这些效果分别对应.modal .fade .hide 这些类。我们可以不用写任何javascript代码来实现Modal效果,只需要将data-toggle="modal"放置于在触发控制要素(如按钮,超链接等),并指定它的Modal窗口的ID链接(data-target="#mymodal",href="#mymodal")。当这些控制要素被触发的时候,modal窗口就会出现了。模式窗口的内容可以非常丰富,这些内容都需要包括在modal的div内,并可以定义modal窗口的头部,内容和脚部。 如果使用Jquery调用Modal,也只需要一行javascript代码, $('#myModal').modal(options) 该选项包括backdrop,keyboard,show三项,主要控制模态窗口的动作。Modal的方法主要包括show,hide,toogle等,主要用于模态窗口的状态控制。Modal的触发事件包括shown,hiden等,主要用于控制模态窗口的功能触发控制。具体效果可以到官方文档的该处尝试一下,点击Launch demo modal按钮即可。Modal的实现如图4-1所示:

Bootstrap笔试题

一、单选题(针对以下题目,请选择最符合题目要求的答案。针对每一道题目,所有答案都选对,则该题得分,所选答案错误或不能选出所有答案,则该题不得分。每题2.5分,共80分。) 1. Bootstrap 插件全部依赖是() A.JavaScript B.JQuery C.Angular JS D.Node JS 2. 栅格系统小屏幕使用的类前缀是() A. .col-xs- B. .col-sm- C. .col-md- D. .col-lg- 3. 如下代码中,想要在超小屏幕和小屏幕显示两列,在中屏幕和大屏幕显示三列,三个div的class正确的写法是()

item1
item2
item3
A. col-sm-6 col-md-4,col-sm-6 col-md-4,col-sm-6 col-md-4 B. col-sm-6 col-lg-4,col-sm-6 col-lg-4,col-sm-6 col-lg-4 C. col-xs-6 col-lg-4,col-xs-6 col-lg-4,col-xs-6 col-lg-4

D. col-xs-6 col-md-4,col-xs-6 col-md-4,col-xs-6 col-md-4 4. 下面可以实现列偏移的类是() A..col-md-offset-* B. .col-md-push-* C. .col-md-pull-* D. .col-md-move-* 5.表单元素要加上什么类,才能给表单添加圆角属性,和阴影效果() A.form-group B.form-horizontal C.form-inline D. form-control 6.img-responsive类可以让图片支持响应式布局,它的实现原理是() A.设置了max-width: 100%;和height: auto; B. 设置了max-width: 100%; 和height: 100%; C. 设置了width: auto; 和max-height: 100%; D. 设置了width: auto; 和height: auto; 7.输入框组想加上图标,可以实现对表单控件的扩展的类是() A. .input-group-btn B. .input-group-addon C. form-control D. input-group-extra 8. 标签页垂直方向堆叠排列,需要添加的类() A.nav-vertical B.nav-tabs C.nav-pills D.nav-stacked 9. 可以把导航固定在顶部的类是() A.navbar-fixed-top

相关文档
相关文档 最新文档