第3章的附录 系统引导程序的代码

合集下载

DBR引导代码分析_XP_FAT32

DBR引导代码分析_XP_FAT32

DBR引导代码分析_XP_FAT32整理:太虚野老WINDOWS XP FAT32引导代码共由两部分组成:0柱面,1磁头,1扇区和0柱面,1磁头,13扇区。

用WinHex读0柱面,1磁头,1扇区,如下:图中3个用红色矩形框框住的是3个字符串(NTLDR is missing、Disk error、Press any key to restart)的地址相关的,分别是0x1AC、0x1BF、0x1CC。

每个字符串都以0D 0A开始,其中0D 新行,0A 回车。

蓝色矩形框框住的11个字节是NTLDR文件名,在第13扇区加载NTLDR文件时使用。

引导代码从5A开始,前90个字节为跳转指令和BPB(BIOS参数块)。

用IDA Pro反汇编后如下(包括分析):;//本扇区引导代码的作用是加载第13扇区的XP引导代码seg000:005A 33 C9 xor cx, cx ;//cx寄存器清0seg000:005C 8E D1 mov ss, cx ;//栈寄存器ss=0seg000:005E BC F4 7B mov sp, 7BF4h ;//栈指针SP=7BF4seg000:0061 8E C1 mov es, cx ;//附加数据段寄存器es=0 seg000:0063 8E D9 mov ds, cx ;//数据段寄存器ds=0seg000:0065 BD 00 7C mov bp, 7C00h ;//DBR起始偏移seg000:0068 88 4E 02 mov [bp+2], cl ;//设置标志为0,该标志用于判断是否已经加载过XP引导代码的第一个扇区。

该标志在XP引导代码存在两个以上扇区时发挥作用。

本文XP引导代码只存在一个扇区,所以该标志没有作用。

seg000:006B 8A 56 40 mov dl, [bp+40h] ;//设置驱动器号为80(00H~7FH:软盘;80H~0FFH:硬盘)seg000:006E B4 08 mov ah, 8seg000:0070 CD 13 int 13hseg000:0072 73 05 jnb short loc_10079 ;//读取成功就跳转seg000:0074 B9 FF FF mov cx, 0FFFFhseg000:0077 8A F1 mov dh, cl ;//读取失败后将dh寄存器设置为FF,在后面的加1后,使磁头数为0,从而使计算出来的CHS方式所能访问的最大逻辑扇区号为0,从而直接采用LBA方式寻址。

MAX32663安全引导程序应用程序内部编程指南说明书

MAX32663安全引导程序应用程序内部编程指南说明书

MAX32663 Secure BootloaderIn-Application Programmingwith Python® User GuideAbstractThis guide describes how to securely update application firmware via the MAX32663 Secure Bootloader and a Python host. The protocol details for the MAX32663 Secure Bootloader can be found in the MAX32663 Secure Bootloader User's Guide.Table of ContentsIntroduction (3)MAX32630FTHR (3)MAX32630FTHR I2C Pin Connections (4)Host Software (4)Installing the OpenSSL Library (6)Installing Python (10)In-Application Programming with Python (11)Revision History (13)IntroductionThe MAX32663 Secure Bootloader provides an I2C interface that facilitates the transfer of a keyed and encrypted firmware image from an I2C host to the internal flash. This document describes one method of using this interface to securely program a firmware image using the MAX32630FTHR and Python-based software running on a Windows PC Host.MAX32630FTHRThe I2C bootloader interface on the MAX32663 can be mastered by any host I2C-capable micro and user firmware. The bootloader protocol is detailed in the MAX32663 Secure Bootloader User's Guide. However, for development and production, it is desirable that the preprogrammed MAX32630FTHR is included in the MAX30003WING2# evaluation kit.The MAX32630FTHR contained in the MAX30003WING2# evaluation kit is used to program the MAX32663 on the kit's main PCB. The MAX32630FTHR can be removed from the main PCB and wired directly to the user's product. Note that the MAX32630FTHR is referenced to V DD = 3.3V. Targets referenced differently require voltage translation.MAX32630FTHR I2C Pin ConnectionsThe MAX32630FTHR is connected to the target system as follows:The target system must supply the power and not the MAX32630FTHR.Host SoftwareThe host software uses Python. Several software prerequisites are required to run the Python script on WindowsUse the following steps to download and install Microsoft Visual C++ Runtime:1.Visit the download link here. Click Download.2.Select vcredist_x86.exe. Select Next.4.Read and click to agree to the terms. Select Install.5.Close the installation application.Installing the OpenSSL LibraryUse the following steps to download and install the OpenSSL Library:1.Visit the OpenSSL downloads page here.2.Select Win32 OpenSSL v1.1.10L Light.4.Read and click to agree to the terms. Select Next.5.Leave the destination location default. Click Next.6.Leave The Windows system directory. Click Next.7.Click Install.8.Click Finish when the installation is complete.Installing PythonUse the following steps to download and install Python:1.Download and install Python2.7.13 here.2.Install pip and add python to the path during installation.3.Type DOS in the Windows search box and select the Command Prompt.4.Add the Python components by typing the following in the DOS prompt:a.pip install PySerial>=2.7b.pip install colorama>=0.3.3c.pip install enum34>=1.1.6In-Application Programming with PythonThe bootloader requires a specific firmware image, which is provided and signed by the algorithm vendor. The signed firmware images have an msbl file extension. The msbl file is found along with other supporting software, including the download_fw_over_host.py python script, on the MAX32663 product page on the Design Resources tab.Use the following steps to flash the application to the MAX32663:Enter the following commands in the command prompt or in the PowerShell window, replacing COMxx with the COM port of the connected MAX32630FTHR. Replace FIRMWARE with the name of the encrypted firmware file provided by the algorithm vendor.python ./download_fw_over_host.py -f "FIRMWARE.msbl" -p "COMxx" -d 2The COM port of the MAX32630FTHR is found by examining the Ports (COM & LPT) while hot plugging the MAX32630FTHR's USB connection to the host Windows PC. For example, the USB Serial Device (COM4)in the following image disappears when the MAX32630FTHR is disconnected from the PC and reappears when it is reconnected. The COM port number, four in this case, is likely to be different on each machine.Trademarks ListMicrosoft is a registered trademark and registered service mark of Microsoft Corporation. Windows is a registered trademark and registered service mark of Microsoft Corporation.©2020 by Maxim Integrated Products, Inc. All rights reserved. Information in this publication concerning the devices, applications, or technology described is intended to suggest possible uses and may be superseded. MAXIM INTEGRATED PRODUCTS, INC. DOES NOT ASSUME LIABILITY FOR OR PROVIDE A REPRESENTATION OF ACCURACY OF THE INFORMATION, DEVICES, OR TECHNOLOGY DESCRIBED IN THIS DOCUMENT. MAXIM ALSO DOES NOT ASSUME LIABILITY FOR INTELLECTUAL PROPERTY INFRINGEMENT RELATED IN ANY MANNER TO USE OF INFORMATION, DEVICES, OR TECHNOLOGY DESCRIBED HEREIN OR OTHERWISE. The information contained within this document has been verified according to the general principles of electrical and mechanical engineering or registered trademarks of Maxim Integrated Products, Inc. All other product or service names are the property of their respective owners.。

ADVISOR2002 help 第三章中文使用说明

ADVISOR2002 help 第三章中文使用说明

3.1 ADVISOR的文件结构3.1.1ADVISOR文件系统的数据流如上图所示。

