博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux移植的一般过程
阅读量:6212 次
发布时间:2019-06-21

本文共 1652 字,大约阅读时间需要 5 分钟。

前一阵子在公司移植Linux2.6到一块ARM11的开发板上,下面粗略讲讲移植的一般过程。

 

一开始的UBOOT的移植不多说了。UBOOT最后有两种方式进入Linux,一种是使用uImage,可以在引导时附加命令行参数,但操作起来比较麻烦。另一种较简单的是使用tftp将Linux内核加载到0x80008000(默认起始地址)的地方,然后使用go命令直接跳转。我使用的是第二种方式,其缺点是调整命令行参数的时候需要修改.config文件,然后强制重新编译setup.c(可以通过删除setup.o强制重新编译)。另外,arm下引导linux时R0和R1寄存器的值是必须设置的,分别为你的CPU(好像是,不记得了)和BOARD类型,否则在Linux刚开始的汇编部分会出错,这个要注意。http://hovertree.com/menu/linux/

 

此外,linux也有两种方式的引导,一种是zImage,另一种是Image。个人意见,一开始移植的时候用Image会更加简便,虽然tftp下载的时候稍微多耗一点时间,但由于减少了中间的解压缩步骤,能减少出错的机会,加快开发进度。

 

跳转到Linux之后,由于一开始是一段汇编代码,所以需要用jtag调试,比如在0x80008000处设置硬件断点。汇编代码处主要要做的工作是在内存映射表里添加上串口IO地址的映射,这样就能够操作串口输出调试信息。然后使用C语言在start_kernel的文件里写一个自己的printk函数,叫做temp_print,具体的代码可以参考printk的实现。这一阶段比较痛苦,因为使用jtag调试汇编很麻烦。一旦temp_print成功输出,并且Linux进入到start_kernel开始的C代码中,就可以把JTAG抛弃,全部使用串口输出调试。

 

接下来是系统自带的printk的输出,因为linux内核自身的调试信息都是通过printk输出的。这里主要是要设置linux的命令行启动参数,包括console和earlyconsole两个,将它们设置成你需要输出的串口号,并检查一下串口驱动的代码,比如8250.c和8250_early.c两个文件。

 

printk成功输出之后,下一步调系统时钟中断。这需要熟悉Linux中关于时钟中断的处理代码,网上的相关资料也需要看一看。看懂之后应该不是很难。

 

然后可以调试flash驱动和网卡,两者只要支持一个即可运行根文件系统。一般使用网卡比较简单一点,也更灵活。网卡启动之后在命令行参数中设置nfs方式的根文件系统,并把文件系统放在一台linux的服务器上面通过NFS导出。这样,就基本上移植成功了一个最简单的linux系统。

 

linux跑起来之后,再根据需要添加flash、lcd等驱动,一个完整的系统就能一步步搭建起来了。

 

下面讲讲我调试的时候遇到的问题:

调试OneNand驱动的时候,需要注意OneNand与Linux之间是通过16位数据线还是32位数据线连接。如果是16位数据线连接,那么驱动代码中的memcpy函数就会出错,因为memcpy默认是按照32方式复制数据的。可以自己重写一个内存拷贝函数,里面使用unsigned short方式拷贝数据。

 

调试网卡驱动的时候,要注意实际使用网卡的中断极性。虽然Linux自带有大部分网卡的驱动,但中断极性有可能是反的,需要注意。另外网卡中断线一般是连在CPU的GPIO上面(比如我使用的SMC91C111),这里需要根据自己板子的实际连线调整代码中中断线的GPIO占用号。并注意防止GPIO线的占用冲突。

 

linux2.6中多了一个eabi编译,比如上面就经常使用。如果内核使用eabi方式编译,那么就必须保证你的根文件系统也是通过eabi方式编译的,否则在进入/bin/sh的时候内核会出错,而且不会有任何提示。

推挤:

转载于:https://www.cnblogs.com/roucheng/p/linuxyizhi.html

你可能感兴趣的文章
正则表达式学习
查看>>
Spring MVC 整合 Swagger
查看>>
我的友情链接
查看>>
AndroidManifest.xml认知笔记
查看>>
linux发展历程。
查看>>
resin与log4j的配置
查看>>
我的友情链接
查看>>
长用小功能
查看>>
RHEl 5服务篇—部署Postfix邮件服务(二)配置邮件服务器的收、发信服务
查看>>
AD RMS 自我排错分析篇
查看>>
Kubernetes Deployment滚动更新场景分析
查看>>
多线程 3道题目 一
查看>>
我的友情链接
查看>>
c# 二维数组
查看>>
解决mx:AdvancedDataGrid表格中向上滚动导致数据混乱的非主流方法
查看>>
Buffer Cache内容强制写出到数据文件 alter system flush buffer_cache
查看>>
MicropPython的学习,如何从0到1?
查看>>
DNS(BIND) 服务器主从,实现高效率域名解析
查看>>
PHP 字符串变量
查看>>
Nginx+Lua环境安装
查看>>