前言:
目前手上有一款产品需要做部分维护工作,它是基于OpenWrt开发的,也就是Linux,只不过原来的维护工作主要是C逻辑层,本次任务需要重新开辟一个package来独立执行整个任务逻辑,避免嵌套在其他进程中,故以下是自己的学习及预研记录。
(1)、理论基础
Linux启动过程:
①内核引导。
当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。
②运行init。
内核文件加载以后,就开始运行第一个程序 /sbin/init,它的作用是初始化系统环境。init 程序首先是需要读取配置文件 /etc/inittab。由于init是第一个运行的程序,它的进程编号(pid)就是1。其他所有进程都从它衍生,都是它的子进程。
③系统初始化。
在init的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit 它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。 它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。
像我现在这个项目中的启动文件是这样一句话,他是执行了rcS的脚本文件来进行初始化操作的。
④建立终端
rc执行完毕后,返回init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。
⑤用户登录系统
开机启动程序加载完毕以后,就要让用户登录了。
一般有三种登录方式:
1)、命令行登录
2)、ssh登录
3)、图形界面登录
OpenWrt的启动流程主要:
1.Bootloader->
2.linux->
3./etc/preinit->
4./sbin/init->
5./etc/inittab ->
6./etc/init.d/rcS->
7./etc/rc.d/S*
基于OpenWrt的应用程序的开发:
(增加package、修改Makefile、编译、运行)
增加package的开发步骤:
①进入 openwrt/package/目录下
②创建三个文件
1)src:存放源代码,并且包含指定交叉编译环境的Makefile
2)Makefile:这个文件是用来让openwrt查找、添加、编译这个目 录的
3)File:(可选)通常存放配置文件
(2)、实际应用
基本步骤:
①、在package目录下创建一个目录
②、在刚才的目录文件夹下建立src文件夹,用来存放源码
③、在src中添加源文件
④、在src目录下添加Makefile文件
(3)、主要问题
问题1:
在添加完package文件后,发现单个文件编译报错,错误如下:
首先根据错误提示“recipe for target xxx”和“没有匹配的文件路径”。
解决办法:
回看自己的添加的文件夹,发现,文件夹的名字和里面的.c文件名字不同,但是Makefile中写的路径却写成了.c文件的名字,更改相同的名字重新编译显示如下:(没有错误)
随后对整个工程文件进行编译,并烧录到LG220中进行启动测试。结果并没有显示线程启动,查看编译提示,发现有一个单独的提示信息:
WARNING: skipping learn_text — package not selected 这里我们需要 运行make menuconfig 在我们自己在Makefile中设置的目录下,找到
这里的路径名是指示自己的package在配置界面的那个目录下的,通过这里的路径提示,在menuconfig中开启自己添加的包,如下图所示:
随后再重新进行编译,依然还有错误,错误提示如下图所示:
检测src目录下的Makefile发现,刚才因为测试.c文件的正确性生成了两个GCC的.o文件,尝试删除文件之后,编译正常通过。但是烧录到设备中后出现了系统不能正常启动的问题。
重新核对编译文件,当看到启动顺序的设置时,发现设置冲突,由原来的118更改为116之后便可正常运行。运行结果如下图所示:
至此,本次Makefile文件及package包的添加更改学习过程结束。
评论(0)