图中有四种主要的代表类型:z输入脚本文件定义工作空间的变量或者调用其它输入脚本文件,如MC_PM32.M;z模块图表有一些Simulink文件组成。

这些文件含有许多根据输入(如发动机特性图)计算输出(如燃油经济性)的方程;它们都是一些模型,如BD_PAR.M.;z输出脚本文件通过搜索工作空间对模型输出作一些后续处理,包括一些画图程序和一些错误检查程序,如chkoutputs.m。

z控制脚本文件既生成输入,也对输出作一些处理。

例如ADVISOR图形用户界面(GUI)和优化程序。

3.1.2 文件位置ADVISOR根目录下(如 c:\ADVISOR 或 c:\Program Files\ADVISOR)有一些子目录;这些子目录下是含有相应文件的数据、图形用户界面和模型子目录。

3.1.3 文件命名规则模型和数据文件的命名都采用一个前缀加一下划线(’_’)且使用的前缀几乎和定义的变量使用的前缀是一样的。

而在模块图里这一前缀放在尖括号(<>)内。

以下是ADVISOR部件文件类型:变量名称前缀代表的文件类型ACC_*.M附件负载文件CYC_*.M驱动循环文件。

定义变量时以cyc_开头;在模块图里则以<cyc>作为标示;ESS_*.M能量存储系统数据文件。

同样在定义变量时以ess_开头;在模块图里则以<ess>作为标示;EX_*.M排放后处理文件(如催化剂等);FC_*.M燃料转换器数据文件;TX_*.M传动系数据文件,包括变速箱(gb)和主减速器(fd);GC_*.M发电机/控制器数据文件;MC_*.M电机/控制器数据文件;PTC_*.M 传动系控制数据文件。

在定义发动机控制、离合器控制和混合控制策略变量时以vc_和cs_开头;而在模块图中则分别以<vc>和<cs>标示;TC_*.M 扭矩合成装置数据文件;VEH_*.M 整车数据文件;WH_*.M车轮/车轴数据文件;除了上述部件数据文件外,还有另一种类型文件也用前缀定义:BD_*.M-----代表Simulink模块图(模型);所有带前缀文件名用大写字母,而变量名则全部采用小写字母,以免相互混淆。

引导程序

引导程序
SetStack
BL InitStack
BL InitGPIO B main
• • • • • •
ALIGN InitMem LDR R11, =MDCNFG LDR R1, =init_MDCNFG STR R1, [R11]
• •
• • • • • • • • • • • • •
NOP NOP
Undefined_Handler B Undefined_Handler SWI_Handler B SWI_Handler Prefetch_Handler B Prefetch_Handler
DataAbort_Handler B DataAbort_Handler
IRQ_Handler B IRQ_Handler FIQ_Handler B FIQ_Handler
Boot.s
AREA boot ,CODE ,READONLY ENTRY B Reset_Handler B Undefined_Handler B SWI_Handler B Prefetch_Handler B DataAbort_Handler NOP B IRQ_Handler B FIQ_Handler
LDR R11, =MDREFR LDR R1, =init_MDREFR STR R1,[R11] NOP NOP
LDR R11, =MDMRS LDR R1, =init_MDMRS STR R1, [R11]
NOP NOP MOV PC,LR
ALIGN InitStack ;Set IRQ mode(IRQ) MSR CPSR_c, #0xd2; _c控制位域PAR[7:0] LDR SP, =StackIrq ;Set FIQ mode(FIQ) MSR CPSR_c, #0xd1 LDR SP, =StackFiq ;Set Abort mode(ABT) MSR CPSR_c, #0xd7 LDR SP, =StackAbt ;Set Undefine mode(UND) MSR CPSR_c, #0xdb LDR SP, =StackUnd ;Set User/System mode(USR) MSR CPSR_c, #0xdf LDR SP, =StackUsr ;Set Supervisor mode(SVC) MSR CPSR_c, #0xd3 LDR SP, =StackSvc MOV PC,LR END

引导程序

引导程序

引导程序1:概述计算机在开始启动的时候,首先运行BIOS程序,BIOS程序检测当前硬件。

完成后,根据CMOS中的关于驱动器启动顺序的设置,找到一个可用的驱动器来启动。

这里的驱动器包括软盘、光盘、硬盘等设备,但是为了简化问题,下面只讨论软盘驱动器或者硬盘驱动器的启动。

在软盘(硬盘)启动的过程中,最先是BOIS将软盘的首扇区(也就是0柱面,0头、1扇区)的512个字节的内容读到内存的7C00H的地方,然后CPU跳到7C00H(CS:IP=0000:7C00H?)处运行。

由于只有512个字节的大小,不可能放下一个操作系统的代码。

因此,这512个字节的代码一般是一个过渡性的代码,它主要由读软盘扇区指令构成,用来实现这样的一个功能:将操作系统的代码都读到内存中去,读完后再通过JMP指令跳到操作系统代码的入口地址,进一步运行程序。

习惯上,我们把保存在首扇区中的程序称为引导程序。

虽说引导程序一般是用来实现操作系统的引导的,的是但这并不是必要的;它可以是任何形式的代码,只要符合的一个条件:代码对应的机器代码不超过512个字节。

下面的引导程序演示代码就没有任何的读软盘指令,它只是不断的循环一个过程:接受并显示字符。

在最后,交代一下程序的运行软件环境:程序在XP编写、编译,在虚拟机下测试。

2:引导程序演示代码2.1演示代码BOOT.ASM.MODEL SMALL ;这个可以不用管CODE SEGMENTASSUME CS:CODE,DS:CODE ; 数据段和代码段混合在一起了ORG 7C00HSTART: JMP START1INFO DB 'A:\',0 ;提示信息STR1 DB 80 DUP (0) ;接受键盘输入缓冲区START1:MOV AX,CODEMOV DS,AX;设置光标的位置,在屏幕的最后一行,屏幕行号范围0—24,列号范围0-79MOV DH,24 ;行号MOV DL,0 ;列号MOV AH,2 ;子功能号INT 10HL1: MOV SI,OFFSET INFOCALL DISP_STR ;显示提示信息CALL GET_STR ;输入字符串,以回车结束输入CALL CRLF ;换行MOV SI,OFFSET STR1CALL DISP_STR ;输出刚才从键盘中接受到的字符串CALL CRLFMOV SI,OFFSET STR1CMP BYTE PTR [SI],0 ;如果直接回车,那么就退出程序JZ EXITJMP L1EXIT:MOV AH,4CHINT 21HDISP_STR PROC ;显示字符串CLD ;设置DF=0,给后面的串指令用.WHILE BYTE PTR [SI] != 0 ;.while是汇编伪指令,功能和高级语言的while一样LODSBMOV AH,0EH ;输出字符INT 10H.ENDWRETDISP_STR ENDPCRLF PROC ;实现回车功能;屏幕上卷一行MOV CH,0MOV CL,0MOV DH,24MOV DL,79MOV AL,1MOV AH,06HMOV BH,7INT 10H;获得光标位置MOV BH,0MOV AH,3INT 10H;设置光标位置MOV BH,0MOV DL,0MOV AH,02HINT 10HRETCRLF ENDPGET_STR PROC ;从键盘输入字符串MOV SI,OFFSET STR1GETS: MOV AH,0INT 16H.IF AL != 0DH ;如果输入的字符不是回车,就显示字符,并继续输入MOV [SI],ALINC SIMOV AH,0EHINT 10HJMP GETS.ENDIFMOV [SI],0RETGET_STR ENDPCODE ENDSEND START2.2说明1)我们首先将上面的BOOT.ASM文件编译、连接为BOOT.EXE文件。

