嵌入式操作系统实训报告Word下载.docx
《嵌入式操作系统实训报告Word下载.docx》由会员分享,可在线阅读,更多相关《嵌入式操作系统实训报告Word下载.docx(13页珍藏版)》请在冰点文库上搜索。
![嵌入式操作系统实训报告Word下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/2/427f4d17-c1ea-4f2b-9697-4e9e45865789/427f4d17-c1ea-4f2b-9697-4e9e458657891.gif)
3修改board/tekkaman/tekkaman2410/Makefile文件
4修改include/configs/tekkaman2410.h文件,添加如下内容:
5修改board/tekkaman/tekkaman2410/lowlevel_init.S文件
依照开发箱的内存区的配置情况,修改board/tekkaman/tekkaman2410/lowlevel_init.S文件
6修改/board/tekkaman/tekkaman2410/tekkaman2410.c......
8在include/linux/mtd/nand_ids.h的结构体nand_flash_ids加入
staticstructnand_flash_devnand_flash_ids[]={
......
{"
SamsungKM29N16000"
NAND_MFR_SAMSUNG,0x64,21,1,2,0x1000,0},
SamsungK9F1208U0M"
NAND_MFR_SAMSUNG,0x76,26,0,3,0x4000,0},
Samsungunknown4Mb"
NAND_MFR_SAMSUNG,0x6b,22,0,2,0x2000,0},
......
{NULL,}
};
9修改/lib_arm中的board.c。
10修改common/env_nand.c
11在/board/tekkaman/tekkaman2410/tekkaman2410.c文件的末尾添加对NandFlash的初始化函数
u-boot运行至第二阶段进入start_armboot()函数。
其中nand_init()函数是对nandflash的最初初始化函数。
Nand_init()函数在两个文件中实现。
其调用与CFG_NAND_LEGACY宏有关,如果没有定义这个宏,系统调用drivers/nnd/nand.c中的nand_init();
否则调用自己在board/smdk2410/smdk2410.c中的nand_init()函数。
3C2410_GetBase_NAND();
12修正U-Boot的NE2000驱动的低级错误
将第45行:
at*/
改为:
at
13因为没有NorFlash芯片,所以注释掉/common/cmd_bootm.c中关于imls命令的程序段和/common/cmd_flash.c中的程序。
不然,按上面的修改,编译会出错。
三、交叉编译U-Boot
二)、移植Linux2.6.24.7到博创2410
操作系统:
ubuntu9.04
交叉编译工具:
arm-linux-gcc-4.1.1
开发板:
2410-S(s3c2410s)
一、下载并解压Linux2.6.24.7内核源码
从网上下载linux-2.6.24.7内核源码到/arm2410s目录下,并解压
进入内核解压后的目录
二、修改内核源码根目录下的Makefile文件
修改Makefile中的ARCH和CROSS_COMPILE变量,修改为
ARCH=arm
CROSS_COMPILE=arm-linux-
三、设置nandflash分区信息
修改arch/arm/plat-s3c24xx/common-smdk.c文件,修改NandFlash的分区信息和NandFlash的硬件信息。
修改的内容如下:
staticstructmtd_partitionsmdk_default_nand_part[]={
[0]={
.name="
vivi"
.size=SZ_128K,
.offset=0,
},
[1]={
param"
.offset=SZ_128K,
.size=SZ_1M-SZ_128K,
[2]={
kernel"
.offset=SZ_1M,
.size=SZ_1M*3,
[3]={
root"
.offset=SZ_4M,
.size=SZ_4M*5,
[4]={
user"
.offset=SZ_4M*6,
.size=SZ_4M*10,
四、禁止nandflash的ECC校验
修改文件drivers/mtd/nand/s3c2410.c文件,查找函数s3c2410_nand_init_chip(),在函数的最后一行,添加chip->
ecc.mode=NAND_ECC_NONE;
五、增加yaffs2文件系统的支持
1、下载Yaffs2到~/arm2410s目录下
2、解压Yaffs2并将其加入Linux内核(打补丁的方式)
六、博创2410所配网卡AX88796(NE2000兼容网卡)驱动的移植。
1、修改arch/arm/Kconfig文件,增加ISA总线支持,使其在makemenuconfig时出现NE2000的网卡配置选项。
2、修改include/asm-arm/arch-s3c2410/map.h文件。
加入AX88796的地址映射。
3、修改arch/arm/mach-s3c2410/mach-smdk2410.c文件。
在smdk2410_iodesc中加入AX88796的地址信息。
4、修改网卡驱动的主要文件drivers/net/ne.c
(1)、添加头文件和定义
(2)、确保定义总线宽度为16位。
(3)、在do_ne_probe函数中增加配置总线参数、基地址和中断的语句
(4)、修改ne_probe1函数
七、配置内核
1、载入up2410的默认配置文件,以简化配置过程
2、手动配置内核,在s3c2410_defconfig基础上,增加以下配置选项:
产生.config文件。
八、编译内核
内核的编译操作
makemenuconfig配置编译选项
makedep提供变量依赖关系信息
makeclean删除生成的模块和目标文件
makezImage编译内核生成压缩的映像
makemodules编译模块
至此,内核的编译工作完成,在arch/arm/boot目录下生成了zImage文件,即为压缩的内核映像。
最后,将内核镜像烧写到博创arm2410s开发板上,启动正常,网卡也正常
三)、使用BusyBox制作linux根文件系统(CramFS+mdev)
操作系统:
Ubuntu9.04
内核版本:
linux-2.6.24.7
开发板:
博创arm2410s
交叉编译工具:
arm-linux-gcc-4.1.1
BusyBox:
busybox-1.11.1
CramFS:
CramFS-1.1
一、准备根文件系统
使用shell脚本create_rootfs.sh,建立根文件系统的目录框架
vicreate_rootfs.sh
create_rootfs.sh内容如下:
#!
/bin/sh
echo"
------Createrootfsdirectons......"
mkdirrootfs
cdrootfs
--------Createroot,dev......"
mkdirrootdevetcbinsbinmntsysproclibhometmpvarusr
mkdirusr/sbinusr/binusr/libusr/modules
mkdirmnt/usbmnt/nfsmnt/etcmnt/etc/init.d
mkdirlib/modules
chmod1777tmp
cd..
-------makedirectiondone---------"
为create_rootfs.sh添加执行权限
chmoda+xcreate_rootfs.sh
执行create_rootfs.sh,建立根文件系统的目录框架
$./create_rootfs.sh
二、创建设备文件
mdev是通过init进程来启动的,在使用mdev构造/dev目录之前,init至少要用到设备文件/dev/console、/dev/null,所以需要事先建立这两个设备文件
$cddev
$sudomknod-m660consolec20464
[sudo]passwordforlingd:
$sudomknod-m660nullc13
$ls-l
total0
crw-rw----1rootroot5,12010-04-0215:
49console
crw-rw----1rootroot1,32010-04-0215:
50null
三、准备一些配置文件和系统启动时所需的文件
1、mdev配置文件mdev.conf
mdev会在/etc目录下找mdev的配置文件:
mdev.conf.如果该文件不存在,那么在执行mdev–s这个命令时,会提示找不到mdev.conf。
我们不需要mdev规则,所以只是touch生成一个空文件就OK了。
当然也可以根据mdev的规则来编写mdev.conf。
$cd../mnt/etc
$touchmdev.conf
$ls
init.dmdev.conf
2、linuxrc
linuxrc位于根文件系统的顶层目录/,这里为rootfs。
/Linuxrc执行init进程初始化文件。
主要工作是把已安装根文件系统中的/etc安装为ramfs,并拷贝/mnt/etc/目录下所有文件到/etc,这里存放系统启动后的许多特殊文件;
接着Linuxrc重新构建文件分配表inittab;
之后执行系统初始化进程/sbin/init。
3、rcS
rcS文件位于/etc/init.d,是busybox版init第一个运行的脚步(常见的init还有SysVinit版,其第一个执行的脚步是/etc/rc.d/rc.sysinit)。
/mnt/etc/init.d/rcS完成各个文件系统的mount,再执行/mnt/etc/rc.local;
通过rcS可以调用ifconfig程序配置网络。
rcS执行完了以后,init就会在一个console上,按照inittab的指示开一个shell,或者是开getty+login,这样用户就会看到提示输入用户名的提示符。
4、/etc/rc.local
/etc/rc.local是被init.d/rcS文件调用执行的特殊文件,与Linux系统硬件平台相关,如安装核心模块、进行网络配置、运行应用程序、启动图形界面等。
5、/etc/profile
rc.local首先执行该文件配置应用程序需要的环境变量等。
6、/etc/inittab
内核引导完成后,内核会启动初始化进程init(用户级进程)来进行系统的各项配置。
init是系统第一个进程,它是系统上运行的所有其他进程的父进程,他会观察其子进程,并在需要时启动、停止、重启它们。
init主要是用来完成系统的各项配置。
init从/etc/inittab获取所有信息。
/etc/inittab内容如下:
#/etc/inittab
:
sysinit:
/etc/init.d/rcS
console:
askfirst:
-/bin/sh
ctrlaltdel:
/sbin/reboot
shutdown:
/bin/umount-a-r
7、/etc/fstab
文件/etc/fstab存放的是系统中的文件系统信息。
当正确的设置了该文件,则可以通过"
mount/directoryname"
命令来加载一个文件系统,或mount-a来加载该文件中所有文件系统。
每种文件系统都对应一个独立的行,每行中的字段都有空格或tab键分开。
同时fsck、mount、umount的等命令都利用该程序。
$vifstab
/etc/passwd文件存放着所有用户的信息,包括账号和密码。
内容如下:
#username:
password:
UserID:
GroupID:
comment:
homedirectory:
shell
root:
x:
0:
/root:
四、编译busybox
首先修改Makefile,将以下两项改为
CROSS_COMPILE=arm-linux-
配置busybox,
$make
$makeinstall
五、lib库文件复制到rootfs/lib目录下(根据需要复制)
六、生成Cramfs文件系统镜像文件。
Cramfs.img在cramfs-1.1目录下会出现两个bin文件mkcramfs和cramfsck把他们copy到/usr/bin:
创建根文件系统的cramfs镜像
$mkcramfs../rootfsCramFS01.img
Directorydata:
6020bytes
Everything:
908kilobytes
Superblock:
76bytes
CRC:
526c6bb5
warning:
gidstruncatedto8bits(thismaybeasecurityconcern)
COPYINGcramfsckGNUmakefilemkcramfsNOTES
CramFS01.imgcramfsck.clinuxmkcramfs.cREADME
测试一下刚生成的CramFS01.img:
$sudomount-oloop-tcramfs~/CramFS01.img/mnt/usb
$ls/mnt/usb
查看是否有bin、etc等目录在ubuntu软件源里zlib和zlib-devel叫做zlib1gzlib1g.dev
四)、内核驱动设计入门-模块方式驱动实验
一、在LinuxPC机上进行
1.修改Makefile文件两个地方
a.注释CROSS_COMPILE=arm-linux-这一行
b.修改KERNELDIR?
=/usr/src/kernels/2.6.9-42.EL-smp-i686/
makeclean;
make
生成demo.ko
2.用insmod命令插入设备驱动
#insmoddemo.ko
#cat/proc/devices
3.用mknod命令建立demo设备节点
#mkdir/dev/demo
#mknod/dev/demo/0c2530
4.运行测试程序
#./test_demo
write32bytesdatato/dev/mydemo
0123
1:
4567
2:
891011
3:
12131415
4:
16171819
5:
20212223
6:
24252627
7:
28293031
*****************************************************
Read32bytesdatafrom/dev/mydemo
31302928
27262524
23222120
19181716
15141312
111098
7654
3210
5.删除设备节点[root@vm-devdemo_driver]#rm-f/dev/demo
二.完善代码部分
1.分析Makefile文件,把为PClinux编写的Makefile文件改写为ARM开发平台编写的Makefile文件
a.去掉注释CROSS_COMPILE=arm-linux-这一行
=/home/hq/kernel/linux-2.6.24.4(开发板的内核目录)
三、编译驱动模块及测试程序
按第二部分完善代码后,用make命令编译驱动和测试程序
$make
armv4l-unknown-linux-gcc-c-I..-Wall-O-D__KERNEL__-DMODULE
-I/arm2410dev/kernel-2410dev/includedemo.c-odemo.o
demo.c:
108:
warning:
initializationfromincompatiblepointertype
-I/arm2410dev/kernel-2410dev/includehello.c-ohello.o
armv4l-unknown-linux-gcc-I..-Wall-O-D__KERNEL__-DMODULE
-I/arm2410dev/kernel-2410dev/include-c-otest_demo.otest_demo.c
armv4l-unknown-linux-gcctest_demo.o-otest_demo
下面使用测试程序来进行测试,按照上面步骤成功后会出现下面的结果:
#./test_demo
write32bytesdatato/dev/demo
Read32bytesdatafrom/dev/demo
23222111
201098
如果模块没有成功插入的话,会出现下面的情况:
#./test_demo
####DEMOdeviceopenfail####
在驱动模块成功插入后,会在
/dev下面建立一个叫做demo用的设备文件,我们也可以使cat命令来直接调用read函数,来测试读过程。
#cat/dev/demo
deviceopensuccess!
四、心得体会