网站在正在建设中,模板小程序多少钱,微信小程序是怎么开发的,php网站开发环境论文学习交流加 个人qq#xff1a; 1126137994个人微信#xff1a; liu1126137994学习交流资源分享qq群#xff1a; 962535112 上一篇文章#xff0c;我们修改了内核代码改了系统的分区#xff0c;但是最后启动#xff0c;发现虽然我们可以挂载之前的文件系统#xff0c;但是… 学习交流加 个人qq 1126137994个人微信 liu1126137994学习交流资源分享qq群 962535112 上一篇文章我们修改了内核代码改了系统的分区但是最后启动发现虽然我们可以挂载之前的文件系统但是无法启动init进程。说明我们新移植的内核不支持我们之前制作的老的文件系统点击查看上一篇文件上一篇文章。今天我们来制作新的文件系统。
我们用的是哪一个编译器编译的内核就用哪一个编译器编译文件系统的应用程序
1.编译Busybox
获取busybox源码1.20.0版本的下载地址下载地址把下载好的源码拿到Linux系统解压进入到源码目录 然后直接 make menuconfig 交叉编译 出现如下界面 选择 Busybox Settings — Build Options — Cross Compiler prefix (NEW) 然后会出现可以输入的横条在里面输入我们的编译器的前缀 配置好后退出保存保存配置。 然后直接输入 make 编译 编译完成后我们把它安装到/work/nfs_root目录下进入到这个目录建立一个目录 mkdir fs_mini_mdev_new 新的文件系统目录
然后切换到busybox目录进行安装安装命令可以查看README make install CONFIG_PREFIX/work/nfs_root/fs_mini_mdev_new 第一步已经完成busybox已经安装好下一步是安装库。
2.安装库
我们查看到我们的编译工具的路径 echo $PATH 得知编译工具的路径为 /work/tools/usr/local/arm/4.3.2/bin 进入到这个目录 /work/tools/usr/local/arm/4.3.2 输入find -name lib 找到很多库如下
用到的库只有这两个 ./arm-none-linux-gnueabi/libc/armv4t/usr/lib ./arm-none-linux-gnueabi/libc/armv4t/lib 我们只需要把这两个库拷贝过来就行
先在fs_mini_mdev_new目录下建立以lib目录 然后把/work/tools/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib目录下的所有.so文件拷贝到fs_mini_mdev_new目录下的lib目录
cp /work/tools/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* /work/nfs_root/fs_mini_mdev_new/lib -d -d代表原来是链接文件拷贝过来之后还是链接文件还有一个库需要添加 在/work/nfs_root/fs_mini_mdev_new/usr目录下创建一个lib目录然后把编译器中的usr/lib目录下的库拷贝过来
cp /work/tools/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* /work/nfs_root/fs_mini_mdev_new/usr/lib -d库已经添加完了接下来是构造一些其他目录etcdev目录等
3.构造etc目录
3.1创建etc/inittab文件 在/work/nfs_root/fs_mini_mdev_new目录下创建inittab文件里面内容如下
# /etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r3.2创建etc/init.d/rcS文件 这是一个脚本问价可以在里面添加想自动执行的命令。以下命令配置IP地址、挂接/etc/fstab指定的文件系统。
#!/bin/sh
ifconfig eth0 192.168.1.104
mount -a其中 第一行表示这是一个脚本文件运行时使用/bin/sh解析。 第三行挂接/etc/fstab文件指定的所有文件系统。 最后还要更改它的属性使它能够执行
chmod x etc/init.d/rcS3.3、创建etc/fstab文件 内容如下表示执行“mount -a”命令后将挂接proc、tmpfs文件系统
# device mount-point type options dump fsck orderproc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
/etc/fstab 文件被用来定义文件系统的“静态信息”这些信息被用来控制mount命令的行为详细信息参考《嵌入Linux应用开发完全手册》这里不做详细解释。4.构建dev目录
该目录下存放的是设备文件。设备文件是Linux系统中特有的文件类型在Linux系统下以文件的方式访问各种外设即通过读写某个设备文件来操作某个具体硬件。比如通过“/dev/ttySAC0”文件可以操作串口0通过“/dev/mtdblock1”可以访问MTD设备NAND Flash、NOR Flash等的第二个分区。
/dev的创建有3种方法。 1手动创建 在制作根文件系统的时候就在/dev目录下创建需要操作的设备文件比如ttySAC0等。系统挂接根文件系统后就可以使用/dev目录下的设备文件了。 2使用devfs文件系统这种方法已经过时 3使用udev udev是一个用户程序它能够根据系统中硬件设别的状态更新设备文件包括设备文件的创建、删除等。 使用udev机制也不需要在/dev目录下创建设备节点它需要一些用户程序的支持并且内核要支持sysfs文件系统。它的操作比较复杂但是灵活性比较高。 在busybox中有一个mdev命令它是udev命令的简化版。
那么我们就使用mdev来创建设备文件
要在内核启动时自动运行mdev需要修改etc/fstab文件来自动挂载文件系统、修改etc/init.d/rcS文件加入要自动运行的命令。 *etc/fstab的修改
# device mount-point type options dump fsck orderproc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tempfs /dev tempfs defaults 0 0
*etcinit.d/rcS的修改
#!/bin/sh
ifconfig eth0 192.168.1.104
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev /proc/sys/kernel/hotplug
mdev -s
另外mdev是通过init进程来启动的在使用mdev构造/dev目录之前init进程至少要用到的设备文件为/dev/console和/dev/null,所以要建立这两个文件
mkdir dev
cd dev
sudo mknod console c 5 1
sudo mknod null c 1 35.构建其他目录 其他目录可以是空目录如下
mkdir proc mnt sys root现在我们的/work/nfs_root/fs_mini_mdev_new目录下就是一个非常小的根文件系统。开发板可以将它作为网络根文件系统直接启动。如果要烧写进开发板还要将它制作为一个文件称为映像文件。
6.制作文件系统映像文件 接下来我们来制作文件系统的映像文件: 6.1首先需要编译制作jffs2映像文件的工具具体源码可以自行下载也可以加我q1126137994问起要 在我的Linux系统目录/work/tools/mtd-utils-05.07.23.tar.bz2是MTD设备的工具包编译它生成mkfs.jffs2工具用它来将一个目录制作成jffs2文件系统映像文件。 这个工具包需要zlib压缩包先安装zlib。在我的目录/work/GUI/xwindow/X/deps下有zlib源码zlib-1.2.3.tar.gz,执行以下命令进行安装 cd /work/GUI/xwindow/X/deps tar xzf zlib-1.2.3.tar.gz cd zlib-1.2.3 ./configure --shared --prefix/usr make sudo make install
然后编译mkfs.jffs2 cd /work/tools tar xjf mtd-utils-05.07.23.tar.bz2 cd mtd-utils-05.07.23/util make sudo make install
6.2制作jffs2映像文件 使用如下命令 cd /work/nfs_root/fs_mini_dev_new 这是我自己的目录根据个人的不同进入到不同的目录 mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_new -o fs_mini_mdev_newlyy.jffs2
上面-n 表示不要在每个擦除块上都加上清楚标志-s 2018 表示我们的NAND Flash的一页的大小为2048字节-e 128KiB 表示一个擦除快大小为128KiB ,-d 表示根文件系统的目录-o表示输出的文件。
好了文件系统制作完毕了。下面我们来烧写系统
nfs 30000000 192.168.1.101:/work/nfs_root/fs_mini_mdev_newlyy.jffs2 nand erase.part rootfs nand write.jffs2 30000000 260000 $filesize set bootargs consolettySAC0,115200 root/dev/mtdblock3 rootfstypejffs2 nfs 32000000 192.168.1.101:/work/nfs_root/uImage_new bootm 32000000
串口打印可以正常启动了整个系统终于跑起来了哈哈哈
完美费了这么大的功夫终于搞定了这个文件系统的制作还好没有出现什问题。
注释 在视频教程中出现了错误Kernel panic - not syncing: Attempted to kill init! exitcode0x00000200。
分析这个错误在内核中搜索字符串exitcode通过函数层层调用的分析最终找到do_exit(SIGKILL);执行了这个调用才出现错误代码4原因是编译内核用的编译工具是eabi接口的我们需要重新配置内核使用EABI接口
在内核目录下输入 make meniconfig 然后依次选择 Kernel Features — [*] Use the ARM EABI to compile the kernel
这下应该就完全没有问题了内核配置好后重新编译烧写启动就OK啦
想一起探讨以及获得各种学习资源加我有我博客中写的代码的原稿 qq1126137994 微信liu1126137994 可以共同交流关于嵌入式操作系统C语言C语言数据结构等技术问题。