《嵌入式操作系统》2013年实验指导书_第1页
《嵌入式操作系统》2013年实验指导书_第2页
《嵌入式操作系统》2013年实验指导书_第3页
《嵌入式操作系统》2013年实验指导书_第4页
《嵌入式操作系统》2013年实验指导书_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、嵌入式操作系统嵌入式操作系统实验指导书计算机科学与信息工程学院2012 年 9 月 3 日目录目录实验一实验一 系统引导实验系统引导实验.1实验二实验二 IRQ 中断处理中断处理 .3实验三实验三 LINUX 常用命令及工具实验常用命令及工具实验.7实验四实验四 MAKEFILE 实验实验.9实验五实验五 BOOTLOADER 实验实验 .13实验六实验六 LINUX 内核编译实验内核编译实验.16实验七实验七 驱动程序结构实验驱动程序结构实验.19实验一实验一 系统引导实验系统引导实验【实验目的】1.了解 PXA270 处理器功能结构2.了解系统的基本硬件组成1.了解 ARM 指令集2.掌握

2、嵌入式系统的一般引导规律3.掌握常见 ARM 开发工具软件的使用【实验仪器】PC 机一台,ARM10 试验箱一套,以及必要的软件安装包【实验原理】1、程序介绍本章主要通过一个简短的 Boot 程序向读者揭示如何编写开发板的启动程序,同时本程序也可以用来引导其他章节的示例程序。本程序主要为了让读者能够清晰了解系统复位后如何从 0 x0 开始引导。本引导程序驱动底板上的八盏 LED 就会向右点亮,不断循环下去。2、系统复位对于 PXA270 处理器来说,系统复位后的 PC 指针总是为 0 x0,以本开发板来说,片选信号 nCS0所连接的为 FLASH 芯片,boot 程序应该被烧写到该 FLASH

3、 芯片上,且第一条指令应该放在 0 x0 的地址(注意并不是所有的处理器都从地址 0 x0 开始运行,有些处理器是从 0 xFFFF0 开始运行的) 。事实上,地址 0 x00 x20 之间为中断向量表,地址 0 x0 为复位中断例程的入口点,即通过在 0 x0 放一条无条件跳转语句,在系统加电或复位时,在地址 0 x0开始跳转,从复位中断例程开始运行下去。3、程序进入点因为引导程序是自举的的程序,无需操作系统加载来执行,所以即使不设置初始入口点也可以执行,但这里是有必要对程序进入点进行描述。我们可以将 Boot 程序看成是普通的映像文件,假设我们现在已经生成了映像文件,当 Boot 映像被操

4、作系统加载时,如何决定映像被执行的第一条指令呢?这里引入初始入口点和普通入口点。初始化入口点定义了映像的第一条被执行的指令,在编译程序时可以添加参数entry address(或entry offset+object(area) )来标示初始入口点,如果没有添加该参数,只要源程序中有唯一的伪操作 ENTRY,则程序就被默认成初始入口点。即当镜像被烧入 FLASH后,以 ro_base 属性决定的映像位置的第一条指令就是被定义在 ENTRY 标示的段的第一条指令,读者可能对此有些模糊,我们这里以给定的程序来分析。在 BootLoader 代码里的 boot.s 汇编文件里,可以发现以下程序:AR

5、EA boot ,CODE ,READONLYENTRYB Reset_HandlerB Undefined_HandlerB SWI_HandlerB Prefetch_HandlerB DataAbort_HandlerNOPB IRQ_HandlerB FIQ_Handler这小段代码标示了一个名叫 boot 的代码段,属性为只读,而 ENTRY 本来只表示为一个普通入口点,但在 Boot 代码中,因为只使用一次 ENTRY,所以 ENTRY 就被定义为初始化入口点,这里并不是要求所有的源程序中只能使用一次 ENTRY,相反可以多次使用 ENTRY 来标示普通入口点,但多次使用 ENTR

6、Y 后,就无法让系统知道镜像的第一条执行的指令在哪里,就必须在编译时增加entry address 参数。读者可以尝试一下代码中都不使用 ENTRY 或多次使用 ENTRY 会发生什么现象。回到上面的代码中,我们发现伪操作 ENTRY 下有一条无条件跳转指令 B,由于 AREA 和 ENTRY 都是伪操作,在不分配成实质的指令,所以,程序的第一条会被执行的指令就是 B 指令,作为 Boot 代码,初始入口点是不起作用的,因为它无需被加载而运行,初始入口点保存在 ELF 头文件中,该值可被操作系统读取而跳转到初始入口点执行。【实验内容】1、分析代码结合以上说明,对本实验所提供的汇编源代码进行分析

