嵌入式linux入门笔记

学习的是韦东山的JZ2440板子,一开始假设是裸板,首先要用jtag把uboot烧到nor flash,完成后拔掉jtag,然后板子从nor flash启动,刚开始启动时马上按空格键进入uboot选择菜单,会出现如下选择项:

##### 100ask Bootloader for OpenJTAG #####
[n] Download u-boot to Nand Flash
[o] Download u-boot to Nor Flash
[k] Download Linux kernel uImage
[j] Download root_jffs2 image
[y] Download root_yaffs image
[d] Download to SDRAM & Run
[z] Download zImage into RAM
[g] Boot linux from RAM
[f] Format the Nand Flash
[s] Set the boot parameters
[b] Boot the system
[r] Reboot u-boot
[q] Quit from menu
Enter your selection: 

菜单中可以选择烧n写普通bin文件到Nand Flash,由PC端通过USB把程序文件传输给u-boot,再由u-boot把程序烧写到Nand Flash,然后重新上电从Nand Flash启动就可以运行裸板程序了。

同理在上面的菜单中选择k烧写内核,PC端把内核传到u-boot,u-boot再烧写到Nand Flash。光有内核还不能运行应用程序,必须要烧写根文件系统。一开始我用的是资料里提供的fs_mini_mdev.yaffs2,烧写完毕后按q退出uboot选择菜单,输入boot命令启动内核,可以正常启动bash,运行了ls等命令一切正常。

接着要做的事情就是自己写个hello world的应用程序玩一下。先安装交叉编译器arm-linux-gcc,我的是arm-linux-gcc-4.3.2.tar.bz2,输入命令sudo tar -jxvf arm-linux-gcc-4.3.2.tar.bz2解压,输入命令cp -r ./usr/local/ /usr/local/ 把解压出来的arm子文件复制到/usr/local/目录下,输入命令sudo gedit /etc/environment打开环境变量,把上一行注释掉,输入PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/arm/4.3.2/bin"设置arm-linux-gcc-4.3.2的地址,最后输入 source /etc/environment使环境变量生效。可以使用命令arm-linux-gcc -v来查看版本信息,确认是否安装成功。

安装好后写一个hello world程序的main.c文件,编译arm-linux-gcc -o hello main.c,这样就生成了一个名为hello的arm可执行程序。由于现在还没设置NFS,还不能用网络挂载,暂时使用U盘挂载。插入U盘后,开发板的shell会显示


sd 0:0:0:0: [sda] 15728640 512-byte hardware sectors (8053 MB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Assuming drive cache: write through
sd 0:0:0:0: [sda] 15728640 512-byte hardware sectors (8053 MB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Assuming drive cache: write through

如下信息,这个sda指的就是u盘设备,挂载时用的名字一般是sda1,如果插拔后名字sda可能会变为sdb,可以通过cat /proc/partitions确认u盘名字。接下来进入/mnt目录,新建一个disk目录,使用命令mkdir disk,然后使用挂载命令mount -t vfat /dev/sda1 /mnt/disk,成功后cd进入/mnt/disk目录,输入ls就可以显示u盘下的所有文件了。

之前我已经把hello文件拷到了u盘,现在来运行一下./hello,显示的是-sh: ./hello: not found。我用的是资料里原来提供的内核,可能编译器版本不一样,所以把linux-2.6.22.6.tar.bz2的源码用arm-linux-gcc-4.3.2重新编译一遍,结果还是老样子。后来查资料说动态库有问题,然后把hello程序改为静态编译,还是不行,但是执行后的错误提示变成了illegal instruction。

现在内核,应用程序都是用同一个编译器编译的,那么只有根文件系统不同,查了一下作者说是用arm-linux-gcc-3.4.5版本编译的,但是只要不执行应用程序,根文件系统却是正常运行的。看了一些根文件系统的制作资料后,用arm-linux-gcc-4.3.2重新编译busybox1.7制作最小根文件系统,这样内核,应用程序,根文件系统都是统一编译器编译的,但是重新编译制作根文件系统后,连bash都进不去,内核启动后卡死在Freeing init memory: 136K,在加载busybox时出了问题,不知道什么原因,遂放弃。后来用arm-linux-gcc-3.4.5编译hello程序,仍然使用原来的根文件系统,总算可以执行输出hello world了,用arm-linux-gcc-3.4.5自己制作了一个根文件系统,也一切正常。

猜你喜欢

转载自blog.csdn.net/pfysw/article/details/102576189