启动软盘引导程序源代码

启动软盘引导程序源代码
; in the correct place.
main :
cli ; Stop interrupts till stack ok
xor AX , AX
mov ds , ax
mov es , ax
mov SS , AX ; Work in stack just below this routine
启动软盘引导程序源代码
启动软盘引导程序源代码
作者:易华卫 来源:易老师的个人网站 加入时间:2005-09-06 01:09:19 下面是软盘引导程序源代码,用NASM编译。目前性能基本上稳定了,代码长度已经到了512BYTE,一扇区用完了。 ; ==========================================================================
; E9H xxH 00H jmp Key_F7
;
; Case Default: Show message and wait 8 second
mov ah , 11 h ; Get keyboard status
; 这是一个用来引导我的系统备份/恢复光盘的启动软盘的程序,将会放在软盘的第一
; 个扇区内。此程序引导系统时,出现一个提示,用户可选择按任意键启动工具软盘,
; 也可以在等待8秒后引导硬盘上的操作系统。在选择由工具软盘启动DOS后,在MBR中
; 隐藏的FAT32主分区(0B/0C)将会分配盘符变得可见,这就可以用常规工具来做备
BIO_MEM EQU 0413 H ; BIOS Memory size =640(KB)
BIO_CLK EQU 046 CH ; BIOS Clock (1/18.2 seconds)

bootloader的编写

bootloader的编写

bootloader的编写
编写一个bootloader是一个复杂的任务,需要了解计算机架构
和操作系统的启动过程。

以下是编写一个简单的x86 bootloader的基本步骤:
1. 确定引导扇区的位置:在硬盘的第一个扇区(通常是0号扇区)创建一个引导扇区。

这个扇区需要包含一个主引导记录(Master Boot Record,MBR),以便计算机可以正确地引导。

2. 编写MBR代码:MBR是引导扇区中的第一扇区,它包含
了启动计算机所需的你的代码。

MBR的大小为512字节,所
以你的代码必须小于或等于512字节。

3. 使用汇编语言:编写x86汇编语言代码来实现MBR的功能。

你需要了解x86指令集和寄存器的使用。

确保你的代码具有正确的引导标志,并设置正确的启动设备。

4. 编写启动代码:启动代码是你的汇编代码的一部分,它是在MBR中执行的。

启动代码负责加载进一步的代码和操作系统。

这段代码通常位于MBR的末尾,并将控制转移到加载的代码。

5. 加载操作系统:启动代码负责从硬盘上加载操作系统的剩余部分,然后将控制权交给操作系统。

需要注意的是,编写一个完整的、功能完备的bootloader涉及
到更多的细节和复杂性,包括读取硬盘、文件系统的支持、加
载器链等。

上述步骤仅为编写一个最基本的x86 bootloader提供了一个概览。

第3章通用BIOS设置

第3章通用BIOS设置

用户说明书AMD Socket AM2(940-pin)处理器nVidia MCP78主板商标所有的产品注册商标及公司名称皆属其公司所有产品内容若有更改,恕不另行通知V1.0 中文版 2008年9月MUNF7808912B01常用除错卡代码表以下列出一些常见的自检代码,对一些可能出现的问题以及解决方式的列表,如果想了解更多的关于自检代码的信息,请参考本说明书后面的附录。

目录第1章配件 (1)1-1 包装内容 (1)1-2 主板介绍 (2)1-3 主板规格 (3)1-4 系统模块图 (6)第2章安装 (7)2-1 CPU安装 (7)2-2 跳线设置 (8)2-3 系统内存 (9)2-4 背部I/O接口 (10)2-5 主板内部接口介绍 (10)第3章常用BIOS设置 (14)3-1 主菜单 (14)3-2 标准CMOS设置 (14)3-3 BIOS高级属性设置 (15)3-4 芯片组高级属性设置 (17)3-5 集成的周边设备设置 (18)3-6 电源管理设置 (23)3-7 PNP/PCI配置设定 (24)3-8 系统状态侦测设置 (25)3-9 Q-Tune Bios超频功能设置 (27)3-10 默认菜单 (29)3-11 超级用户/用户密码设定 (30)3-12 退出BIOS (30)第4章驱动以及应用程序 (31)第5章常见问题解答 (32)第6章 BIOS刷新 (33)附录:磐正超磐手主板保修条例 (35)1-1包装内容内容 可选设备 A.主板 G.软驱数据线B.用户说明书 H.额外的USB2.0扩展端口连接C.CD I. 探温头D.I/O 挡板E.SATA II 数据线F.硬盘数据线A注:若您的包装内物品有任何的损坏或短缺情形,请与经销商联络。

E DH I CD1-2主板介绍●Socket AM2/AM2+Socket AM2/AM2+(940针)是AMD 高性能的Athlon AM2/AM2+处理器的接口,让用户体验到高效性能的执行能力。

系统引导过程简介

系统引导过程简介

系统引导过程简介一、系统引导过程简介系统引导过程主要由以下几个步骤组成(以硬盘启动为例)1、开机;2、BIOS加电自检(POST---Power On Self Test),内存地址为0fff:0000;3、将硬盘第一个扇区(0头0道1扇区,也就是Boot Sector)读入内存地址0000:7c00处;4、检查(WORD)0000:7dfe是否等于0xaa55.若不等于则转去尝试其他介质;如果没有其他启动介质,则显示”No ROM BASIC”,然后死机;5、跳转到0000:7c00处执行MBR中的程序;6、MBR先将自己复制到0000:0600处,然后继续执行;7、在主分区表中搜索标志为活动的分区.如果发现没有活动分区或者不止一个活动分区,则停止;8、将活动分区的第一个扇区读入内存地址0000:7c00处;9、检查(WORD)0000:7dfe是否等于0xaa55,若不等于则显示“Missing Operating System”,然后停止,或尝试软盘启动;10、跳转到0000:7c00处继续执行特定系统的启动程序;11、启动系统.以上步骤中(2),(3),(4),(5)步由BIOS的引导程序完成;(6),(7),(8),(9),(10)步由MBR中的引导程序完成.一般多系统引导程序(如Smart Boot Manager, BootStar, PQBoot等)都是将标准主引导记录替换成自己的引导程序,在运行系统启动程序之前让用户选择想要启动的分区.而某些系统自带的多系统引导程序(如LILO,NT Loader等)则可以将自己的引导程序放在系统所处分区的第一个扇区中,在Linux中即为两个扇区的SuperBlock.注:以上步骤中使用的是标准的MBR,多系统引导程序的引导过程与此不同.二、硬盘结构及参数3D参数(Disk Geometry):CHS(Cylinder/Head/Sector)C-Cylinder柱面数表示硬盘每面盘片上有几条磁道,最大为1024(用10个二进制位存储);H-Head磁头数表示硬盘总共有几个磁头,也就是几面盘片,最大为256(用8个二进制位存储);S-Sector扇区数表示每条磁道上有几个扇区,最大为63(用6个二进制位存储).1、引导扇区Boot Sector组成Boot Sector 也就是硬盘的第一个扇区,它由MBR(Master Boot Record), DPT(Disk Partition Table) 和Boot Record ID三部分组成. MBR又称为主引导记录,占用Boot Sector的前446个字节(0~0x1BD),存放系统主引导程序(它负责从活动分区中装载并且运行系统引导程序). DPT即主分区表占用64个字节(0x1BE~0x1FD),记录磁盘的基本分区信息.主分区表分为四个分区项,每项16个字节,分别记录每个主分区的信息(因此最多可以有四个主分区). Boot Record ID即引导区标记占用两个字节(0x1FE~0x1FF),对于合法引导区,它等于0xaa55,这是判别引导区是否合法的标志). Boot Secor具体结构如图:2、分区表结构简介分区表由四个分区项构成,每一项结构如下:BYTE State:分区状态,0=未激活,0x80=激活(注意此项);BYTE StartHead:分区起始磁头号;WORD StartSC:分区起始扇区和柱面号,底字节的底6位为扇区号,高2位为柱面号的第9,10位,高字节为柱面号的低8位;BYTE Type:分区类型,如0x0B=FAT32,0x83=Linux等,00表示此项未用;BYTE EndHead:分区结束磁头号;WORD EndSC:分区结束扇区和柱面号,定义同前;DWORD Relative:在线性寻址方式下的分区相对扇区地址(对于基本分区即为绝对地址);DWORD Sectors:分区大小(总扇区数).在DOS或Windows系统下,基本分区必须以柱面为单位划分(Sectors*Heads个扇区),如对于CHS为764/256/63的硬盘,分区的最小尺寸为256*63*512/1048576=7.875MB.由于硬盘的第一个扇区已经被引导扇区占用,所以一般来说,硬盘的第一个磁道(0头0道)的其余62个扇区是不会被分区占用的.某些分区软件甚至将第一个柱面全部空出来.扩展分区结构如图:硬件不同了3D 参数(Disk Geometry):CHS(Cylinder/Head/Sector) C-Cylinder柱面数表示硬盘每面盘片上有几条磁道,最大为1024(用10个二进制位存储);H-Head磁头数表示硬盘总共有几个磁头,也就是几面盘片,最大为256(用8个二进制位存储);S-Sector 扇区数表示每条磁道上有几个扇区,最大为63(用6个二进制位存储).应该注明以上是以前的磁盘结构。