7、,深入理解针对具体的硬件实现,软件是如何配合工作的。2、程序的编译和下载打开 ADS,执行 ProjectMake ,也可以直接用快捷键 F7 进行编译、连接生成映像文件。如图所示:3、观察系统运行情况,对系统进行源码调试。【习题与思考题】1、简述 ELF 文件的内部层次结构。2、简述连接器的 4 个参数ro_base,rw_base,first,entry 的意义。3、简述初始化入口点和普通入口点的区别,分别用在什么场合。实验二实验二 IRQIRQ 中断处理中断处理【实验目的】 学习编写中断处理程序【实验原理】1、程序介绍本章例子主要使用按键实现外部中断,执行中断服务子程序。系统启动后,按

8、12345678任意键,相应的八段数码管就会点亮。2、中断向量表当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。处理器能够准确无误地响应中断,是因为 ARM 体系结构里有一个中断向量表,该中断向量表将系统能够响应的7 种异常中断类型的“入口地址”登记在一块连续的字节空间内,每种异常中断的“入口地址”占据 4 个字节,这里“入口地址”实质是一些跳转指令或者是让 PC 指针赋值的指令,通常使用 B 或 ldr 指令。简单地说,异常中断发生首先会跳转到中断向量表,此时跳转的位置会由系统根据中断类型来判断,由于中断向量表实质也是跳转指令所组成的指令序列,所以系统会再进行一

9、次跳转,这次跳转便跳到中断处理程序(中断服务例程)的入口。从第一章开始,读者在学习 Boot 程序的编写时便开始接触中断向量表,Boot 程序的第一条指令 b post 就是中断向量表里的第一个单元空间(4 个字节) ,这个单元空间是用作处理复位异常中断。由于一条 B 和 Ldr 指令就是 32 位的指令,即占 4 个字节,所以整个中断向量表可以是如下形式:IMPORT Reset_HandlerIMPORT Undef_instrution_HandlerIMPORT SWI_HandlerIMPORT Prefetch_HandlerIMPORT Abort_HandlerIMPORT I

10、RQ_HandlerIMPORT FIQ_HandlerAREA boot ,CODE ,READONLYB Reset_HandlerB Undef_instrution_HandlerB SWI_HandlerB Prefetch_HandlerB Abort_HandlerNOPB IRQ_HandlerB FIQ_Handler或者使用 Ldr 指令来实现:AREA boot ,CODE ,READONLYLDR PC,Reset_HandlerLDR PC,Undef_instrution_HandlerLDR PC,SWI_HandlerLDR PC,Prefetch_Handle

11、rLDR PC,Abort_HandlerNOPLDR PC,IRQ_HandlerLDR PC,FIQ_Handler这里使用 B 和 LDR 指令的主要区别是指令跳转范围,对于 B 指令,可以跳转的范围为-32MB 32MB,而 LDR 则可以将一个 32 位常数和地址值读取到 PC 寄存器中,适合于大范围的跳转。中断向量表是定位在 0 x0 到 0 x20 之间,从编程的角度来看,用户需要对中断向量表在可执行映像中的位置进行定位,即必须将包含中断向量表的 AREA 定位在映像中的最开始位置,而且,该映像必须烧写在ROM 空间 0 x0 的开始位置上。3、IRQ 和 FIQ 中断开关系统复

12、位后,IRQ 和 FIQ 中断都是被禁止的,所以即使建立了中断向量表,当有中断请求也是不会响应的,因此在系统复位后,必须通过程序控制来打开 IRQ 和 FIQ 中断。IRQ 和 FIQ 的控制位分别是当前程序状态寄存器 CPSR 的第 7 和第 6 位,对这两个控制位的修改是不能直接地通过对 CPSR 进行操作,而是首先通过读取 CPSR 到通用寄存器中,然后修改,再写入到 CPSR 里。读取状态寄存器到通用寄存器可以通过 MRS 指令,将通用寄存器的值写入到状态寄存器可以通过MSR。这里假设开启 IRQ 和 FIQ 中断,程序如下:MRS R0,CPSRAND R0,R0,0 x3FMSR

13、CPSR_C, R0CPSR_C 表示 CPSR7:0控制位域,将 CPSR7和 CPSR6清零便可以开启 IRQ 和 FIQ 中断处理。通过这一步设置,只是打开了 IRQ 和 FIQ 中断的总开关,而且,对于 ARM 体系结构的 CPU 都是必须的。IRQ 和 FIQ 对应于中断向量表的不同位置,同时,FIQ 叫快速中断模式,它的优先级比 IRQ 高,执行 FIQ 中断处理可以无需跳转到中断服务例程,因为 FIQ 位于中断向量表的最末位置,故 FIQ 中断服务例程可以直接安排在 0 x1c 开始的位置,所以 FIQ 可以对中断请求实行快速的响应。 对中断源的具体操作还需对集成在处理器内部的中

14、断控制器进行配置,不同型号的处理器里的中断控制器略有不同,这里只针对 Intel PXA270 进行讨论。4、中断控制器Intel PXA270 内部集成了中断处理器,该处理器能对 23 个中断源进行操作,这种操作包括:通过设置寄存器 ICMR 屏蔽中断源。通过设置寄存器 ICLR 对中断源分类,即可以让中断源发出的中断请求以 IRQ 中断方式或以 FIQ 中断方式被处理。可以查询寄存器 ICPR 得知 23 个中断源当前是否有中断请求,在 ICPR 寄存器上显示发出中断请求的中断源不受 ICMR 影响,即 ICMR 即使屏蔽某个中断源,只要中断源发出中断请求,ICPR 仍然会在相应的位上显示

