《嵌入式操作系统》实验报告

《嵌入式操作系统》实验报告
《嵌入式操作系统》实验报告

《嵌入式操作系统》实验报告

班级计算机

学号

姓名

指导教师庄旭菲

工业大学信息工程学院计算机系

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/linux-2.6.35.7/

编译核:在宿主机端为UP-Magic210 设备的Linux 2.6.35.7 核编写简单的测试驱动(核)程序 helloworld.c 并修改核目录中相关文件,添加对测试驱动程序的支持。

(1)、使用 vim 编辑器手动编写实验代码 helloworld.c

helloworld.c 如如下:

#include

#include

MODULE_LICENSE("Dual BSD/GPL");

//驱动程序入口函数

static int hello_init(void)

{

printk(KERN_ALERT "##############Hello, world############\n");

return 0;

}

//驱动程序出口函数

static void hello_exit(void)

{

printk(KERN_ALERT "###############Goodbye, world#########\n");

}

module_init(hello_init);

module_exit(hello_exit);

有关驱动程序的编写规,请参考课程教材,本实验只在编写简单的驱动(核)程序并加入到 Linux核目录树中,使用户熟悉编译核的过程。该驱动程序是向终端输出相关程序信息。

编写好 helloworld.c 后将其拷贝到核源码树的 drivers/char/目录下。

[rootlocalhost /]# cp helloworld.c /UP-Magic210/SRC/kernel/linux-2.6.35.7/drivers/char/

(2)、进入实验核源码目录修改 driver/char/目录下的 Kconfig 文件,按照 Kconfig 语法添加 helloworld 程序的菜单支持

[rootlocalhost /]# cd UP-Magic210/SRC/kernel/linux-2.6.35.7/

[rootlocalhost linux-2.6.35.7]# vi drivers/char/Kconfig

例如:在 Kconfig 文件中的 source“driver/char/hw_random/Kconfig”下面添加如下:

source“driver/char/hw_random/Kconfig”

config HELLO_MODULE

bool "Hello World Test"

depends on CPU_S5PV210

help

This is a demo to test kernel experiment On UP-Magic210.

(3)、进入实验核源码目录修改 driver/char/目录下的 Makefile 文件,按照核中Makefile 语法添加 helloworld程序的编译支持

[rootlocalhost linux-2.6.35.7]# vi drivers/char/Makefile

在 Makefile 中(大约在 91 行)添加如下一行

obj-$(CONFIG_TOSHIBA) += toshiba.o

obj-$(CONFIG_I8K) += i8k.o

obj-$(CONFIG_DS1620) += ds1620.o

obj-$(CONFIG_HW_RANDOM) += hw_random/

obj-$(CONFIG_HELLO_MODULE) += helloworld.o obj-$(CONFIG_PPDEV) += ppdev.o

(4)、运行 make menuconfig 配置核对 helloworld 程序的支持:

[rootlocalhost linux-2.6.35.7]# make distclean

[rootlocalhost linux-2.6.35.7]# make menuconfig

先加载核配置单,如图:

然后进入到 Device Drivers --->菜单中如图:

进入到 Character devices--->如图:

进入该菜单会发现[ ] Hello World Test 选项,按下空格将其静态编译进核退出保存核配置

(5)、重新编译核

在核源码的顶层目录下编译核

[rootlocalhost linux-2.6.35.7]# make

scripts/kconfig/conf -s arch/arm/Kconfig

CHK include/linux/version.h

CHK include/generated/utsrelease.h

make[1]:“include/generated/mach-types.h”是最新的。

CALL scripts/checksyscalls.sh

CHK include/generated/compile.h

CC drivers/char/helloworld.o

LD drivers/char/built-in.o

LD drivers/built-in.o

LD vmlinux.o

MODPOST vmlinux.o

初次编译核源码,由核代码庞大,所需较长时间(大约几分钟至 10 几分钟不等)。编译成功后会在核源码目录的 arch/arm/boot/目录下生成核压缩文件 zImage。

[rootlocalhost linux-2.6.35.7]# ls arch/arm/boot/zImage

arch/arm/boot/zImage

[rootlocalhost linux-2.6.35.7]#

(6)、将新生成的核镜像文件 zImage 烧写到 UP-Magic210 型设备中,这里不在赘述(烧写步骤可以参考文档“UP-Magic210出厂程序烧写手册(LINUX)V1.0.pdf”第23页)。新核烧写成功后启动 UP-Magic210 型系统,可以在串口终端中查看到 Linux 核在启动过程中打印

