1.已经有了uboot,先编译一个linux,下载运行试试(这里面涉及linux内核的一些修改,包括时钟啊,支持的文件系统等,和uboot参数也要对应。具体查看linux移植方法)
参考:http://user.qzone.qq.com/1057481936/infocenter#!app=2&pos=1311696745
内核已经简单移植了,但是出现错误:
No oob scheme defined for oobsize 218
kernel BUG at drivers/mtd/nand/nand_base.c:3286!
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = c0004000
[00000000] *pgd=00000000
Internal error: Oops: 805 [#1]
这和nand_flash驱动有关系。我使用的是6410,可以与已经移植好的flash驱动进行对比查看错误原因。
大部分 bug 以解引用 NULL 指针或者使用其他不正确指针值来表现自己的. 此类 bug 通常的输出是一个 oops 消息.
处理器使用的任何地址几乎都是一个虚拟地址, 通过一个复杂的页表结构映射为物理地址(例外是内存管理子系统自己使用的物理地址). 当解引用一个无效的指针, 分页机制无法映射指针到一个物理地址, 处理器发出一个页错误给操作系统. 如果地址无效, 内核无法"页入"缺失的地址; 它(常常)产生一个 oops 如果在处理器处于管理模式时发生这个情况.
编译内核一次不要改天多的选项,第次改之后要保存一下配置,一步步的来。
2.移植成功linux后,可以制作自己的根文件系统,其他文件系统,并下载到开发板。(涉及文件系统制作步骤等)
linux内核启动后第一个挂载的就是根文件系统,制作根文件系统的方法就是创建目录以及目录中的文件,具体步骤是(可能随着内核版本有所不同):创建目录,创建必要的设备文件,安装所需的共享库,安装init文件、shell和各种基本命令(可由busybox提供),创建和编辑配置文件。
控制台设备console(用于显示信息),虚拟控制终端(tty1,tty2,tty3多用户借口),串口终端(有ttyS0,ttyS1,在2.6内核中ttyS0称为ttySAC0,串口终端可由被指定为控制台终端console=ttySAC0)
使用cp命令复制本机dev文件时要带上-ax选项,表示保留文件的所有属性,这样才不会去读取设备文件。
嵌入式系统出于某种需要不希望动态创建设备文件,这时需要在根文件系统内使用mknod命令预先创建,或者将创建设备文件的命令放在初始化脚本内。
lib目录下存放的是库函数,对于使用动态编译方式编译的C应用程序,必须要下面两个库文件:libc(基本C函数库)、ld-linux(该库是动态连接器,提供动态链接函数库的功能)。可直接从交叉编译器的lib目录复制以上库文件。
此外,还有一些其他基本库,如dns解析的,c++程序的等。
etc目录存放配置文件负责文件系统初始化。touch rcS,vi rcS,如下:
#! /bin/sh
echo "welcome..."
PATH=/sbin:/bin"usr/sbin:/usr/bin
runlevel=S
prelevel=N
umask 022
export PATH runlevel prelevel
//使用trap ctrl+c可以中断shell中的子进程
trap ":" INT QUIT TSTP
/bin/mount -t proc none /proc
使用chmod赋予执行权限。
以上所述的这些工作都可以由busybox来完成。
1.下载busybox
2.解压,运行make menuconfig启动busybox配置工具(分为setting和applets两大部分),进行选择。
3.编译make,生成可执行文件busybox,可用file命令查看。
4.测试busybox是否成功,如./busybox ls,测试busybox的ls命令。(测试无效,提示无法执行)
5.运行make install进行安装,会生成_install目录,里面有目录以及指向busybox命令文件的链接文件。其中有个指向busybox命令文件的链接文件linuxrc,它是busybox提供的init程序,和/sbin/init程序作用相同。若使用它,只需在内核启动命令参数设置“init=linuxrc。
6.情况下,busybox提供的配置文件能够满足需要,所以可直接把_install目录以及/examples/botfloppy/etc目录下所有文件复制到rootfs(根)目录下,并覆盖原有文件。
文件系统类型有:基于flash的,基于内存的,基于网络的。
mout -t nfs 10.13.9.19:/{cwd} /mnt #{cwd}是NFS共享的目录,/mnt 是挂载到本地的服务。如果你在/mnt 下可以看到NFS共享目录的内容,表示你NFS设置成功了。使用#umount /mnt 取消挂载。
3.制作自己的uboot(从官网下载新的uboot,然后依照板子进行修改,涉及到初始化具体CPU,搞定CPU初始化以后,可以考虑一些存储器、网络、命令的修改和移植。)
步骤:官网下载最新uboot源码,填写makefile中的交叉编译器,寻找最匹配的配置文件并执行,修改错误。
uboot源码分析,有助于学习底层汇编代码和arm架构知识。
飞凌OK6410开发板之u-boot-2011.06-rc2移植之愚见
http://blog.csdn.net/l_1054781936/article/details/6567741
修正Ok6410的uboot网络不可用
http://blog.csdn.net/ecbtnrt/article/details/6816817
uboot下载:ftp://ftp.denx.de/pub/u-boot/
4.针对linux内核,设计驱动程序,模块化的,或者编译进内核的。(这里面设计各种驱动编写模型,可依据别的代码进行修改)
OK6410下面针对板子做了许多驱动,可以查看源代码进行学习。此外,还需要一定的理论知识,内核知识。
5.针对ARM平台为内核添加一些新特性,裸机ARM编程。修改uboot使其更强大,比如支持网络连接等。
6.深入理解ARM架构。
这两部可以和uboot一起学习。
7.制作定制自己的ARM编译器(之前的博客有记载)了解定制自己编译器的好处。
如将锐捷移植到嵌入式设备上,就可以有线上网了。。
nand flash分区文件,就是\linux2.6.28\arch\arm\plat-s3c\include\platpartition.h文件,其中说明了ok6410具体分区的情况!
上网数度比Wi-Fi快多了。不过就是需要手工用ifconfig和route设置ip和路由,而且不能自动分配IP地址(通过busybox中的命令可以办到,不过也得手工调用),自己加里面自动配置了