15、“1” 。可以查询寄存器 ICIP 得知以 IRQ 方式被处理的中断源是否发出中断请求,该寄存器受到 ICMP 影响。即 ICIP ICPR & ICMR & (ICLR) 。可以查询寄存器 ICFP 得知以 FIQ 方式被处理的中断源是否发出中断请求,该寄存器受到 ICMP 影响。即 ICFP ICPR & ICMR & ICLR。5、中断控制寄存器中断控制寄存器包括 6 个寄存器,它们分别是:Interrupt Controller Mask register (ICMR):该寄存器能够屏蔽中断源,寄存器上每 1 位对应一个中断源,只要在相应的位上设置 0,

16、就能屏蔽响应的中断。系统复位后,该寄存器全为 0,即所有的中断源都被屏蔽。Interrupt Controller Pending register (ICPR):该寄存器是一个只读的 32 位寄存器,它显示了所有发出中断请求的中断源。ICPR 不受寄存器 ICMP 影响,即只要中断源发出中断请求,即使 ICMP 屏蔽了中断源,都会在 ICPR 相应的位上显示。Interrupt Controller Level register (ICLR):该寄存器能够决定中断源以 IRQ 或 FIQ 中断方式被处理。只要中断源没有被屏蔽,设置该寄存器后,如果是以 IRQ 中断方式被处理,则 ICIR 相

17、应位会置 1,如果是以 FIQ 中断方式被处理,则 ICFR 相应位会置 1。系统复位后该寄存器全为 0,则表示所有的中断源都以 IRQ 方式被处理。Interrupt Controller IRQ Pending register (ICIP):该寄存器是只读的 32 位寄存器,它显示所有没有被屏蔽,且以 IRQ 方式请求的中断源。Interrupt Controller FIQ Pending register (ICFP):该寄存器是只读的 32 位寄存器,它显示所有没有被屏蔽,且以 FIQ 方式请求的中断源。Interrupt Controller Control register (

18、ICCR):该寄存器只包括一个简单的控制位ICCRDIM。当处理器处于“IDLE”模式时,如果该控制位被设为 1,只有非屏蔽的可用中断源才能将处理器从“IDLE”模式中唤醒。否则,即使屏蔽了中断源,所有的中断源仍可以将处理器唤醒。6、中断控制器的使用在系统初始化的时候,除了要完成打开 IRQ 和 FIQ 中断开关,还要对中断控制器进行设置。假设要开启键盘中断,并以 IRQ 的方式被处理,设置以下符号:;Interrupt ControllerICMR EQU 0 x40d00004init_ICMR EQU 0 x00000010开启中断源,设置屏蔽寄存器 ICMPldr r1, =ICMRl

19、dr r2, =init_ICMRstr r2,r1在 ICMR 里,KEYPAD 代表键盘中断,键盘的中断的位是第 5 位。在这位上设 1,则允许这些中断源请求。在中断服务例程中查询中断源请求状态ldr r11, = REG_ICIRldr r4, r11mov r5, #0 x40000000mov r7, #5handleIdentifyLoopand r6, r4, r5cmp r6,#0 x0bne interruptIdentifymov r5, r5, LSR #0 x1sub r7, r7, #0 x1cmp r7, #0 x0bne handleIdentifyLoop以上程

20、序通过对 ICIR 的 5 个状态位进行轮询,当某一位为 1 时,则表示中断源已经发出了中断请求,然后则跳转到 interruptIdentify 运行。如果该 5 个中断源没有被屏蔽,且都以 IRQ 方式处理,则轮询寄存器 ICPR 的效果与 ICIP 是一样的。7、IRQ 异常中断的响应过程处理器响应 IRQ 异常中断时,在执行中断服务例程的第一条指令前,处理器会自动完成以下操作:保存返回地址:R14_IRQ = 下一条将要执行的指令的地址4 个字节保存当前状态:SPSR_IRQ = CPSR改变处理器模式:CPSR4:0 = 0b100101) 切换到 ARM 状态:CPSR5=02)

21、禁止 IRQ 异常中断:CPSR1=13) 跳转到中断向量表的 IRQ 向量地址执行:PC 0 x018在执行完以上操作后,由于在地址 0 x18 处是一条跳转指令,故程序会跳转到 IRQ 中断服务例程。这里需要强调,在 IRQ 中断服务例程里,处理器的运行模式已经改变为外部中断模式,因此对 R13 和R14,SPSR 的操作实质是外部中断模式(IRQ)下的 R13 和 R14,SPSR,例如,mov pc,r14,这里操作结果是将 R14_IRQ 的值赋予 PC 指针寄存器。读者在编写服务例程时,唯一需要注意的是保存现场,包括保存 CPSR,服务例程里所使用的寄存器,返回地址,由于 CPSR

