快乐虾
http://blog.csdn.net/lights_joy/
本文适用于
ADSP-BF561
uclinux-2008r1.5-rc3
vs2008
欢迎转载,但请保留作者信息
前一阵子,将 uclinux 内核在 vs2008 下折腾了一道,现发布正式的工程文件,供有需要的朋友参考。
这个工程用于将 uclinux 内核的部分代码移植到 vs2008 下编译并模拟其运行,包括内存管理,设备管理和文件系统这三个部分的代码,删除了进程管理之类的功能。希望它能帮助对 uclinux 内核中这三个部分结构和算法的理解!
本工程仅用于研究之用!
下载地址:
http://sf.net/projects/vs-fs/
http://download.csdn.net/users/lights_joy/
使用 uclinux 将近两年了,深感使用之不易,内核理解之难。虽然有不少文档,但是对于自己的理解帮助不大。于是乎渴望有一工具能方便的对内核进行调试,在调试中理解内核的工作过程,将 uclinux 内核移植到 visual dsp ,初衷就是如此,这个工程,也是如此。
在 visual dsp 下调试内核,固然比较全面,但是其编译下载过程偏慢,于是乎希望求助于虚拟机,不过目前还没有一个虚拟机可以完整地模拟 blackfin 平台,只能放弃。
中间使用了一段时间的 code::blocks ,也将内核的内存管理这一块移植到 code::blocks 下,只是仍然觉得 c::b 的调试手段仍然不够完善,尤其在和 VS2008 相比较的情况下,仍然觉得痛苦。
最后瞄上了 vs2008 ,是不是有点夸张?呵呵!因为自认为对 C 和 uclinux 内核的掌握已经足以做这个移植的工作,所以就上马了 ………
本项目所用的原始内核为 bfin-uclinux-2008R1.5 ,可以从 http://blackfin.uclinux.org/ 下载,适用于 BLACKFIN 系列 DSP 。
这个主要是内核中大量使用 C99 语法定义结构体变量,比如:
static struct file_system_type sysfs_fs_type = {
/*.name =*/ "sysfs" ,
/*.fs_flags =*/ 0,
/*.get_sb =*/ sysfs_get_sb,
/*.kill_sb =*/ kill_litter_super,
};
这个只能对照着一个个地修改。
主要是 likely 和 unlikely 两个宏定义:
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
直接修改为:
#define likely(x) (x)
#define unlikely(x) (x)
内核中使用了很多 CONFIG_xxx 这样的宏进行功能配置,为此在每个 .c 文件的开头加上:
#include <config.h>
将相关的宏定义都放在这个头文件里面。
uclinux 内核使用 flat 方式管理内存,并用几个全局变量指出可用内存的起始位置和结束位置,为此,使用 malloc 分配 64M 内存,并将这几个全局变量分别指向这个内存块的起始位置和结束位置。
为了验证文件系统的正确性,工程中使用了一个 rootfs.initramfs 的根文件系统,这个文件系统在 linux 下编译而来。在工程中直接读取整个文件,并将头指针传递给 populate_rootfs ,在原始的内核中 rootfs 是放在内核可管理的 RAM 中的,但本工程则独立于 uclinux 可管理的内存块。
在下一个版本中,计划加上其它的文件系统支持,如 ext 等,然后模拟加上一层硬件驱动,这样此工程将可以用于在 windows 下读写其它格式分区的文件,也可以用于读写嵌入式系统中的特色文件系统如 YAFFS 或者 JFFS 之类的,再也不必千篇一律地采用 VFAT 。
使用 VS2008 IDE ,调用 gcc 进行内核的编译,加上虚拟机进行内核的调试。支持内核的自动配置,即在配置完成后能够自动生成 vs2008 的工程文件。
不过如果以一人之力,怕是难以见到这一天了 ~~~~~~~~~