嵌入式操作系统实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《嵌入式操作系统》实验报告
班级计算机
学号
姓名
指导教师庄旭菲
内蒙古工业大学信息工程学院计算机系
2018年6月
实验一 Linux内核移植与编译实验
1. 实验目的
了解 Linux 内核相关知识与内核结构
了解 Linux 内核在 ARM 设备上移植的基本步骤和方法
掌握 Linux 内核裁剪与定制的基本方法
2. 实验内容
分析 Linux 内核的基本结构,了解 Linux 内核在 ARM 设备上移植的一些基本步骤及常识。
学习 Linux 内核裁剪定制的基本配置方法,利用 UP-Magic210 型设备配套 Linux 内核进行自定义功能(如helloworld 显示)的添加,并重新编译内核源码,生成内核压缩文件 zImage,下载到 UP-Magic210 型设备中测试。
3. 实验步骤
实验目录:/UP-Magic210/SRC/kernel/编译内核:在宿主机端为UP-Magic210 设备的Linux 内核编写简单的测试驱动(内核)程序并修改内核目录中相关文件,添加对测试驱动程序的支持。
(1)、使用 vim 编辑器手动编写实验代码
内如如下:
#include <linux/>
#include <linux/>
MODULE_LICENSE("Dual BSD/GPL");
(3)、进入实验内核源码目录修改 driver/char/目录下的 Makefile 文件,按照内核中Makefile 语法添加 helloworld程序的编译支持
[root@localhost vi drivers/char/Makefile
在 Makefile 中(大约在 91 行)添加如下一行
obj-$(CONFIG_TOSHIBA) +=
obj-$(CONFIG_I8K) +=
obj-$(CONFIG_DS1620) +=
obj-$(CONFIG_HW_RANDOM) += hw_random/
obj-$(CONFIG_HELLO_MODULE) +=
obj-$(CONFIG_PPDEV) +=
(4)、运行 make menuconfig 配置内核对 helloworld 程序的支持:
[root@localhost make distclean
[root@localhost make menuconfig
先加载内核配置单,如图:
然后进入到 Device Drivers --->菜单中如图:
进入到 Character devices--->如图:
进入该菜单会发现[ ] Hello World Test 选项,按下空格将其静态编译进内核退出保存内核配置
(5)、重新编译内核
在内核源码的顶层目录下编译内核
[root@localhost make
scripts/kconfig/conf -s arch/arm/Kconfig
CHK include/linux/
CHK include/generated/
make[1]:“include/generated/”是最新的。
CALL scripts/
CHK include/generated/
CC drivers/char/
LD drivers/char/
LD drivers/
LD
MODPOST
初次编译内核源码,由内核代码庞大,所需较长时间(大约几分钟至 10 几分钟不等)。
编译成功后会在内核源码目录的 arch/arm/boot/目录下生成内核压缩文件 zImage。
[root@localhost ls arch/arm/boot/zImage
arch/arm/boot/zImage
[root@localhost 、将新生成的内核镜像文件 zImage 烧写到 UP-Magic210 型设备中,这里不在赘述(烧写步骤可以参考文档“UP-Magic210出厂程序烧写手册(LINUX)第23页)。
新内核烧写成功后启动 UP-Magic210 型系统,可以在串口终端中查看到 Linux 内核在启动过程中打印出来的如下信息:
S3C_LCD clock got enabled :: Mhz
Window[0]- FB1 : map_video_memory: clear ff600000:00096000
FB1 : map_video_memory: dma= cpu=ff600000 size=00096000
Console: switching to colour frame buffer device 80x30
fb-52: frame buffer device
lp: driver loaded but no devices found
###################Hello, world###################
ppdev: user-space parallel port driver
: ttySAC0 at MMIO 0x7f005000 (irq = 37) is a S3C
: ttySAC1 at MMIO 0x7f005400 (irq = 38) is a S3C
: ttySAC2 at MMIO 0x7f005800 (irq = 39) is a S3C
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
loop: loaded (max 8 devices)
nbd: registered device at major 43
dm9000 Ethernet Driver
eth0: dm9000 at c7866000,c7866002 IRQ 78 MAC: 00:22:12:34:56:90
S3C IrDA driver, (c) 2006 Samsung Electronics
Linux video capture interface:
可以看到在终端上打印出###################Hello, world###################信息。
同样进入 ARM 系统后也可以通过 dmesg 命令查看内核启动信息。
[root@UP-TECH yaffs]# dmesg
S3C_LCD clock got enabled :: Mhz
Window[0]- FB1 : map_video_memory: clear ff600000:00096000
FB1 : map_video_memory: dma= cpu=ff600000 size=00096000
Console: switching to colour frame buffer device 80x30
fb-52: frame buffer device
lp: driver loaded but no devices found
###################Hello, world###################
ppdev: user-space parallel port driver
: ttySAC0 at MMIO 0x7f005000 (irq = 37) is a S3C
: ttySAC1 at MMIO 0x7f005400 (irq = 38) is a S3C
: ttySAC2 at MMIO 0x7f005800 (irq = 39) is a S3C
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
4.实验结果
思考:如何能在Linux系统启动时,输出显示自定义的文本信息,请修改Linux内核启动代码,完成此功能。
5. 实验中遇到的问题及解决方法
在实验中遇到一些问题,例如在复制的时候我记得原来用cp??–a??/tmp/?就可以了,可这次不行必须要用cp??–a??/tmp/??./到自己的目录下。
不过最后都顺利解决了问题,在编译复习了make menuconfig的编译配置。
实验二根文件系统实验
1. 实验目的
了解 UP-Magic210 魔法师实验套件 Linux 系统下根文件系统结构
掌握根文件系统的搭建过程
掌握 busybox、mkcramfs 等工具的使用方法
2. 实验内容
使用 busybox 生成文件系统中的命令部分,使用 mkcramfs 工具制作 CRAMFS 格式的根文件系统。
分析根文件系统 etc 目录下重要配置文件的格式及语法,熟悉根文件系统的启动过程3.实验步骤
实验目录:/UP-Magic210/SRC/kernel/一、在内核中添加文件系统类型支持
(1)、进入宿主机中 UP-Magic210 型光盘内核目录:
[root@localhost ~]# cd /UP-Magic210/SRC/kernel/(2)、运行 make menuconfig 命令配置内核文件系统相关支持
添加对 CRAMFS 根文件以及 YAFFS2 文件系统系统支持
进入 File systems --->菜单
进入 Miscellaneous filesystems --->菜单
选择<*> Compressed ROM file system support (cramfs) 支持,如图:
选择<*> YAFFS2 file system support 支持,配置如下图
退出保存内核配置
运行make编译内核,重新烧写内核。
二、根文件系统的实现
(1)、制作 BUSYBOX 工具集
进入本次实验目录
[root@localhost rootfs]# cd /UP-Magic210/SRC/rootfs/
[root@localhost rootfs]# ls
rootfs
解压压缩包
[root@localhost rootfs]# tar xjvf 产生目录
[root@localhost rootfs]# ls
rootfs
进入目录进行 busybox 的修改及配置
修改此目录的 Makefile 文件,更改 ARCH 和 CROSS_COMPILE =宏定义,如下:CROSS_COMPILE = arm-none-linux-gnueabi-
ARCH = arm
退出保存。
运行 make menuconfig 对工具集进行定制
[root@localhost make menuconfig
进入 Busybox Settings --->选项
进入 Busybox Library Tuning --->选项
选中[*]Fancy shell prompts 支持
进入 Miscellaneous Utilities --->选项
去除[ ] inotifyd 选项
接下来的配置可以根据具体情况来设置或裁剪相关工具。
退出保存设置。
编译 busybox
[root@localhost make
安装 busybox
[root@localhost make install
成功后会在当前目录下生成 _install 目录,编译的工具也都集成在该安装目录下。
[root@localhost cd _install/
[root@localhost _install]# ls
bin linuxrc sbin usr
[root@localhost _install]#
可以看到_install 目录下生成了根文件系统常用的命令及工具,接下来的工作,用户
可以根据需要将_install目录下生成的命令拷贝到根文件系统相应目录下。
例如:将从 busybox 生成的 which 命令拷贝到根文件系统目录的 usr/bin 目录下,这样,我们的根文件系统就支持 which 命令了。
(2)、制作 CRAMFS 根文件系统镜像
实验中已经提供了 mkcramfs 制作工具以及脚本文件,用户只需执行脚本文件来使用mkcramfs 制作根文件系统镜像即可。
当然也可以手动的执行命令:./mkcramfs rootfs_up210
[root@localhost rootfs]# ./
此时在当前目录下生成根文件系统镜像文件
[root@localhost rootfs]# ls
mkcramfs rootfs_up210
三、烧写根文件系统
将新生成的根文件系统镜像文件烧写到UP-Magic210 型设备中进行测试,这里不在赘述(烧写步骤可以参考文档“UP-Magic210出厂程序烧写手册(LINUX)第24页)。
如果用户新添加了相关命令或工具(例如 which 命令)启动系统后可以验证用户添加入的新命令或工具。
4.实验结果
5. 实验中遇到的问题及解决方法
make 编译有错误,进行源代码的修改。
之后再make menuconfig中将这个宏对应的东西配置成没有就好了,如果没有这个宏,那么就直接用出错的那个文件的名字找就行了,找
到后给它去掉,将来make的时候就不会编译这个文件了,在次进行make 编译后,编译出来了busybox这个东西,就在证明编译通过了。
实验三模块方式驱动实验
1. 实验目的
学习在 LINUX 下进行驱动设计的原理
掌握使用模块方式进行驱动开发调试的过程
2. 实验内容
在 PC 机上编写简单的虚拟硬件驱动程序并进行调试,实验驱动的各个接口函数的实现,分析并理解驱动与应用程序的交互过程。
在 ARM 设备上创建设备驱动节点,编写用户空间应用程序,对驱动程序进行测试。
3. 实验步骤
(1)、编译驱动程序/UP-Magic210/SRC/exp/driver/01_demo /,手工加载驱动程序,通过设备号建立驱动设备节点,执行应用程序测试该驱动及设备,分析驱动程序。
进入实验目录编译源程序
[root@localhost /]# cd /UP-Magic210/SRC/exp/driver/01_demo/
清除中间代码,重新编译
[root@localhost 01_demo]# make clean
[root@localhost 01_demo]# make
当前目录下生成驱动程序和应用测试程序test_demo。
启动 UP-Magic210 实验系统,连好网线、串口线。
通过串口终端挂载宿主机实验目录(注意:虚拟机IP地址需要设置为:)。
[root@UP-TECH yaffs]# mount -t nfs -o nolock /mnt/nfs
进入串口终端的 NFS 共享实验目录
[root@UP-TECH yaffs]# cd /mnt/nfs/SRC/exp/driver/01_demo/
手动加载驱动程序
[root@UP-TECH 01_demo]# insmod
通过设备号建立驱动设备节点
[root@UP_210 01_demo]# mknod /dev/demo c 251 0
执行应用程序测试该驱动及设备,分析应用程序测试结果。
[root@UP-TECH 01_demo]# ./test_demo
(2)、请参考驱动程序,编写一个虚拟字符设备驱动程序并进行调试,该虚拟字符设备驱动程序完成如下功能:
在内核模块初始化函数中,实现动态申请设备号并注册该设备,动态建立设备文件
节点;
在内核模块的退出函数中,实现设备注销,删除该设备文件节点;
实现file_operations设备驱动文件结构体中的open、read、write、ioctl和
release函数功能,其中:
open函数:设置一个计数器count,每调用一次open函数,计数器count加
1。
read函数:读取用户写入的字符串数据的排列结果。
write函数:实现将用户写入的字符串数据,按照每个字符的ASCII值逆序或
升序排序(根据开关值asc排序:asc=0,逆序排序;asc=1,升序排序;)。
ioctl函数:设置排序方式开关值asc。
release函数:每调用一次release函数,计数器count减1。
4.实验结果
5. 实验中遇到的问题及解决方法。
没有修改makefile文件直接进行编译导致出错。
实验前没有认真阅读实验原理,看懂实验代码,所以在使用make命令以后无法实现。
最后在同学的帮助下找到了原因。
忽略了自己使用的是gcc编译而不是交叉编译,因而没有设置节点。
尝试了很多次以后才发现了问题,期间以为是test_demo文件的问题,但是导入导出很多次都没有解决,问了同学才找到了问题。
实验四 LED 驱动及控制实验
1. 实验目的
了解 ARM 设备外围电路结构与接口原理
熟悉 Linux 系统下硬件驱动编程
编程实现对嵌入式设备上 LED 灯的控制
2. 实验内容
阅读 UP-Magic210 平台硬件文档,熟悉 ARM 处理硬件外围接口电路
编程实现 UP-Magic210 平台设备上 LED 驱动及应用测试程序
3. 实验步骤
编写UP-Magic210 平台设备上 LED 驱动及应用测试程序并进行调试,该LED驱动程序完成如下功能:
在内核模块初始化函数中,实现动态申请设备号并注册该设备,动态建立设备文件
节点;
在内核模块的退出函数中,实现设备注销,删除该设备文件节点;
实现file_operations设备驱动文件结构体中的ioctl函数,完成如下功能:一次调用控制所有的LED亮或灭;
控制单个LED亮或灭;
实现流水灯显示,流水灯显示效果自行定义,流水灯循环显示次数由用户应用
程序传入。
程序:
驱动程序分析:
#include <linux/>
#include <linux/>
#include <linux/>
#include <linux/>
#include <linux/>
#include <linux/>
#include <asm/>
#include <asm/arch/>
#include <asm/>
MODULE_LICENSE("GPL");
#define DEVICE_NAME "leds" wner = THIS_MODULE,
.ioctl = uptech_leds_ioctl,
};
n");
return -1;
}
led led_number on|off\n");
fprintf(stderr, "Options:\n");
fprintf(stderr, "\t led_number from 0 to 4\n");
fprintf(stderr, "\t on: 1 off: 0\n");
exit(1);
}
验结果
无
5. 实验中遇到的问题及解决方法
本次实验了解了ARM 设备外围电路结构与接口原理;熟悉了 Linux 系统下硬件驱动编程过程;通过编程对嵌入式设备上 LED 灯的控制,对嵌入式开发有了进一步的认识和理解,实验结果尚未得到验证。
实验五 WEB服务器移植与模块驱动综合实验
1. 实验目的
了解常用的嵌入式Web服务器及其原理
掌握嵌入式Web服务器boa的移植方法
掌握基本的CGI程序设计方法
熟悉UP-Magic210 型嵌入式实验平台下的传感器及控制设备驱动程序设计
2. 实验内容
对嵌入式Web服务器boa源码进行配置、编译,完成移植
编写CGI程序,调用多个设备模块驱动
在嵌入式Web服务器boa上运行动态网页,运行测试CGI程序
3. 实验步骤
(1)、将老师提供的实验文件“实验五.rar”在Windows下解压,拷贝到虚拟机Linux下的/UP-Magic210目录中。
(2)、切换目录到/UP-Magic210/boa,解压文件 boa]# cd /UP-Magic210/boa/
[root@localhost boa]# tar -xzvf (3)、配置boa生成Makefile
[root@localhost boa]# cd src]# ./configure
(4)、修改源码文件
修改Makefile:
修改:
CC = gcc
CPP = gcc -E
为:
CC = arm-none-linux-gnueabi-gcc
CPP = arm-none-linux-gnueabi-gcc –E
修改:
修改:
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff 为:
#define TIMEZONE_OFFSET(foo) foo->tm_gmtoff
修改:
修改:
if (setuid(0) != -1) {
DIE("icky Linux kernel bug!");
}
为:
[root@UP-TECH cgi-bin]# /mnt/yaffs/boa
4.实验结果
5. 实验中遇到的问题及解决方法
???? 修改Makefile文件后未保存,然后运行make进行编译。