我已经发布到这个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)
阅读(2673) | 评论(1) | 转发(0) |