22、 和返回地址在进入中断服务例程前都已经由处理器自动保存。所以,服务例程的一般形式可以如下AREA IRQ_Handler,CODE, READONLYSUB LR,LR,4STMFD SP!,寄存器列表,LR.程序主体.LDMFD SP!,寄存器列表,PCEND以上程序将返回地址减 4 个字节的原因是因为执行完当前指令后,准备执行异常中断处理时,处理器已经预取了 2 个指令,而正确的返回地址应该是预取后的 PC 地址减 4 个字节。再次将LR(R14_IRQ,返回地址)保存在栈中,是为了防止在程序的主体使用 BL 再次跳转时将保存在 LR寄存器的中断返回地址冲失。最后使用的指令 LDMFD 恢

23、复寄存器原来的数值,标识符表示将SPSR_IRQ 寄存器内容复制到当前程序状态寄存器 CPSR 中,那么 CPU 的处理器模式恢复为原来的模式,并且也打开了 IRQ 中断开关。【实验内容】1、分析代码结合以上说明,对本实验所提供的汇编源代码进行分析,深入理解针对具体的硬件实现,软件是如何配合工作的。2、程序的编译和下载打开 ADS,执行 ProjectMake ,也可以直接用快捷键 F7 进行编译、连接生成映像文件。编译、连接生成映像编译、连接后就生成映像文件,我们可以把它下载到 FLASH 或者 SDRAM 运行和调试。具体办法请查看文档-ADS 实验调试方法。3、观察系统运行情况,对系统进

24、行源码调试。【习题与思考题】1、ARM 体系结构中有多少种异常中断,它们分别是在什么情况下发生,并且它们是如何被组织的。2、查看 ARM 体系结构的资料,结合本章例子程序,完善中断向量表,为软中断和数据访问中止异常中断编写服务例程,并在程序中适当加入语句令程序产生这两种中断。实验三实验三 LinuxLinux 常用命令及工具实验常用命令及工具实验【实验目的】1.VMWare 软件的安装2.VMware 组件工具的安装和使用3.安装 RedHat Linux 系统4.熟悉实验环境及常用指令的使用5.掌握常用的 Linux 命令的使用和操作方法【实验仪器】1、PC机一台2、XSBase270 或

25、XSBase255 ARM 实验开发平台一套3、必要的软件安装包【实验内容】1、VMWare 软件的安装打开 VMWare 软件的安装包,按照提示安装 VMWare 虚拟机。2、安装 RedHat Linux 系统Red Hat 是目前最流行的Linux 操作系统,也是我们的实验系统的平台,因此将以Red Hat Linux 9.0 为例介绍其安装过程。Red Hat Linux 的安装方法很多,我们采用的是从CD-ROM 安装。其安装光盘共有两张,第一张可直接从光盘启动,包含大部分的软件包和一些安装工具,第二张光盘则包含许多附加的软件包。下面是安装过程和注意事项:1)启动安装程序用Linux

26、 的第一张光盘,从光驱引导启动系统。进入一个启动界面,显示“boot:”提示符,直接回车(enter),选择图形模式进行安装。2)选择使用的语言3)选择默认的键盘设置4)选择默认的鼠标设置5)设置安装类型Red Hat Linux 提供了个人桌面、工作站、服务器和定制等多种安装类型,根据具体情况选择个人桌面或定制方式。6)进行硬盘分区对硬盘进行分区是一件非常危险的工作,若没有必要的把握,最好先对重要的数据进行备份,以防不测。对于IDE 硬盘,Red Hat Linux 的驱动器标识符为“hdx”,其中“hd”表明分区所在设备的类型,这里是指IDE 硬盘。“x”为盘号(a 为基本盘,b 为基本从

27、属盘,c 为辅助主盘,d 为辅助从属盘),“”代表分区,前四个分区用数字1 到4 表示,它们是主分区或扩展分区,从5 开始就是逻辑分区。对用户而言无论有几个分区,分给哪个目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构。Red Hat Linux 采用了“装载”的处理方法,将一个分区和一个目录联系起来,因此每个分区都是用来组成整个文件系统的一部分。Linux 最少需要两个分区,一个Linux native(文件)分区,一个Linux swap(交换)分区。其中Linux native 分区是存放Linux 系统文件的分区,它只能用EXT2 的分区类型,在分区时应该将载入点设置为“

28、/”目录。SWAP 分区则用做交换空间,它主要是把主内存上暂时不用得数据存起来,在需要的时候再调进内存内。一般建议分区方案如下:SWAP 分区:SWAP 分区至少要等于系统上实际内存的容量,一般来说它的大小是内存的两倍。/boot 分区,它包含了操作系统的内核和在启动系统过程中所要用到的文件,建这个分区是很有必要的,因为目前大多数的PC 机要受到BIOS 的限制,况且如果有了一个单独的/boot 启动分区,即使主要的根分区出现了问题,计算机依然能够启动。这个分区的大小约在50MB100MB 之间。/分区:这是根目录挂载的位置。系统运行所需要的其它文件都在该分区上,这个分区的大小约在1.7GB5