MBR引导代码详解

MBR引导代码详解

MBR引导代码详解MBR主引导扇区前139个字节引导代码详解1(前27字节,作用:复制)默认分类 2009-12-01 14:50:48 阅读127 评论0 字号:大中小订阅MBR在系统启动时自动加载到0000:7c00处,为512个字节.下面这段代码实现把0000:7c1b处MBR代码复制485个字节到0000:061b处,为什么不从0000:7c00开始复制512个到0000:0600处,因为前面1b 个字节为复制代码,所以忽略.空出的0000:7c00开始的空间将读入活动分区的操作系统的引导家扇区.0000 xor ax,ax '置ax为00002 mov ss,ax '把堆栈代寄存器置为00000004 mov sp,7c00 '把堆栈指令置为7c00,把以堆栈指向0000:7c00,0007 sti '中断使能0008 push ax '这条PUSH指令在0008处,前面的8个字节指令已经执行,所以push指令输入的数据覆盖前面的0000-0001空间,没有关系.这条PUSH ax指令与下面一条指令一起是把es置为0,es用于movsb指令,'REP MOVSB (同repz movsb)的作用是重复CX次将[DS:SI]中字节传送到[ES:DI]中。

SI、DI加或减1由DF确定,DF=0,加。

REP使CX减1,到0后结束传送。

所以REP MOVSB 指令与CX、SI、DI、ES、DS寄存器和Flag的DF位设置有关。

0009 pop es000a push ax '作用同上000b pop ds000c cld '使方向标志寄存器DF=0000D mov si, 7c1b '用于movsb0010 mov di, 061b '用于movsb ,将[DS:SI]中字节传送到[ES:DI]中0013 push ax '保存ax,di,用于第001a处指令retf(同ret),使ax->cs,di->ip,实现指令跳转0014 push di0015 mov cx,01e5 '用于repz movsb中的repz,每次cx减1,到0不执行movsb,为485,除去复制代码27个字节,即复制001B开始的代码0018 repz0019 movsb '复制字节001a retfMBR主引导扇区前139个字节引导代码详解2默认分类 2009-12-01 19:15:58 阅读55 评论0 字号:大中小订阅(第28到第76字节,共49个字节,作用:判断是否是活动分区,是否是非活动分区),一个扇区是512个字节,所以MBR主引导扇区也是512个字节,最后两个字节是55 AA,是表示结束的字节.而次后64个字节是硬盘分区表字节,每16个字节代表一个分区表项,所以最多有4项分区表项(如最多分为C,D,E,F盘),如果分区个数多于4个,则用虚拟MBR技术,即在MBR 扇区的分区表中用2项就行,第一项分区表为主分区C盘,第2项分区表为扩展分区,它指向这项中磁头,扇区,柱面3维地址所指向的扇区(为第二个分区的第一个扇区,如D),在这个扇区中的分区表项也只有2项,第一项是这个分区,第二个分区表项为扩展分区.这个分区项指向下一个分区(如E盘)的的第一个扇区.,以此推之,就是一个分区链,这种就可以突破MBR中只有4个分区表项了.分区表项的第一个字节代表的是是否为活动分区,80表示是活动分区(主分区),00表示的是非活动分区(扩展分区,或没有用到的分区表项这个标志也为00),除这两个标示外.其它标示为非法.下面是这17个字节的代码:001B mov si,07BE '因为前面27个字节代码把MBR内容复制到0000:0600处(其实前面27个复制代码字节为00,没有复制过来,一开始就复制到0000:061b 处),所以分区表的位置就为0000:06BE(第一项的开头地址).所以这句代码是把si指向MBR 中硬盘分区表的第一项的首地址.001E mov cl,04 '分区表有4项,4*16=64个字节,用于loop0020 cmp [si],ch 'cx寄存器前面用movsb减为0,所以ch=0,判断第一个分区表项的第一个字节标示是否为非活动分区,因为cmp是有符号数据比较,如果[si]=80,则其比0小0022 jl 002D '如果是80,活动分区,则跳到002D地址,这里有点问题,如果是81非法数据,也是小于0,也会跳到002D地址,所以用JZ比较好点0024 jne 003B ' 如果不等于00,(即不为非活动分区),则跳到003B,显示错误信息.0026 add si,0010 '使si指向下一个分区项,即跳过16个字节.0029 loop 0020 '循环取出4个分区表项.loop由cx次数决定002B int 18 'INT 18 为ROM BASIC 入口代码,它指分区表项中没有活动分区标志或非活动分区标志时,进行ROM BASIC代码.002D mov dx,[si] '若找到活动分区,把分区表项的前2个字节放到DX中dl=80,dh=起始磁头号002F mov bp,si '把活动分区的起始位置保存到BP寄存器中0031 add si,0010 '指向下一个分区表项0034 dec cx '因为前面ch=0,就是把前面cl=4减1,0035 je 004D '分区检测完毕,则跳转到系统引导区0037 cmp [si],ch '判断是否为非活动分区,是则跳转检测下一个分区表项,就是一面这条指令0039 je 0031'下面地址003B,是前面在检测既不是活动分区时,也不是非活动分区时,跳过来显示错误信息003B mov si,0710 'MBR扇区中错误信息的地址(10fH),在这里起始地址是0600,所以为070f003e dec si '前一指令是0710,这里减1,正好是070f003F lodsb '把si指向的地址中的数据字节放到al中,执行后si+10040 cmp al,00 '如果指向的数据字节为00(到结束了),就跳到003E,这时因为上面si+1了,003E处减1还是指向这个00,所以就(循环)停止到这,显示错误信息0042 je 003E0044 mov bx,0007 'BIOS中断int 10h,BX=传输区地址0047 mov ah,0E '设置显示模式,AL=0E 640×200 彩色图形(EGA)0049 int 10 '中断10H 显示字符004B jmp 003f '跳转显示下一个字符.MBR主引导扇区前139个字节引导代码详解3默认分类 2009-12-02 12:03:23 阅读46 评论0 字号:大中小订阅最后一段字节的作用是把活动分区对应的第一个扇区的512个字节数据读到0000:7C00处,如果读取不成功再读,读取的次数赋到DI中,如果读取成功,判断结束标志是否为AA 55,则恢复活动分区指针到SI,转到0000:7c00处,执行活动分区的系统引导程序.mov si,bpjmp 0000:7c00。

