Linux移植的一般过程
前一阵子在公司移植Linux2.6到一块ARM11的开发板上,下面粗略讲讲移植Linux的一般过程。
一开始的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编译,比如Android上面就经常使用。如果内核使用eabi方式编译,那么就必须保证你的根文件系统也是通过eabi方式编译的,否则在进入/bin/sh的时候内核会出错,而且不会有任何提示。
推挤:http://www.cnblogs.com/roucheng/p/3470287.html
Linux移植的一般过程的更多相关文章
- Linux移植之内核启动过程start_kernel函数简析
在Linux移植之内核启动过程引导阶段分析中从arch/arm/kernel/head.S开始分析,最后分析到课start_kernel这个C函数,下面就简单分析下这个函数,因为涉及到Linux的内容 ...
- Linux移植之内核启动过程引导阶段分析
在Linux移植之make uImage编译过程分析中已经提到了uImage是一个压缩的包并且内含压缩程序,可以进行自解压.自解压完成之后内核代码从物理地址为0x30008000处开始运行.下面分析在 ...
- linux移植问题汇总(一)
linux移植问题汇总(一) 在此记录移植linux过程中出现的问题以及解决方法. 项目GitHub地址 linux3.0.80:https://github.com/numbqq/linux-3.0 ...
- Linux移植之tag参数列表解析过程分析
在Linux移植之内核启动过程start_kernel函数简析中已经指出了start_kernel函数的调用层次,这篇主要是对具体的tag参数列表进行解析. 1.内存参数ATAG_MEM参数解析 2. ...
- Linux移植之子目录下的built-in.o生成过程分析
在Linux移植之make uImage编译过程分析中罗列出了最后链接生成vmlinux的过程.可以看到在每个子目录下都有一个built-in.o文件.对于此产生了疑问built-in.o文件是根据什 ...
- Linux移植之auto.conf、autoconf.h、Mach-types.h的生成过程简析
在Linux移植之make uImage编译过程分析中分析了uImage文件产生的过程,在uImage产生的过程中,顺带还产生了其它的一些中间文件.这里主要介绍几个比较关键的文件 1.linux-2. ...
- Linux移植之make uImage编译过程分析
编译出uboot可以运行的linux内核代码的命令是make uImage,下面详细介绍下生成linux-2.6.22.6/arch/arm/boot/uImage的过程: 1.vmlinux.Ima ...
- Linux移植之配置过程分析
在Linux移植之移植步骤中已经将Linux移植的过程罗列出来了,现在分析一下Linux的配置过程,将分析以下两个配置过程: 1.make s3c2410_defconfig分析 2.make men ...
- Linux移植随笔:终于解决Tslib的问题了【转】
转自:http://www.latelee.org/embedded-linux/porting-linux-tslib.html 前段时间让Tslib搞晕头了,原来一切都是版本惹的祸.本文只是一个随 ...
随机推荐
- (翻译)正确实施DevOps-The Lay of the Land
原文地址:http://www.drdobbs.com/architecture-and-design/getting-devops-right-the-lay-of-the-land/2400626 ...
- OpenCV基于傅里叶变换进行文本的旋转校正
傅里叶变换可以用于将图像从时域转换到频域,对于分行的文本,其频率谱上一定会有一定的特征,当图像旋转时,其频谱也会同步旋转,因此找出这个特征的倾角,就可以将图像旋转校正回去. 先来对原始图像进行一下傅里 ...
- AngularJS快速入门指南19:示例代码
本文给出的大部分示例都可以直接运行,通过点击运行按钮来查看结果,同时支持在线编辑代码. <div ng-app=""> <p>Name: <input ...
- OpenJDK将对Android开发产生怎样的影响?
转载于:http://www.itxuexiwang.com/a/liunxjishu/2016/0228/182.html?1456926201 Google已决定将从下一版本的Android开始采 ...
- 06- Shell脚本学习--其它
Shell输入输出重定向 Unix 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示.一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器. 输出 ...
- Unity3D大风暴之入门篇(海量教学视频版)
智画互动开发团队 编 ISBN 978-7-121-22242-9 2014年2月出版 定价:79.00元 328页 16开 编辑推荐 长达800分钟的高清教学视频,手把手教会初学者 数个开发案例 ...
- ASP.NET MVC的Action拦截器(过滤器)ActionFilter
有时项目要进行客户端请求(action)进行拦截(过滤)验证等业务,可以使用拦截器进行实现,所谓的action拦截器也没有什么的,只是写一个类,继承另一个类(System.Web.Mvc.Filter ...
- iOS开发中 workspace 与 static lib 工程的联合使用
在iOS开发中,其实workspace的使用没有完全发挥出来,最近做了一些研究,也想把之前写过的代码整理下,因为iOS里面的布局方式,交互方式也就那么几种.所以,整理好了之后,更能快捷开发,而且能够形 ...
- 查看SSIS Package 部署的历史记录
1,通过Integration Services Catalogs来查看 打开SSISDB->Projects,查看指定project的version history,这种方式查看Deploye ...
- ::after::before清除浮动原理
先来看一段代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...