出来的如下信息:

S3C_LCD clock got enabled :: 133.000 Mhz

Window[0]- FB1 : map_video_memory: clear ff600000:00096000

FB1 : map_video_memory: dma=57100000 cpu=ff600000 size=00096000

Console: switching to colour frame buffer device 80x30

fb-1069494052: frame buffer device

lp: driver loaded but no devices found

###################Hello, world###################

ppdev: user-space parallel port driver

s3c-uart.0: ttySAC0 at MMIO 0x7f005000 (irq = 37) is a S3C

s3c-uart.1: ttySAC1 at MMIO 0x7f005400 (irq = 38) is a S3C

s3c-uart.2: 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: v2.00

可以看到在终端上打印出###################Hello, world###################信息。同样进入 ARM 系统后也可以通过 dmesg 命令查看核启动信息。

[rootUP-TECH yaffs]# dmesg

S3C_LCD clock got enabled :: 133.000 Mhz

Window[0]- FB1 : map_video_memory: clear ff600000:00096000

FB1 : map_video_memory: dma=57100000 cpu=ff600000 size=00096000 Console: switching to colour frame buffer device 80x30

fb-1069494052: frame buffer device

lp: driver loaded but no devices found

###################Hello, world###################

ppdev: user-space parallel port driver

s3c-uart.0: ttySAC0 at MMIO 0x7f005000 (irq = 37) is a S3C

s3c-uart.1: ttySAC1 at MMIO 0x7f005400 (irq = 38) is a S3C

s3c-uart.2: 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/linux-2.4.18-br.tar.gz 就可以了,可这次不行必须要用cp –a /tmp/linux-2.4.18-br.tar.gz ./到自己的目录下。不过最后都顺利解决了问题,

在编译复习了make menuconfig的编译配置。

实验二根文件系统实验

1. 实验目的

了解 UP-Magic210 魔法师实验套件 Linux 系统下根文件系统结构

掌握根文件系统的搭建过程

掌握 busybox、mkcramfs 等工具的使用方法

2. 实验容

使用 busybox 生成文件系统中的命令部分,使用 mkcramfs 工具制作 CRAMFS 格式的根文件系统。

分析根文件系统 etc 目录下重要配置文件的格式及语法,熟悉根文件系统的启动过程3.实验步骤

实验目录:/UP-Magic210/SRC/kernel/linux-2.6.35.7/

/UP-Magic210/SRC/rootfs/

一、在核中添加文件系统类型支持

(1)、进入宿主机中 UP-Magic210 型光盘核目录:

[rootlocalhost ~]# cd /UP-Magic210/SRC/kernel/linux-2.6.35.7/

(2)、运行 make menuconfig 命令配置核文件系统相关支持

添加对 CRAMFS 根文件以及 YAFFS2 文件系统系统支持

进入 File systems --->菜单

进入 Miscellaneous filesystems --->菜单

选择<*> Compressed ROM file system support (cramfs) 支持,如图:选择<*> YAFFS2 file system support 支持,配置如下图

退出保存核配置

运行make编译核,重新烧写核。

二、根文件系统的实现

(1)、制作 BUSYBOX 工具集

进入本次实验目录

[rootlocalhost rootfs]# cd /UP-Magic210/SRC/rootfs/

[rootlocalhost rootfs]# ls

bash-4.0.tar.bz2 busybox-1.19.3.tar.bz2 rootfs

解压 busybox-1.19.3.tar.bz2 压缩包

[rootlocalhost rootfs]# tar xjvf busybox-1.19.3.tar.bz2

产生 busybox-1.19.3 目录

[rootlocalhost rootfs]# ls

bash-4.0.tar.bz2 busybox-1.19.3 busybox-1.19.3.tar.bz2 rootfs

进入 busybox-1.19.3 目录进行 busybox 的修改及配置

修改此目录的 Makefile 文件,更改 ARCH ?和 CROSS_COMPILE ?=宏定义,如下:CROSS_COMPILE ?= arm-none-linux-gnueabi-

ARCH ?= arm

退出保存。

运行 make menuconfig 对工具集进行定制

[rootlocalhost busybox-1.19.3]# make menuconfig

进入 Busybox Settings --->选项

进入 Busybox Library Tuning --->选项选中[*]Fancy shell prompts 支持

进入 Miscellaneous Utilities --->选项去除[ ] inotifyd 选项