引导程序代码

引导程序代码
节,kernel有522字节,但是一个扇区只有512字节,怎么写得下?这个问题我最先也迷
惑,后来把两个exe文件反汇编才知道真正我们写的代码出现在exe文件的513字节处,
exe文件的前512字节是mircosoft定义的exe文件的前缀,其中有exe文件标识,大小,
段定位指针等东西,这512字节我们不需要我们就只要后面的,那么我们就来写个程序
i=0;
while(1)
{
fread(&kernel_buf[i],1,1,fp); /*读入后面的所有内容直到结束*/
i++;
if(feof(fp))
{
fclose(fp);
mov bx, 0 ; kernel偏移地址为0
mov dl, 0 ; 驱动器号为0h,即A盘
mov dh, 0 ; 磁头号为0
mov ch, 0 ; 磁道号为0
break;
}
}
boot_buf[510] = 0x55; /*最后两个字节必须为55aa*/
boot_buf[511] = 0xaa;
/* 设置:将boot中的引导程序写入A盘的第0磁道1扇区*/
i=0;
while(1)
{
fread(&boot_buf[i],1,1,fp); /*读入后面的所有内容直到结束*/
i++;
if(feof(fp))
{
fclose(fp);
if (_AH!=0) /*ah为0刚写盘成功,否则退出*/
{
printf("error writing");exit(0);

用DSP软件编程实现的引导装载系统分析

用DSP软件编程实现的引导装载系统分析

用DSP软件编程实现的引导装载系统分析
引导程序:引导程序主要负责加载应用程序并将控制权转交给应用程序。

引导程序的实现需要根据具体DSP的硬件特点进行设计,其中包括片上存储器和外部存储器的选择、存储器接口等。

引导程序的设计应该考虑到存储器使用的灵活性、性能和安全性。

同时,为了保证引导程序的可靠性,需要在设计时考虑到各种异常情况的处理,如存储器的读写异常、应用程序的异常退出等。

在实现过程中,还需要考虑到耗时问题,尽量减小引导程序的体积和执行时间,以便更快地启动应用程序。

引导程序和应用程序的实现需要满足以下要求:
1. 可靠性高:引导程序和应用程序需要具有高可靠性,能够在各种异常情况下保证系统的正常运行。

2. 体积小:为了能够快速加载应用程序,引导程序的体积应该尽量小,同时应用程序的体积也应该尽可能小,以便减小存储器的使用量。

3. 效率高:为了能够快速启动应用程序并完成任务,引导程序和应用程序的执行效率应该尽可能高,同时需要避免资源的浪费。

4. 可扩展性和可维护性:为了方便应用程序的调试和升级,应用程序应该具有良好的可扩展性和可维护性,能够方便地进行修改和更新。

总之,DSP软件编程实现的引导装载系统需要考虑到多方面的因素,包括硬件特点、系统需求、性能要求、错误处理等。

在实际应用中,需要根据具体情况进行设计和优化,以达到最佳的性能和可靠性。

系统引导过程简介

系统引导过程简介

系统引导过程简介一、系统引导过程简介系统引导过程主要由以下几个步骤组成(以硬盘启动为例)1、开机;2、BIOS加电自检(POST---Power On Self Test),内存地址为0fff:0000;3、将硬盘第一个扇区(0头0道1扇区,也就是Boot Sector)读入内存地址0000:7c00处;4、检查(WORD)0000:7dfe是否等于0xaa55.若不等于则转去尝试其他介质;如果没有其他启动介质,则显示”No ROM BASIC”,然后死机;5、跳转到0000:7c00处执行MBR中的程序;6、MBR先将自己复制到0000:0600处,然后继续执行;7、在主分区表中搜索标志为活动的分区.如果发现没有活动分区或者不止一个活动分区,则停止;8、将活动分区的第一个扇区读入内存地址0000:7c00处;9、检查(WORD)0000:7dfe是否等于0xaa55,若不等于则显示“Missing Operating System”,然后停止,或尝试软盘启动;10、跳转到0000:7c00处继续执行特定系统的启动程序;11、启动系统.以上步骤中(2),(3),(4),(5)步由BIOS的引导程序完成;(6),(7),(8),(9),(10)步由MBR中的引导程序完成.一般多系统引导程序(如Smart Boot Manager, BootStar, PQBoot等)都是将标准主引导记录替换成自己的引导程序,在运行系统启动程序之前让用户选择想要启动的分区.而某些系统自带的多系统引导程序(如LILO,NT Loader等)则可以将自己的引导程序放在系统所处分区的第一个扇区中,在Linux中即为两个扇区的SuperBlock.注:以上步骤中使用的是标准的MBR,多系统引导程序的引导过程与此不同.二、硬盘结构及参数3D参数(Disk Geometry):CHS(Cylinder/Head/Sector)C-Cylinder柱面数表示硬盘每面盘片上有几条磁道,最大为1024(用10个二进制位存储);H-Head磁头数表示硬盘总共有几个磁头,也就是几面盘片,最大为256(用8个二进制位存储);S-Sector扇区数表示每条磁道上有几个扇区,最大为63(用6个二进制位存储).1、引导扇区Boot Sector组成Boot Sector 也就是硬盘的第一个扇区,它由MBR(Master Boot Record), DPT(Disk Partition Table) 和Boot Record ID三部分组成. MBR又称为主引导记录,占用Boot Sector的前446个字节(0~0x1BD),存放系统主引导程序(它负责从活动分区中装载并且运行系统引导程序). DPT即主分区表占用64个字节(0x1BE~0x1FD),记录磁盘的基本分区信息.主分区表分为四个分区项,每项16个字节,分别记录每个主分区的信息(因此最多可以有四个主分区). Boot Record ID即引导区标记占用两个字节(0x1FE~0x1FF),对于合法引导区,它等于0xaa55,这是判别引导区是否合法的标志). Boot Secor具体结构如图:2、分区表结构简介分区表由四个分区项构成,每一项结构如下:BYTE State:分区状态,0=未激活,0x80=激活(注意此项);BYTE StartHead:分区起始磁头号;WORD StartSC:分区起始扇区和柱面号,底字节的底6位为扇区号,高2位为柱面号的第9,10位,高字节为柱面号的低8位;BYTE Type:分区类型,如0x0B=FAT32,0x83=Linux等,00表示此项未用;BYTE EndHead:分区结束磁头号;WORD EndSC:分区结束扇区和柱面号,定义同前;DWORD Relative:在线性寻址方式下的分区相对扇区地址(对于基本分区即为绝对地址);DWORD Sectors:分区大小(总扇区数).在DOS或Windows系统下,基本分区必须以柱面为单位划分(Sectors*Heads个扇区),如对于CHS为764/256/63的硬盘,分区的最小尺寸为256*63*512/1048576=7.875MB.由于硬盘的第一个扇区已经被引导扇区占用,所以一般来说,硬盘的第一个磁道(0头0道)的其余62个扇区是不会被分区占用的.某些分区软件甚至将第一个柱面全部空出来.扩展分区结构如图:硬件不同了3D 参数(Disk Geometry):CHS(Cylinder/Head/Sector) C-Cylinder柱面数表示硬盘每面盘片上有几条磁道,最大为1024(用10个二进制位存储);H-Head磁头数表示硬盘总共有几个磁头,也就是几面盘片,最大为256(用8个二进制位存储);S-Sector 扇区数表示每条磁道上有几个扇区,最大为63(用6个二进制位存储).应该注明以上是以前的磁盘结构。

Linux操作系统(三)附录

Linux操作系统(三)附录
XFree86-I128
XFree86 的 I128 服 务 器
XFree86-Mach32
XFree86 的 M a c h 3 2 服 务 器
XFree86-Mach64
XFree86 的 M a c h 6 4 服 务 器
XFree86-Mach8
XFree86 的 Mach8 服 务 器
驱 动 器 和 一 块 以 太 网 卡 的 地 址 信
息 。 逗 号 对 某 个 设 备 使 用 能 够 的 多 个 值 进 行 分 隔 , 空 格 用 来 分 隔 多 个 参 数 。
如 果 需 要 , 也 可 以 通 过 使 用 启 动 参 数 关 闭 系 统 的 自 动 检 测 硬 件 功 能 。 例 如 ,
Caldera OpenLinux 能 够 顺 利 完 成 安 装 工 作 。
但 在 某 些 时 候 , 需 要 为 该 功 能 提 供 某 些 “帮 助 ”以 正 确 识 别 和 使 用 系 统 中 的 硬
件 设 备 。 如 果 需 要 , 可 以 在 启 动 安 装 过 程 时 键 入 相 应 的 启 动 参 数 或 在 安 装 过 程
的 Kernel Module Manager 使 用 过 程 中 输 入 核 心 参 数 (也 称 为 insmod 参 数 )。
例 如 , 在
LILO 启 动 提 示 符 状 态 下 , 一 般 只 需 要 简 单 地 输 入
linux(如
Linux
为 默 认 设 置 可 直 接 输 入 回 车 键 )就 可 以 进 入 Linux 系 统 。
XFree86-fonts100
X11R6 100dpi 字 体

嵌入式Linux系统的引导过程及启动代码分析

嵌入式Linux系统的引导过程及启动代码分析

面介绍相关技术 F
的作用 y 嵌入式系统中 M N N O b N g [ Z h
嵌 入式 系 统 中 首 先 要 考 虑 的 是 启 动 问 题 E 当一个 微处理 器最 初启动 时 E 它首先执行一个预定地址处的 指 令E 这 个 地 址 处 存 放 系 统 初 始 化 或 引 导 程 序E 正如
2 3 45 X P ^ ^ X ^ ^ 8 Z % WX * W% _ , ‘ L $ , 9 a ) M ‘ L 6 W_ 提供一组 2 主要是 9 c a b N a c 3 4 协处理器相关函数" 对2 的操作 % a ’ , 为中断和异常提供处理函数 9 c L M * , N b * & a c 串口的设备驱动 " 主要对串口 的 控 制 寄 存 9 c & , L % $ a c 器操作 9 c c 全局开始启动代码 & * % * & 8 Z % Wd * d 7 8 Z Z % * Wd Y e f L g Wb a O O h
代码分析 V 4 ( ) ) *
是 一 个 开 源 的 固 件 程 序" 它能实现对 4 ( ) ) * 加载操作系统及其它的 ( 2 3 4 及 主 板 的 初 始 化" ) ) * 等功能 并提供了命令行操作 下的 丰 富 的功 能 " ! L W% 6 , 它 提 供 对 多 种 处 理 器 的 支 持! 下 面 以 硬 件 开 发 板 启 动 部 分 的 代 码 进 行 分 析! X Y 7 8为 例 对 4 ( F 3 ) ) * 为核 ! X Y 7 8板以 /. 8 Z F 3 0X * 的目录结构 V 9 : [ \ ] ] <
的基本框架结构 1 ( ) ) * $ ) % + , 大部分的 ( 依赖于 2 ) ) * $ ) % + , 3 4 的体系结构和 嵌 入 式 板 级 设 备 的 配 置" 因 此" 可分为两 ( ) ) *$ ) % + , 部 分5 用汇编语言实现的依赖于 2 3 4 体系结构的代 码& 7和用 2语言实现的代码 & 8 ! * % 6 , * % 6 , 1 9 : ; :的操作 < = > ? 包括以下步骤 5 @ 基本硬件的初始化 " A 屏蔽所有中断 ! B置 2 3 4 速度和时钟频率 ! C 初始化 . /0! D 初始化 E F G 或 4/. H! 为加载 准备 I 8 & * % 6 , . /0 空间 ! @ 复制 & 8到 . * % 6 , /0 中 ! 为执行 2语言代码做准备 ! " J 3 @ 跳转到 & 8的 2语言入口点 ! * % 6 , 的基本操作 1 9 K ; K < = > ? @ 初始化本阶段要用到的硬件设备 ! # $ % & ’上的内核 映像读到预留的 . 先确定这些预留的 /0 空 间 之 前 " 空间哪些被真正映射到了 . /0 . /0 地址单元 ! @ 加载内核映像和根文件系统映像 !

