Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1628949
  • 博文数量: 197
  • 博客积分: 10046
  • 博客等级: 上将
  • 技术积分: 1983
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-07 12:36
个人简介

在外企做服务器开发, 目前是项目经理, 管理两个server开发的项目。不做嵌入式好久了。

文章分类
文章存档

2011年(2)

2010年(6)

2009年(18)

2008年(30)

2007年(100)

2006年(41)

分类: LINUX

2008-05-22 22:03:14

  
我已经发布到这个mailing list里面了, 希望更多的人可以参与。
 
这个真的是非常好的中文的linux kernel交流平台。
 
大家有感兴趣的吗? 有兴趣的可以一起搞 。 当然编译好的kernel 也可以直接在2410的板子上调试。

有感兴趣的可以直接和我联系 。


1, 现在我成功编译过了, 改了很多东西, 思路是 基本保持AXFS的代码不变。它需要什么2.6的函数, 我就从2.6.18代码里面copy过来, 当然啊2.4和2.6变化很大, 有些东西还是要仔细思量怎么改的。
事实上 ,不改不知道, 接口变化太大了, 尤其是内存管理的方面,和文件系统接口。

- kernel版本:linux-2.4.18-rmk7-pxa1-mz5    ,原因是skyeye支持s3c2410 平台,而这个版本是含有s3c2410 patch的 。 参考的是 打完AXFS patch的2.6.18.0
- 编译器:2.95.3 ,比较经典的编译器。

我的patch到这里下载:



附件是我的patch , 里面有几种标记:
里面 有几个标记:


里面有一些标记:

1 ,  added by bob  ,  可能伴随着一些 bob fixed me   表示 我加的,但是可能有点疑问,但是基本上没问题。
2, bob modify it      我改过了, 意图是达到同样的目的。
3, bob delete it      我删掉了一些代码, 但多数都是一行。是根据我的理解 , 觉得对于2.4 是没用的。
4, bob is puzzled   我很迷惑一些东西, 实在没看懂 , 也没有时间看了。 将来再看。 调试的时候注意的地方。

目前只是编译通过了, 下一步还需要在skyey上debug 。

2,如何编译?

- 下载 linux-2.4.18-rmk7-pxa1-mz5 ()
- cross-2.95.3  (下载后 ,解压到 /usr/local/arm/下面)
- 把附件里面的patch 打到 linux-2.4.18-rmk7-pxa1-mz5
- make menuconfig , save it
- make dep && make zImage


3,如何修改的, 以及一些考虑:
举个例子 ,说明可能更直观一些。 其他的都是类似的改法。

用source insight改效率很高,copy过来后, 可以一下子知道某个子函数定没定义。

比如 , 函数file_accessed()  这个函数, 只有2.6 才有, 2.4 根本没有, 但是我们axfs 都间接的会调用到它 。

所以比较快捷的办法就是把它copy过来, 但是copy的过程,发现, file_accessed 也会调用其他的2.4 没有的函数 ,没办法, 只能都copy过来。

但是有些函数的实现有点问题,用到了明显不是2.4的函数。

比如下面的2.6的函数用到seqlock 这个机制,  2.4 根本没有, 但是这个比较明显, 我就可以直接把它改掉, 换成读写锁 。 目的也达到了。

如果再把seqlock的函数copy到2.4 就完全没有必要了。 有十足把握我没有标记, 把握不大的我做 bob is puzzled ,以便于将来调试时候, 查找。



所以我最后的策略是, 如果某段代码,我非常熟悉,就改 。 如果一点都不熟悉,比如AXFS的具体实现, 就只能照样copy 了。

struct timespec current_fs_time(struct super_block *sb)
{
struct timespec now = current_kernel_time();

//s_time_gran 这个field ,2.4 superblock根本没有,也可以加上, 这里就做了标记, 将来调试的时候注意。
// return timespec_trunc(now, sb->s_time_gran);  // bob fixed me , I need to research it   bob delete it
return now ;
}



//added by bob
inline struct timespec current_kernel_time(void)
{
       struct timespec now;
       unsigned long seq;
/*
* bob modify it ,because 2.4 don't need seqclock
       do {
               seq = read_seqbegin(&xtime_lock);

               now = xtime;  //now 和 xtime根不是不同的结构体, 2.6上一样,2.4下不同。
       } while (read_seqretry(&xtime_lock, seq));
*/

//改成了下面这个样子。
       write_lock_irq(&xtime_lock);

   //因为now 和 xtime是不同的结构体, 所以就变通的改一下。 这样肯定不会影响函数本身的功能。 目的也达到了。
       now.tv_sec = xtime.tv_sec;
       now.tv_nsec = (long)xtime.tv_usec * 1000;
       write_unlock_irq(&xtime_lock);

       return now;
}


第二个例子:

这也是改的时候, 碰到的一种情况:  想办法用2.4 现成的接口和机制。 这样功能是相同的。 只是途径不同。



2.4 inode 缺少2.6 的一个field   叫  i_mutex , 防止inode 操作时互斥用的。

我的改法就是 在2.4 inode中增加 i_mutex field .

而且 2.4 也没有mutex_lock() 函数。




ssize_t
xip_file_write(struct file *filp, const char __user *buf, size_t len,
              loff_t *ppos)
{
       ....

       //mutex_lock(&inode->i_mutex);
       down(&inode->i_mutex);
       if (!access_ok(VERIFY_READ, buf, len)) {
               ret=-EFAULT;
               goto out_up;
       }
       .....

out_up:
       //mutex_unlock(&inode->i_mutex);
       up(&inode->i_mutex);
       return ret;
}



--
同时既然增加了 i_mutex字段, 就必须在分配 inode的时候, 进行初始化 。
2.4 的 alloc_inode() 实现与 2.6 不同, 所以只能搜索 alloc_inode ()
有好几个地方:
static struct inode * get_new_inode(struct super_block *sb, unsigned long ino, struct list_head *head, find_inode_t find_actor, void *opaque)
{
struct inode * inode;

inode = alloc_inode();
if (inode) {
struct inode * old;

spin_lock(&inode_lock);
/* We released the lock, so.. */
old = find_inode(sb, ino, head, find_actor, opaque);
if (!old) {
  inodes_stat.nr_inodes++;
  list_add(&inode->i_list, &inode_in_use);
  list_add(&inode->i_hash, head);
  inode->i_sb = sb;
  inode->i_dev = sb->s_dev;
  inode->i_blkbits = sb->s_blocksize_bits;
  inode->i_ino = ino;
  inode->i_flags = 0;
  atomic_set(&inode->i_count, 1);
  inode->i_state = I_LOCK;
  //added by bob
  init_MUTEX(&inode->i_mutex);
  spin_unlock(&inode_lock);

Best Regards,
- Bob ( kernelChina.cublog.cn)
阅读(2657) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

bob_zhang20042008-10-07 08:51:40

现在已经可以在mips上run AXFS 了, 不过xip mode还有点问题。