29、GB 之间。假如是初次安装Linux 系统,你最好选择自动分区的方式。当然,如果你对Linux 较为熟悉,也可以用系统配制的硬盘管理工具Disk Druid 来定制所需要的分区,它既可以根据用户的要求创建和删除硬盘分区,还可以为每个分区管理载入点。7)设置文件系统为EXT28)配置引导装载程序选择LILO 作为引导安装程序。LILO 可以安装在:第一硬盘的主引导区(MBR)或Linux 分区的引导扇。如果你想使用LILO 来做双启动的话,你需要选择第一种,如果是想用Linux 启动软盘或其他系统引导器引导Linux,请选择第二种方式,即将LILO 安装在Linux分区的引导扇区。9)网络配置1

30、0)防火墙配置11)选择其它支持语言12)时区配置13)设置root 密码14)选择软件包组15)筹建引导盘16)配置显卡(可以参考视频内容进行安装)3、VMware 组件工具的安装和使用安装 VMware 虚拟机中的组件工具,实现文件和 WINXP 的共享。4、掌握常用的 Linux 命令的使用和操作方法Linux 登陆和退出文件命令目录和层次命令目录和文件安全性磁盘存储命令进程命令Vi 编辑文件实验四实验四 MakefileMakefile 实验实验实验目的1、了解Makefile的基本概念和基本结构2、初步掌握编写简单Makefile的方法3、了解递归Make的编译过程4、初步掌握利用G

31、NU Make编译应用程序的方法实验原理2、了解 Makefile 的基本概念和基本结构在 Linux 或 Unix 环境下,对于只含有几个源代码文件的小程序(如 hello.c)的编译,可以手工键入 gcc 命令对源代码文件逐个进行编译;然而在大型的项目开发中,可能涉及几十到几百个源文件,采用手工键入的方式进行编译,则非常不方便,而且一旦修改了源代码,尤其头文件发生了的修改,采用手工方式进行编译和维护的工作量相当大,而且容易出错。所以在 Linux 或 Unix 环境下,人们通常利用 GNU make 工具来自动完成应用程序的维护和编译工作。实际上,GNU make 工具通过一个称为 Mak

32、efile 的文件来完成对应用程序的自动维护和编译工作。Makefile 是按照某种脚本语法编写的文本文件,而 GNU make 能够对 Makefile 中指令进行解释并执行编译操作。Makefile 文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。GNU make 工作时的执行步骤如下:读入所有的 Makefile。读入被 include 的其它 Makefile。初始化文件中的变量。推导隐晦规则,并分析所有规则。为所有的目标文件创建依赖关系链。根据依赖关系,决定哪些目标要重新生成。执行生成命令。【实验仪器】1、装有 L

33、inux 操作系统的 PC 机一台2、XSBase270 或 XSBase255 ARM 实验开发平台一套(暂时不用)【实验内容】一、使用命令行的方式手动编译程序方法1、利用文本编辑器创建 hello.c 文件/hello.c/written by Emdoor#include int main()printf(Welcome Emdoor!n);return 1;2、手动编译 hello 应用程序在 hello.c 的目录的终端下输入:rootlocal$ gcc c hello.c rootlocal$gcc hello.o o hello通过 ls 命令查看当前目录下是否生成源代码 he

34、llo.c 的 object 文件 hello.o 和可执行文件 hello,运行可执行文件 hello。查看一下运行结果。rootlocal$./hello3、修改 hello.c 文件,重新手动编译应用程序。4、删除 hello.o 和 hello 文件rootlocal$rm f hello.orootlocal$rm f hello二、利用 GNU make 自动编译应用程序方法1、 利用文本编辑器创建一个 makefile 文件,并将其保存到与 hello.c 相同的目录下。# makefile test for hello program#written by EmdoorCC=g

35、ccCFLAGS=all: hellohello: hello.o$(CC) $(CFLAGS) hello.o o hellohello.o: hello.c$(CC) $(CFLAGS) c hello.c o hello.oclean:rm rf hello *.o2、先后执行如下命令rootlocal$makerootlocal$lsrootlocal$./hello查看并记录所生成的文件和运行的结果。3、执行 make clean 命令:rootlocal$make clean4、修改 hello.c 文件,重复第 2、3 步操作,查看并记录所生成的文件和运行结果,并与手动编译进行比

36、较,写出你的结论。5、重新编辑 makefile 文件(斜黑体表示修改部分)# makefile test for hello program#written by EmdoorCC=gccCFLAGS=OBJS=hello.oall: hellohello: $(OBJS)$(CC) $(CFLAGS) $ -o $hello.o: hello.c$(CC) $(CFLAGS) c $ -o $clean:rm rf hello *.o6、重复第 2,3 步操作,查看并记录所生成的文件和运行的结果。比较这两种操作,写出你的结论。同时指出$ 、$、$在上述 Makefile 中的含义。三、多个