附录 程序代码

附录 程序代码

附录程序代码#include <reg52.h> //调用单片机头文件#define uchar unsigned char //无符号字符型宏定义变量范围0~255#define uint unsigned int //无符号整型宏定义变量范围0~65535#include "eeprom52.h"//数码管段选定义 0 1 2 3 4 5 6 7 8 9uchar code smg_du[]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,0xa0,0x60,0x25,0x39,0x26,0x31,0x71,0xff}; //断码//数码管位选定义uchar code smg_we[]={0xef,0xdf,0xbf,0x7f};uchar dis_smg[8] = {0x28,0xee,0x32,0xa2,0xe4,0x92,0x82,0xf8};uchar smg_i = 3; //显示数码管的个位数sbit dq = P2^4; //18b20 IO口的定义bit flag_lj_en; //按键连加使能bit flag_lj_3_en; //按键连3次连加后使能加的数就越大了uchar key_time,key_value; //用做连加的中间变量bit key_500ms ;sbit beep = P2^3; //声光报警接口uchar f_pwm_l ; //越小越慢uint temperature ; //bit flag_300ms ;uchar menu_1; //菜单设计的变量uint t_high = 300,t_low = 100; //温度上下限报警值uint number;/***********************1ms延时函数*****************************/void delay_1ms(uint q){uint i,j;for(i=0;i<q;i++)for(j=0;j<120;j++);}/***********************小延时函数*****************************/void delay_uint(uint q){while(q--);}/***********************数码显示函数*****************************/void display(){static uchar i;i++;if(i >= smg_i)i = 0;P1 = 0xff; //消隐P3 = smg_we[i]; //位选P1 = dis_smg[i]; //段选}/******************把数据保存到单片机内部eepom中******************/void write_eeprom(){SectorErase(0x2000);byte_write(0x2000, t_high % 256);byte_write(0x2001, t_high / 256);byte_write(0x2002, t_low % 256);byte_write(0x2003, t_low / 256);byte_write(0x2055, a_a);}/******************把数据从单片机内部eepom中读出来*****************/void read_eeprom(){t_high = byte_read(0x2001);t_high <<= 8;t_high |= byte_read(0x2000);t_low = byte_read(0x2003);t_low <<= 8;t_low |= byte_read(0x2002);a_a = byte_read(0x2055);}/**************开机初始化保存的数据*****************/void init_eeprom(){read_eeprom(); //先读if(a_a != 22) //新的单片机初始单片机内问eeprom{t_high = 250;t_low = 200;a_a = 22;write_eeprom(); //保存数据}}/***********************18b20初始化函数*****************************/ void init_18b20(){bit q;dq = 1; //把总线拿高delay_uint(1); //15usdq = 0; //给复位脉冲delay_uint(80); //750usdq = 1; //把总线拿高等待delay_uint(10); //110usq = dq; //读取18b20初始化信号delay_uint(20); //200usdq = 1; //把总线拿高释放总线}/*************写18b20内的数据***************/void write_18b20(uchar dat){uchar i;for(i=0;i<8;i++){ //写数据是低位开始dq = 0; //把总线拿低写时间隙开始dq = dat & 0x01; //向18b20总线写数据了delay_uint(5); // 60usdq = 1; //释放总线dat >>= 1;}}/*************读取18b20内的数据***************/uchar read_18b20(){uchar i,value;for(i=0;i<8;i++){dq = 0; //把总线拿低读时间隙开始value >>= 1; //读数据是低位开始dq = 1; //释放总线if(dq == 1) //开始读写数据value |= 0x80;delay_uint(5); //60us 读一个时间隙最少要保持60us的时间}return value; //返回数据}/*************读取温度的值读出来的是小数***************/uint read_temp(){uint value;uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序init_18b20(); //初始化18b20EA = 0;write_18b20(0xcc); //跳过64位ROMwrite_18b20(0x44); //启动一次温度转换命令EA = 1;delay_uint(50); //500usinit_18b20(); //初始化18b20EA = 0;write_18b20(0xcc); //跳过64位ROMwrite_18b20(0xbe); //发出读取暂存器命令low = read_18b20(); //读温度低字节value = read_18b20(); //读温度高字节EA = 1;value <<= 8; //把温度的高位左移8位value |= low; //把读出的温度低位放到value的低八位中value *= 0.625; //转换到温度值小数return value; //返回读出的温度带小数}/*************定时器0初始化程序***************/void time_init(){EA = 1; //开总中断TMOD = 0X11; //定时器0、定时器1工作方式1ET0 = 1; //开定时器0中断TR0 = 1; //允许定时器0定时ET1 = 1; //开定时器0中断TR1 = 0; //允许定时器0定时}/********************独立按键程序*****************/uchar key_can; //按键值void key() //独立按键程序{static uchar key_new;key_can = 20; //按键值还原P2 |= 0x07;if((P2 & 0x07) != 0x07) //按键按下{if(key_500ms == 1) //连加{key_500ms = 0;key_new = 1;}delay_1ms(1); //按键消抖动if(((P2 & 0x07) != 0x07) && (key_new == 1)){ //确认是按键按下key_new = 0;switch(P2 & 0x07){case 0x06: key_can = 3; break; //得到k2键值case 0x05: key_can = 2; break; //得到k3键值case 0x03: key_can = 1; break; //得到k4键值}flag_lj_en = 1; //连加使能}}else{if(key_new == 0){key_new = 1;write_eeprom(); //保存数据flag_lj_en = 0; //关闭连加使能flag_lj_3_en = 0; //关闭3秒后使能key_value = 0; //清零key_time = 0;key_500ms = 0;}}}/****************按键处理数码管显示函数***************/void key_with(){if(key_can == 1) //设置键{f_pwm_l = 30;menu_1 ++;if(menu_1 >= 3){menu_1 = 0;smg_i = 3; //数码管显示3位}}if(menu_1 == 1) //设置高温报警{smg_i = 4; //数码管显示4位if(key_can == 2){if(flag_lj_3_en == 0)t_high ++ ; //按键按下未松开自动加三次elset_high += 10; //按键按下未松开自动加三次之后每次自动加10if(t_high > 990)t_high = 990;}if(key_can == 3){if(flag_lj_3_en == 0)t_high -- ; //按键按下未松开自动减三次elset_high -= 10; //按键按下未松开自动减三次之后每次自动减10if(t_high <= t_low)t_high = t_low + 1;}dis_smg[0] = smg_du[t_high % 10]; //取小数显示dis_smg[1] = smg_du[t_high / 10 % 10] & 0xdf; //取个位显示dis_smg[2] = smg_du[t_high / 100 % 10] ; //取十位显示dis_smg[3] = 0x64; //H}if(menu_1 == 2) //设置低温报警{smg_i = 4; //数码管显示4位if(key_can == 2){if(flag_lj_3_en == 0)t_low ++ ; //按键按下未松开自动加三次elset_low += 10; //按键按下未松开自动加三次之后每次自动加10if(t_low >= t_high)t_low = t_high - 1;}if(key_can == 3){if(flag_lj_3_en == 0)t_low -- ; //按键按下未松开自动减三次elset_low -= 10; //按键按下未松开自动加三次之后每次自动加10if(t_low <= 10)t_low = 10;}dis_smg[0] = smg_du[t_low % 10]; //取小数显示dis_smg[1] = smg_du[t_low / 10 % 10] & 0xdf; //取个位显示dis_smg[2] = smg_du[t_low / 100 % 10] ; //取十位显示dis_smg[3] = 0x3D; //L}}/****************报警控制函数***************/void baojing_kz(){if(temperature<t_high && temperature>t_low){TR1 = 0;beep = 1;}else{TR1 = 1;if(number >= 1000){number = 0;beep = ~beep;}}}/****************主函数***************/void main(){P0 = P1 = P2 = P3 = 0xff;time_init(); //初始化定时器temperature = read_temp(); //先读出温度的值init_eeprom(); //开始初始化保存的数据delay_1ms(650);temperature = read_temp(); //先读出温度的值dis_smg[0] = smg_du[temperature % 10]; //取温度的小数显示dis_smg[1] = smg_du[temperature / 10 % 10] & 0xdf; //取温度的个位显示dis_smg[2] = smg_du[temperature / 100 % 10] ; //取温度的十位显示f_pwm_l = 50;while(1){key(); //按键程序if(key_can < 10){key_with(); //设置报警温度}if(flag_300ms == 1) //300ms 处理一次温度程序{flag_300ms = 0;temperature = read_temp(); //先读出温度的值if(menu_1 == 0){smg_i = 3;dis_smg[0] = smg_du[temperature % 10]; //取温度的小数显示dis_smg[1] = smg_du[temperature / 10 % 10] & 0xdf; //取温度的个位显示dis_smg[2] = smg_du[temperature / 100 % 10] ; //取温度的十位显示}}baojing_kz(); //报警控制函数}}/*************定时器0中断服务程序***************/void time0_int() interrupt 1{static uchar value; //定时2ms中断一次TH0 = 0xf8;TL0 = 0x30; //2msdisplay(); //数码管显示函数value++;if(value >= 150){value = 0;flag_300ms = 1;}if(flag_lj_en == 1) //按下按键使能{key_time ++;if(key_time >= 250) //500ms{key_time = 0;key_500ms = 1; //500mskey_value ++;if(key_value > 3){key_value = 10;flag_lj_3_en = 1; //3次后1.5秒连加大些}}}}/*******************定时器1用做单片机模拟PWM 调节***********************/ void Timer1() interrupt 3 //调用定时器1{TH1=0xfe; // 定时10ms中断一次TL1=0x0c; //500usnumber++;}。

