设计一个新文件系统。

设计一个新文件系统。
文件系统设计牵扯到 代码阅读,编译,gdb调试。 排错。 设计等很多方面。
不仅要有扎实的功底, 还要有灵活的思路和解决问题的能力。

有一个linux2.4 kernel 下uxfs 的设计代码, 说实话,里面代码不少微小的考虑不周到的地方。
不像是一个经典的作品。 但就拿它当靶子吧。 将这个代码移植到linux2.6.32 内核下。

由于内核接口的变动, 代码必须要做相应的改变。 这里罗列出大概需要改动的地方。
至于怎样发现这些改动点。
1. 借助google, baidu.(大家都知道)
2. 借助内核头文件和代码(阅读能力)
3. 借助样例代码。(要会找, linux内核及demo 就是很好的样例)
4. 借助debug (要会分析。例如我从频繁的崩溃中用addr2line 定位了崩溃代码位置。 并推断为缺少了
   文件系统必要的接口函数,逐步补全解决了问题。

由于也曾移植过驱动sbull.c, 所以一并将重要的改动罗列于此,供以后需要时方面查阅
--------------------------------------------------------------------------------
1.对于三处expected ')'before '*' token这个貌似语法错误的报错,这三个函数都使用了request_queue_t*这个参数,对照2.6.10和2.6.32的源码发现,
    在2.6.32中取消了typedef struct request_queue request_queue_t这个结构定义。那就自己在sbull.c源码中加入这一句。
2.bio_cur_sectors不存在,
    在2.6.10源码中发现这个宏的定义是#define bio_cur_sectors(bio) (bio_iovec(bio)->bv_len>>9),
    在2.6.32中已经删除该宏,函数bio_cur_bytes返回bio_iovec(bio)->bv_len,所以将其改为bio_cur_bytes(bio)>>9;
3.rq_for_each_bio未定义,发现改成了__rq_for_each_bio,修改之~;
4.elv_next_request不存在,改成了blk_fetch_request,有两处,改之~
5.end_request,改成了blk_end_request_all,改之~
6.现在不能直接获取request结构的sector和current_nr_sector;
    而是通过函数blk_rq_pos和blk_rq_cur_sectors获得,所以两处改为:
    sbull_transfer(dev, blk_rq_pos(req), blk_rq_cur_sectors(req), req->buffer, rq_data_dir(req));
7.end_that_request_first,end_that_request_last,blk_dequeque_request已经不存在,
    被blk_fetch_request,blk_end_request_cur,blk_start_request代替所以要做一下修改在sbull_full_request中:
    if (!__blk_end_request_cur(req, 0)) {
    blk_start_request(req);
    blk_fetch_request(q);
8.bio_endio参数过多,发现6.32.16中少了中间那个参数,去掉~
9.blk_queue_hardsect_size未定义,在2.6.10中找到定义,直接修改如下:
    blk_queue_logical_block_size(dev->queue, hardsect_size);
10. make之后有些warning,执行insmod,出错了,显示blk_put_queue未定义,直接删掉。
因此只需要将报error的代码做如下修改

11.
current->uid 修改为 current->cred->uid
current->euid 修改为 current->cred->euid
12.
The function pointers 'prepare_write' and 'commit_write' in the
structure 'address_space_operations' (in file 'fs.h') have been
removed , and new function pointers 'write_begin' and 'write_end' have
been added to it since kernel 2.6.


代码距离大文件,大磁盘操作还有一定距离,更完善的系统设计还在进行。
但它简单所以具有入门参考价值。 源代码已经上传到csdn:http://download.csdn.net/detail/hejinjing_tom_com/6208303
代码可以运行并做了一些更改,例如block_size 改为了4096 .(再大就不允许了)

下面是调试过程。
--------------------------------------------------------------------------------
使用通用命令调试文件或使用自编写,编译测试工具测试打开,读,写,关闭操作。
----------------------------------------
Directory Lookups and Pathname Resolution
----------------------------------------
b ux_lookup            // cp file
b ux_readdir        // ls 命令可触发


----------------------------------------
Creating and Removing Directories
----------------------------------------
ux_lookup
ux_mkdir
ux_rmdir


----------------------------------------
Inode Manipulation
----------------------------------------
mark_inode_dirty(inode)
bp ux_create            // create a
bp ux_write_inode        // touch a
bp ux_delete_inode        // rm a


----------------------------------------
File I/O in uxfs
----------------------------------------
reading from file; cat cmd
writing to file ; cp

--------------------------------------------------------------------------------
mount
mount -t uxfs -o loop uxfs.flp /mnt/fdux/
会执行 ux_get_super 函数, 并read the root INODe (uxfs_iget)
touch /mnt/fdux/test.txt 会执行 ux_write_super.
Unmounting the Filesystem 会执行ux_put_super  

test filesystem        mount/umount    success
test readdir        ls                success
test open/create    touch file(null file)    success
test close/remove    rm file(null file)    success    
test read             cat file          success,
test write           cp file         success,
test mkdir            mkdir            success
remove dir            rm                success



你可能感兴趣的:(设计一个新文件系统。)