37、.c 文件的编译1、创建文件 hello1.c、hello2.c、hello.h 和 makefile/hello1.c/written by Emdoor#include int main()printf(Welcome Emdoor!n);test2();return 1;/hello2.c/written by Emdoorinclude hello2.h#include void test2(void)printf(Welcome Emdoor! hello2n);/hello2.h/written by Emdoorvoid test2(void);# makefile test f

38、or multi files program#written by EmdoorCC=gccCFLAGS=OBJS=hello1.o hello2.oall: hellohello: $(OBJS)$(CC) $(CFLAGS) $ -o $hello1.o: hello1.c$(CC) $(CFLAGS) c $ -o $hello2.o: hello2.c$(CC) $(CFLAGS) c $ -o $clean:rm rf hello *.o2、先后执行如下命令rootlocal$makerootlocal$lsrootlocal$./hello查看并记录所生成的文件和运行的结果, 写出

39、你的结论。3、修改 makefile 文件(斜黑体表示修改部分)# makefile test for multi files program#written by EmdoorCC=gccCFLAGS=CFILES=$(wildcard *.c)OBJS=$(CFILES:%c=%.o)all: hellohello: $(OBJS)$(CC) $(CFLAGS) o hello $(OBJS).c.o:$(CC) c $ HelpLoad用法load kernel/ramdisk描述把存放在 FLASH 中的映像文件拷贝到 SDRAM 中。在 Autoboot过程中会自动运行,把内核映像从

40、 FLASH 加载到 SDRAM 中。参数Kernel把内核映像从 FLASH 拷贝到 SDRAM 中Ramdisk从 FLASH 中拷贝 RAMDISK 到 SDRAM举例Bboot load kernelbootp用法Bootp描述运行 bootp 命令用来获取 HOST 主机发送的 BOOTP 的数据包,解析BOOTP 的数据包,获取本机的 IP 地址tftp用法Tftp 文件名 address/loader/kernel/root/ramdisk描述通过以太网下载主机的数据或文件到目标平台的 SDRAM参数文件名 - 主机平台需要传输的文件名loader - 把传输到目标平台的文件放置

41、在 SDRAM 的 loader 区域kernel - 把传输到目标平台的文件放置在 SDRAM 的 kernel 区域root - 把传输到目标平台的文件放置在 SDRAM 的 root 区域ramdisk - 把传输到目标平台的文件放置在 SDRAM 的 ramdisk 区域address - 把传输到目标平台的文件放置在 SDRAM 的指定地址举例Bboot tftp zImage kernelflash用法Flash loader/kernel/root/ramdisk描述把 SDRAM 中的数据烧录到 FLASH 中特定的地址参数loader - 把 SDRAM 中的数据烧录到 FL

42、ASH 中的 loader 区域kernel 把 SDRAM 中的数据烧录到 FALSH 中的 kernel 区域root 把 SDRAM 中的数据烧录到 FLASH 中的 root 区域ramdisk 把 SDRAM 中的数据烧录到 FLASH 中的 ramdisk 的区域举例Bboot flash kernelerase用法erase loader/kernel/ramdisk/root描述擦除 FALSH 中的相应区域参数loader 擦除 FALSH 中 loder 区域kernel 擦除 FLASH 中的 kernel 区域root 擦除 FLASH 中的 root 区域ramdis

43、k 擦除 FLASH 中的 ramdisk 区域举例bboot erase kernel 实验六实验六 LinuxLinux 内核编译实验内核编译实验【实验目的】1、了解 Linux 内核源代码的目录结构及各目录的相关内容2、了解 Linux 内核各配置选项内容和作用3、掌握 Linux 内核配置文件 config.in 的作用4、掌握 Linux 内核的编译过程5、掌握将新增内核代码加入到 Linux 内核结构中的方法【实验原理】1内核源代码目录介绍Linux 内核源代码可以从网上下载(/pub/linux/v2.4) 。一般主机平台的 Linux (

44、如红旗 Linux)源代码在根目录下的/usr/src/linux 目录下。内核源代码的文件按树形结 构进行组织的,在源代码树最上层的可以看到如下的一些目录:(1) 、arch:arch 子目录包括所有与体系结构相关的内核代码。arch 的每一个子目录都 代表一个 Linux 所支持的体系结构。例如:arm 目录下就是 arm 体系架构的处理器目录,包 含我们使用的 PXA 处理器。(2) 、include:include 子目录包括编译内核所需要的头文件。与 ARM 相关的头文件 在 include/asm-arm 子目录下。(3) 、init:这个目录包含内核的初始化代码,但不是系统的引导