【Linux系统教程】Linux的引导过程及原理

【Linux系统教程】Linux的引导过程及原理

Linux的引导过程及原理1.1:Linux计算机的启动顺序打开电脑并使其操作系统被加载的过程叫引导。

当PC引导后,BIOS做一些测试保证一切正常,然后开始真正的引导。

启动过程中电脑首先加载了一小段叫 bootstrap loader 的程序,它依次加载和启动操作系统。

bootstrap loader 通常存储在硬盘或软盘的固定位置。

这两步过程的理由是操作系统大而复杂,而电脑加载的第一段代码很小(几百字节),以免使固件不必要地复杂化。

不同电脑的bootstrap也不同,对于PC电脑(它的BIOS)读软盘或硬盘的第一个扇区(叫引导扇区),bootstrap loader包含在这个扇区中,它加载位于(和其他磁盘)其他地方的操作系统。

它选择一个磁盘(通常是第一个软驱,如果无软盘的话,就是第一个硬盘,顺序是可设置的)。

然后读第一个扇区,这叫引导扇区;对于硬盘,也叫主引导记录,因为硬盘可以包含多个分区,每个分区都有自己的引导扇区。

引导扇区包含一个小程序(小到可以存入一个扇区),它的责任是从磁盘读入真正的操作系统并启动它。