接下来的配置可以根据具体情况来设置或裁剪相关工具。

退出保存设置。

编译 busybox

[rootlocalhost busybox-1.19.3]# make

安装 busybox

[rootlocalhost busybox-1.19.3]# make install

成功后会在当前目录下生成 _install 目录,编译的工具也都集成在该安装目录下。

[rootlocalhost busybox-1.19.3]# cd _install/

[rootlocalhost _install]# ls

bin linuxrc sbin usr

[rootlocalhost _install]#

可以看到_install 目录下生成了根文件系统常用的命令及工具,接下来的工作,用户可以根据需要将_install目录下生成的命令拷贝到根文件系统相应目录下。

例如:将从 busybox 生成的 which 命令拷贝到根文件系统目录的 usr/bin 目录下,这样,我们的根文件系统就支持 which 命令了。

(2)、制作 CRAMFS 根文件系统镜像

实验中已经提供了 mkcramfs 制作工具以及 mkrootfs.sh 脚本文件,用户只需执行mkrootfs.sh 脚本文件来使用mkcramfs 制作根文件系统镜像即可。

当然也可以手动的执行命令:./mkcramfs rootfs_up210 rootfs_up210.cramfs

[rootlocalhost rootfs]# ./mkrootfs.sh

此时在当前目录下生成根文件系统镜像文件 rootfs_up210.cramfs

[rootlocalhost rootfs]# ls

mkcramfs mkrootfs.sh rootfs_up210 rootfs_up210.cramfs

三、烧写根文件系统

将新生成的根文件系统镜像文件rootfs_up210.cramfs烧写到UP-Magic210 型设备中进行测试,这里不在赘述(烧写步骤可以参考文档“UP-Magic210出厂程序烧写手册(LINUX)V1.0.p df”第24页)。如果用户新添加了相关命令或工具(例如 which 命令)启动系统后可以验证用户添加入的新命令或工具。

4.实验结果

5. 实验中遇到的问题及解决方法

make 编译有错误,进行源代码的修改。之后再make menuconfig中将这个宏对应的东西配置成没有就好了,如果没有这个宏,那么就直接用出错的那个文件的名字找就行了,找到后给它去掉,将来make的时候就不会编译这个文件了,在次进行make 编译后,编译出来了busybox这个东西,就在证明编译通过了。

实验三模块方式驱动实验

1. 实验目的

学习在 LINUX 下进行驱动设计的原理

掌握使用模块方式进行驱动开发调试的过程

2. 实验容

在 PC 机上编写简单的虚拟硬件驱动程序并进行调试,实验驱动的各个接口函数的实

现,分析并理解驱动与应用程序的交互过程。

在 ARM 设备上创建设备驱动节点,编写用户空间应用程序,对驱动程序进行测试。

3. 实验步骤

(1)、编译驱动程序/UP-Magic210/SRC/exp/driver/01_demo /demo.c,手工加载驱动程序,

通过设备号建立驱动设备节点,执行应用程序测试该驱动及设备,分析驱动程序demo.c。

进入实验目录编译源程序

[rootlocalhost /]# cd /UP-Magic210/SRC/exp/driver/01_demo/

清除中间代码,重新编译

[rootlocalhost 01_demo]# make clean

[rootlocalhost 01_demo]# make

当前目录下生成驱动程序demo.ko和应用测试程序test_demo。

启动 UP-Magic210 实验系统,连好网线、串口线。通过串口终端挂载宿主机实验目录

(注意:虚拟机IP地址需要设置为:192.168.12.157)。

[rootUP-TECH yaffs]# mount -t nfs -o nolock 192.168.12.157:/UP-Magic210 /mnt/nfs

进入串口终端的 NFS 共享实验目录

[rootUP-TECH yaffs]# cd /mnt/nfs/SRC/exp/driver/01_demo/

手动加载驱动程序 demo.ko

[rootUP-TECH 01_demo]# insmod demo.ko

通过设备号建立驱动设备节点

[rootUP_210 01_demo]# mknod /dev/demo c 251 0

执行应用程序测试该驱动及设备,分析应用程序测试结果。

[rootUP-TECH 01_demo]# ./test_demo

(2)、请参考驱动程序demo.c,编写一个虚拟字符设备驱动程序并进行调试,该虚拟字符

设备驱动程序完成如下功能:

在核模块初始化函数中,实现动态申请设备号并注册该设备,动态建立设备文件节

相关主题
相关文档
最新文档