单板机上的LINUX,从零开始四 从零开始异世界web四

上一篇介绍了单板机装载程序(Bootloader)U-Boot的生成。本文介绍一个小Linux内核的生成。
使用的Linux内核源代码版本是3.14.12(最新是3.14.16了),是比较新的版本,而且3.14也是一个会长期维护的版本。由内核源代码到生成内核,需要首先进行配置,自己喜欢并常用的方法是:makemenuconfig。因为试图生成一个最小的内核,所以就选择尽量少的配置。没有料到的是在这里费了很长的时间。
首先,加载启动生成的内核时,没有任何显示!就是说,在u-boot打印出信息:Starting kernel...后,屏幕上再无任何输出。
这里需要简单介绍一下Beaglebone Black单板的输出。它有一个micro HDMI,这个经过转换后,连接到所用的SOCAM3358上的图形显示卡(可直接驱动LCD)上。很显然,这个输出不适合开发过程中使用,因为它依赖比较复杂的驱动程序。单板机通常有JTAG接口,可以用来显示输出,也可以用来调试单板机的运行。这个比较偏向硬件,可能是硬件工程师喜欢的方式。对于我来讲,使用串口进行输入输出是比较合适的方式。串口的电路和驱动都比较简单,适合做最初的开发使用。AM3358有6个串口(UART0~ UART5),Beaglebone black将UART0的管脚直接接了出来,总共六根。因为SOC工作在TTL电压(3.3V),接口没有在电气物理层面上做转换使之符合RS232的要求,所以不能直接连接任何设备的串口,比如PC机的串口。好在市场上存在这种USB转串口的,接口为TTL 3.3V的连接线,通过它,可以将这个串口直接连接至PC机的USB端口。
在LINUX PC上,用minicom终端软件,通过USB转RS232的设备,可以对Beagleboneblack的启动过程进行监测,并可以做交互。
内核启动后,没有观测到任何输出,这是一个比较棘手的问题,因为没有任何信息可供参考判断。内核启动的第一步,首先是将内核解压到一个固定的物理地址开始的区域,在TI的SOC上,一般这个地址是0x80008000,因为TI的ARM架构的SOC, 内存开始地址通常为0x80000000。在过去版本的正常启动里,解压开始和结束,会输出“Uncompressing Linux... done, bootingthe kernel.”。如何知道究竟运行到了哪里?为什么出错?
好在单板机上,一般都有几个led显示管,通过写入一个内存区域的二进制位,来点亮它。那么可以找到驱动某个led的物理地址,在内核设置并启用虚拟内存机制之前,直接在对应的地址位写1来点亮某个led。启用虚拟地址机制后,就无法如此操作,因为不知道这个物理地址对应的虚拟地址是什么,甚至都不知道这个地址的对应关系是否已经建立。不过,至少在虚拟地址机制开启前,可以通过这个方式来查找内核启动过程是否走过了某一段。很不幸的是,使用这种方式,验证了内核已经正确执行到了开始启用虚拟内存的地方。如果虚拟内存机制设置完毕,就会跳转到内核"start_kernel"这个函数,它是一个C程序。由此开始,内核就基本上是在执行C语言的代码了!
为什么解压缩完成却没有输出“Uncompressing Linux... done, booting thekernel.”?原来是使用了设备描述树来创建设备的内核,在开始阶段(读取并分析设备描述树之前),并没有创建任何串口设备。如果是在开始就创建并使用这些设备,那么就是又回到用静态变量来存储设备和驱动的老做法了!所以使用DeviceTree Blob来指定设备的内核,在启动开始的解压缩阶段,再也无法输出类似的信息了!
既然是通过设备描述树来指定设备,那么也许要查看一下设备描述树的源文件,看看那里对uart0是如何描述的。通过查看"am335x-boneblack.dts"文件和它所包含的文件,发现uart0启用时,需要用"pinctl-single"这个管脚复用的驱动来设置管脚。在内核配置文件里,有选择这个驱动的选项,但是因为我追求最小内核,所以没有选用它!重新配置内核选项,选中这个驱动,内核启动的输出就正常了!
这里顺带解释一下管脚复用。SOC芯片,一般都集成了CPU和其它很多外设,例如串口控制器,USB控制器,等等。芯片输出的管脚,不能完全将所有的外设连接都输出,这样就存在多个外设信号连接到一个管脚的现象。例如串口0的RX信号,和I2C2的SDA信号,还有其它6种信号,共用一个管脚!如果需要将这个管脚设置为做串口0的RX信号,就需要在一个内存地址(寄存器)里写入0,如果需要它做为I2C2的SDA,需要写入3。管理这种复用的驱动程序,最简单的那种(每个管脚配置占用四个字节),叫pinctl-single。之前内核不能输出信息,就是因为没有配置选中这个驱动。
内核启动完成,最后加载一个内存根文件系统,并尝试执行根目录下的init程序。这个初始根文件系统的内容是最简单和常用的命令。用klibc和busybox的生成结果,充当这个文件系统的内容,是最常用的做法。内存文件系统(非内存块设备)和内核初始根文件系统,是LINUX里的发明,降低了内核复杂度的同时,增加了灵活性!
单板机上的LINUX,从零开始(四) 从零开始异世界web四
内核启动完成,执行klibc的SHELL(sh.shared)后,却发现内核没有识别到MMC卡(或是4GB的eMMC)!根据内核启动过程的输出提示,发现是加载对应MMC的电源驱动失败。还是查找设备描述树源文件,发现Beagleboneblack的mmc使用一个最简单的电源驱动:regulator-fixed。而内核配置里,漏掉了这个驱动。又是最求最小内核配置惹的祸!重新配置并选中这个驱动,现在看起来一切正常。
到此为止,一个小的系统就诞生了。它运行在Beagleboneblack的板子上,MMC卡,USB和网卡都可以使用用。当然这还是一个比较小的配置,以后根据需要,可能还需要追加必要的驱动。下一步就是开始编译生成系统的各种程序了。首当其冲的就应该是"systemd",它是最新的,也是最流行的,替代过去UNIX/LinuxINIT的程序。

  