45、代码,其中所包含 main.c和 Version.c 文件是研究 Linux 内核的起点。(4) 、mm:该目录包含所有独立于 CPU 体系结构的内存管理代码,如页式存储管理 内存的分配和释放等。与 ARM 体系结构相关的代码在 arch/arm/mm 中。(5) 、Kernel:这里包括主要的内核代码,此目录下的文件实现大多数 Linux 的内核函 数,其中最重要的文件是 sched.c。与 Xscale 体系结构相关的代码在 arch/arm-pxa/kernel 目录 中。(6) 、Drives:此目录存放系统所有的设备驱动程序,每种驱动程序各占一个子目录。(a) 、/block:块设备

46、驱动程序。块设备包括 IDE 和 scsi 设备。(b) 、/char:字符设备驱动程序。如串口、鼠标等。(c) 、/cdrom:包含 Linux 所有的 CD-ROM 代码。(d) 、/pci:PCI 卡驱动程序代码,包含 PCI 子系统映射和初始化代码等。(e) 、/scsi:包含所有的 SCSI 代码以及 Linux 所支持的所有的 SCSI 设备驱动程序代码。(f) 、/net:网络设备驱动程序。(g) 、/sound:声卡设备驱动程序。(7) 、lib 目录放置内核的库代码;(8) 、net 目录包含内核与网络的相关的代码;(9) 、ipc 目录包含内核进程通信的代码;(10) 、f

47、s 目录是所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持一个文件系统,如 JFFS2;(11) 、scripts 目录包含用于配置内核的脚本文件等。每个目录下一般都有 depend 文件 和一个 makefile 文件,他们是编译时使用的辅助文件,仔细阅读这两个文件对弄清各个文件 之间的相互依托关系很有帮助。2内核的配置的基本结构Linux 内核的配置系统由四个部分组成(1) 、Makefile:分布在 Linux 内核源码中的 Makefile,定义 Linux 内核的编译规则;顶层 Makefile 是整个内核配置、编译的总体控制文件;(2) 、配置文件(config.i

48、n):给用户提供配置选择的功能;.config:内核配置文件,包 括由用户选择的配置选项,用来存放内核配置后的结果;(3) 、配置工具:包括对配置脚本中使用的配置命令进行解释的配置命令解释器和配置 用户界面(基于字符界面:make config;基于 Ncurses 图形界面:make menuconfig;基于 xWindows 图形界面:make xconfig)(4) 、Rules.make:规则文件,被所有的 Makefile 使用。3编译内核的常用命令精简 Linux 内核常用命令包括:Make Config,dep,clean,mrproper,zImage,bzImage,Mod

49、ules,Modules_Install(1) 、Make config:内核配置,调用./scripts/Configure 按照 arch/i386/config.in 来进行 配置。命令执行后产生文件.config,其中保存着配置信息。下次在做 make config 时将产生 新的.config 文件,原文件 config 更名为 config.old(2)、 make dep:寻找依存关系。产生两个文件. depend 和.hdepend,其中.hdepend 表 示每个.h 文件都包含其他哪些嵌入文件。而.depend 文件有多个,在每个会产生目标文件(.o) 文件的目录下均有,它

50、表示每个目标文件都依赖于哪些嵌入文件(.h)(3)、make clean:清除以前构核所产生的所有的目标文件,模块文件,核心以及一些临时文件等,不产生任何文件(4)、 make rmproper:删除所有以前在构核过程所产生的所有文件,及除了做 make clean 外,还要删除.config,.depend 等文件,把核心源码恢复到最原始的状态。下次构核时必须进行重新配置;(5)、make,make zImage, make bzImage:(a) 、make:构核。通过各目录的 Makefile 文件进行,会在各个目录下产生一大堆目 标文件,如核心代码没有错误,将产生文件 vmlinux,

51、这就是所构的核心。并产生映像文件 system.map 通过各目录的 makefile 文件进行。.version 文件中的数加 1,表示版本号的变化。(b)、makezImage:在make的基础上产生压缩的核心映像文件./arch/$(ARCH)/boot/zImage以及./arch/$(ARCH)/boot/compressed 目录下产生一些临时文件。(c)、make bzImage:在 make 的基础上产生压缩比例更大的核心映像文件./arch/$(ARCH)/ boot/bzImage 以及./arch/$(ARCH)/boot/compressed 目录下产生一些临时文件。4

52、内核编译过程(1)make mrproper:删除所有以前在构核过程所产生的所有文件(2)make menuconfig:内核配置(3)make dep:寻找依存关系(4)make zImage:产生压缩的核心映像文件内核编译完毕之后,生成 zImage 内核映象文件保存在源代码的 arch/arm/boot/目录下。5内核配置项介绍首先切换 linux 源代码所在的目录,并终端输入 make menuconfig,系统弹出基于 Ncurses 内核配置图形界面,便可进行内核选项的配置。root$make menuconfig6添加驱动到 linux 内核对于一个开发者来说,将自己开发的内核代