1.2:Linux启动方式 可以从软盘或硬盘引导Linux。

从软盘启动Linux时,引导扇区包含的代码只读前数百个数据块(当然,依赖于内核的大小)到预定的内存位置。

Linux引导软盘上,没有系统,内核存在连续的扇区中,因为这样简化了引导过程。

Linux加载后,它初始化硬件和设备驱动程序,然后运行init。

init可启动其他进程以允许用户登录并做其他事情。

这部分的细节在下面讨论。

为了关闭一个Linux系统,首先所有进程被告知结束(这使他们关闭所有文件,完成必要的其他事情,使之整齐地结束),然后unmount 文件系统和交换分区,最后打印可以关掉电源的信息到控制台。

如果没有遵循正确的过程,可怕的事情可能发生。

最重要的文件系统缓冲Cache可能没有回写,这意味着其中的所有资料将丢失,磁盘文件系统不完整,并可能不可用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第3章的附录系统引导程序的代码
下面是一个基于S3C2410芯片的嵌入式系统引导(启动)程序Startup.s文件中的汇编源程序。

通过对这段程序的分析,巩固所学的汇编指令知识,并学习嵌入式系统引导程序的编写方法。

程序中各条指令及指示符的具体含义请参照3.1节和3.3.1小节中的说明。

;Startup Code for S3C2410 : Startup.s
;下面指令包含2410addr.s文件,该文件中定义了S3C2410内部寄存器地址对应的变量。

GET 2410addr.s
; 某些ARM920T CPSR寄存器位的定义,定义了部分常量。

USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
MODEMASK E QU 0x1f
NOINT EQU 0xc0
I_Bit * 0x80
F_Bit * 0x40
; MMU寄存器定义。

CtrlMMU * 1
CtrlAlign * 2
CtrlCache * 4
CtrlWBuff * 8
CtrlBigEnd * 128
CtrlSystem * 256
CtrlROM * 512
TLB_L0_INIT * 0x0C02
;AREA指示汇编器汇编一段新的代码,为保证下面的代码为起始代码,应在ARM连接器的layout选项中指明Startup.o(Init) (如图1-33所示),或用scatter格式的描述性文件说明。

AREA Init,CODE,READONLY
;IMPORT提供汇编器在当前汇编中未曾定义的符号名。

IMPORT __use_no_semihosting_swi
IMPORT Enter_UNDEF
IMPORT Enter_SWI
IMPORT Enter_PABORT
IMPORT Enter_DABORT
IMPORT Enter_FIQ
;下面ENTRY指明了程序的入口,在应用程序中有且只有一个程序入口。

ENTRY
;下面是异常向量表,第一条语句是复位异常对应的跳转指令。

b ColdReset ;复位
b Enter_UNDEF ;未定义指令错误
b Enter_SWI ;软件中断
b Enter_PABORT ;预取指令错误
b Enter_DABORT ;数据存取错误
b . ;一个保留的中断向量
b IRQ_Handler ;IRQHandler
b Enter_FIQ ;FIQHandler
;deal with IRQ interrupt
EXPORT IRQ_Handler
IRQ_Handler
IMPORT ISR_IrqHandler
STMFD sp!, {r0-r12, lr}
BL ISR_IrqHandler
LDMFD sp!, {r0-r12, lr}
SUBS pc, lr, #4
;系统上电或复位后跳转到此处开始进行运行。

EXPORT ColdReset
ColdReset
;关看门狗定时器
ldr r0,=WTCON
ldr r1,=0x0
str r1,[r0]
;关所有中断
ldr r0,=INTMSK
ldr r1,=0xffffffff
str r1,[r0]
ldr r0,=INTSUBMSK
ldr r1,=0x7ff ;all sub interrupt disable
str r1,[r0]
;初始化堆栈
bl InitStacks ;Stack Setup for each MODE
;复制excption table到SRAM0x0地址处
IMPORT |Load$$EXCEPTION_EXEC$$Base|
IMPORT |Image$$EXCEPTION_EXEC$$Base|
IMPORT |Image$$EXCEPTION_EXEC$$Length|
ldr r0, =|Load$$EXCEPTION_EXEC$$Base| ;源数据
ldr r1, =|Image$$EXCEPTION_EXEC$$Base| ;目的地址处
ldr r2, =|Image$$EXCEPTION_EXEC$$Length|
exception_cploop
sub r2, r2, #4
ldmia r0!, {r3}
stmia r1!, {r3}
cmp r2, #0
bge exception_cploop
;下面调转到C语言的主函数处
IMPORT __main
BL __main ;通常不能用main()作为主函数名
B .
;下面是初始化堆栈的子函数
IMPORT UserStack
IMPORT SVCStack
IMPORT UndefStack
IMPORT IRQStack
IMPORT AbortStack
IMPORT FIQStack
InitStacks
mrs r0,cpsr
bic r0,r0,#MODEMASK
orr r1,r0,#UNDEFMODE|NOINT
msr cpsr_cxsf,r1 ;UndefMode
ldr sp,=UndefStack
orr r1,r0,#ABORTMODE|NOINT
msr cpsr_cxsf,r1 ;AbortMode
ldr sp,=AbortStack
orr r1,r0,#IRQMODE|NOINT
msr cpsr_cxsf,r1 ;IRQMode
ldr sp,=IRQStack
orr r1,r0,#FIQMODE|NOINT
msr cpsr_cxsf,r1 ;FIQMode
ldr sp,=FIQStack
orr r1,r0,#SVCMODE|NOINT
msr cpsr_cxsf,r1 ;SVCMode
ldr sp,=SVCStack
mov pc,lr ;The LR register may be not valid for the mode changes.
END ;Stratup.s程序结束
上述程序代码中,ENTRY指明了程序的入口。

因为,ARM920T要求中断向量表必须设置在从0x0地址开始,连续8×4字节的空间中,因此,在ENTRY的后面紧接着8条跳转指令,分别对应复位、未定义指令错误、软件中断、预取指令错误、数据存取错误、一个保留的中断向量、IRQ和FIQ等异常的处理。

系统上电或复位后,首先执行的是“b ColdReset”指令,系统跳转到标号为ColdReset 处接着执行,在完成了关看门狗定时器、关中断、初始化各模式的堆栈、初始化存储器等功能后,执行指令“BL __main”跳转到C语言的主函数处执行。

本例中,初始化堆栈的功能编写成了子函数,在该子函数中,没有对用户模式下的堆栈进行初始化。

相关文档
最新文档