爱华网本文地址 » http://www.413yy.cn/a/25101011/59007.html

更多阅读

四十岁的男人,沧桑而魅力 四十岁已婚男人动真情

人说:四十岁的男人,沧桑而魅力!(四十岁的女人,苍老而无奈!)男人,真正的好男人,在40岁这个年龄,历经风雨、坎坷后,磨砺中坚持下来了,境界也就提高了,对生活的理解透彻了,生活也就潇洒了!引子四十岁男人和四十岁女人四十岁的男人、四十的女人。四十岁

我的金钱观,从橱柜衣服谈起 我的金钱观

更多好文请看内在空间 www.innerspace.com.cn德芬在那里回答问题。最近台湾流行一本书叫做“断舍离”,就是教大家怎么样清除自己家里不必要的多余物品,这也是象征着清除自己内在的垃圾【】,甩掉不必要的心理负担。我最近也在清除自己的

统计学是数据的科学 决策的科学化,从数据统计开始

天气预报,生活中最需要精准,而实际上难以办到的一项决策。一来,历史数据积累少,无法寻找到天气的长周期规律;二来,极端天气频繁出现,且不可预料,就连事后也难以透彻分析;三来,统计技术跟不上,软件和硬件技术愈加发达,可掌控这些机器和系统的人,

业务员称呼 尊重你的业务员,从称呼开始

最近一直在思考一个问题,为什么把有钱的人称呼老板,没钱的人称呼成穷人甚至是乞丐。老板是有钱人的代名词吗?未必,不是每个老板都是有钱人,也并不是每个老板都很幸福。但,在别人眼里,被叫老板的一定是有钱的,幸福的,叫穷人或者乞丐的一定是

什么祛黄褐斑方式有效 有效的方式,从废纸篓开始

减少文件堆积的最有效工具之一,是个大废纸篓。不错,一个小的废纸篓可能马上就要堆满了,废纸篓是你丢弃大量文件的好方。          社会学家和经济学家肯尼士·包汀说到:“社会系统中最重要的要素,不是资料而是知识。一部电脑所

声明:《单板机上的LINUX,从零开始四 从零开始异世界web四》为网友青池旧时光分享!如侵犯到您的合法权益请联系我们删除