53、码添加到 Linux 内核中,需要有三个步骤。(1)确定把自己的开发代码放入到内核的位置;(2)把自己开发的功能增加到 Linux 内核的配置选项中,使用户能够选择此功能;(3)构建子目录 Makefile,根据用户的选择,将相应的代码编译 Linux 内核中。【实验仪器】1、装有 Linux 操作系统的 PC 机一台;2、XSBase270 或 XSBase255 ARM 实验开发平台一套【实验内容】(1)利用光盘上提供的 Linux 源代码,具体分析递归性 makefile 的结构,画出一个从最顶层 makefile 到最底层所经过的文件路径和所需要的变量。(2)利用光盘上提供的 Linu

54、x 源代码,写出编译 Linux 内核的具体过程。(3)利用光盘上提供的 Linux 源代码,然后用 make menuconfig 命令对内核的配置进行修改,记下具体修改的配置选项并保存退出,然后用 diff 命令比较.config 和.oldconfig.old 两个新旧配置的差别,同时与记下的配置选项进行比较,根据比较结果,写出你的结论。实验七实验七 驱动程序结构实验驱动程序结构实验实验目的1、了解Linux 驱动程序的结构2、掌握Linux 驱动程序常用结构体和操作函数的使用方法3、初步掌握Linux 驱动程序的编写方法及过程4、掌握Linux 驱动程序的加载方法实验原理1驱动程序介绍

55、驱动程序负责将应用程序如读、写等操作正确无误的传递给相关的硬件,并使硬件能够做出正确反应的代码。驱动程序像一个黑盒子,它隐藏了硬件的工作细节,应用程序只需要通过一组标准化的接口实现对硬件的操作。2Linux设备驱动程序分类Linux 设备驱动程序在Linux 的内核源代码中占有很大的比例,源代码的长度日益增加,主要是驱动程序的增加。虽然Linux 内核的不断升级,但驱动程序的结构还是相对稳定。Linux 系统的设备分为字符设备(char device),块设备(block device)和网络设备(network device)三种。字符设备是指在存取时没有缓存的设备,而块设备的读写都有缓存来

56、支持,并且块设备必须能够随机存取(random access)。典型的字符设备包括鼠标,键盘,串行口等。块设备主要包括硬盘软盘设备,CD-ROM等。网络设备在Linux 里做专门的处理。Linux 的网络系统主要是基于BSD unix 的socket 机制。在系统和驱动程序之间定义有专门的数据结构(sk_buff)进行数据传递。系统有支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多协议的支持。3驱动程序的结构应用程序经过系统调用,进入核心层,内核要控制硬件需要通过驱动程序实现,驱动程序相当于内核与硬件之间的“系统调用”。内核模块内核模块是Linux 内核的重要组成要素,内核模块能在L

57、inux系统启动之后能够动态进行装载和卸载,因此不需对内核进行重新编译或重启系统就可将内核的一部分替换掉,Linux 内核的所有设备驱动,文件系统,网络协议等可做成模块的形式来提供。在所有的模块中需记录编译的内核版本信息,并与当前执行的内核版本一致。即,模块具有版本依赖性,如果不一样就会出错,当然可以在模块程序中的include之前通过宏定义#define_NO_VERSION_表明不定义模块的版本信息。内核模块程序与一般应用程序之间主要不同之处是,模块程序没有main()函数,模块程序在装载时调用init_module(void)函数添加到内核中,在卸载时调用voidcleanup_modu

58、le( )函数从内核中卸载。另外一个应用程序从头到尾只执行一个任务,但一个模块可以把响应未来请求的事务登记到内核中,然后等待系统调用。init_module( ) register_capability( )printk( ). . . . .cleanup_module( ) unregister_capability( )insmodrmmodModule Kernelcapabilities图 7-2内核模块程序结构4主、从设备号应用程序通过设备文件系统(devfs)的名字(或节点)访问硬件设备,所有的设备节点在/dev目录下。利用mknod命令生成设备文件系统的节点,但只有超级用户才能

59、生成设备文。Mknod 命令必须要有设备名和设备类型,主设备号(Major Number),次设备号(Minor Number)等3 个参 数。主设备号用于内核区分设备驱动,次设备号用于设备驱动区分设备。一个设备驱动可能控制多个设备。新的设备驱动要有新的主设备号。在内核源代码的Documentation /devices.txt中定义了所有设备的主设备号。在创建设备的时候不要与常用的设备好冲突。下面/dev/hda1 是设备名,b 表示block设备(c表示字符设备)。127是主设备号,1是次设备号。次设备号可以是0 255 之间的值,限制为8bit。rootlocalhost$ mknod

60、/dev/hda1 b 127 1rootlocalhost$ ls al /dev/hda1rootlocalhost$ brw-rw- 1 root disk 3 1 Mar 25 12:00 /dev/hda15驱动程序基本框架如果采用模块方式编写设备驱动程序时,通常至少要实现设备初始化模块、设备打开模块、数据读写与控制模块、中断处理模块(有的驱动程序没有)、设备释放模块和设备卸载模块等几个部分。下面给出一个典型的设备驱动程序的基本框架。,从中不难体会到这几个关键部分是如何组织起来的。/* 打开设备模块 */static int xxx_open(struct inode *inode, struct file *file

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论