目录
1. 查看当前系统所使用的文件统的类型及版本号
root@binism-GE60-2OC-2OD-2OE:/home/binism# parted
可以看到
- 我的电脑硬一共有9个分区,它们分别是NTFS、EXT4、格式的。
- linux系统所占的分区为第八分区,起始位置分别是629GB处和744GB处。总大小为115GB。文件系统版本为EXT4。
2.阅读Ext3(或Ext4)文件系统,特别是索引节点相关的源代码
这里对struct inode
和 struct file
进行注释:
- 索引节点对象由inode结构体表示,定义文件在linux/fs.h中
- struct file结构体定义在include/linux/fs.h中定义
3.添加一个打印磁盘块号的系统调用
- 要求:为内核添加一个新的系统调用filesys, 其从调用者接收一个磁盘文件的全局路径名,打印该文件占用的所有磁盘块;
这个例子是我在stackoverflows上发现的,它实现了在用户空间对文件磁盘块号的打印。代码如下:
这段代码使用了函数ioctl(),这个函数并未在内核环境下定义,它相关实现在Linux/fs/ioctl.c中:
可以看见获取磁盘号的函数为ioctl_fibmap(),此函数同样定义在Linux/fs/ioctl.c中:
此函数使用的几个宏定义,如EINVAL
、CAP_SYS_RAWIO
、EPERM
等,
和使用的函数,如capable()
、get_user()
等, 在内核linux/include下的头文件中均有定义。
我们可以在系统调用的c文件中实现此函数,便可达到获取磁盘号的目的。
vim linux4.2.6/kernel/filesys.c
filesys.c
- 添加系统调用filesys
- 修改system table
cd ../linux-4.2.6/arch/x86/entry/syscalls
vim syscall_64.tbl
cd ../linux-4.2.6/include/linux
vim syscalls.h
在include/linux/syscalls.h文件的最后,#endif之前加入系统调用服务例程filesys;
- 编辑kernel目录下的Makefile文件
linux-4.6.2/kernel/Makefile
#
# Makefile for the linux kernel.
#
obj-y = fork.o exec_domain.o panic.o \
cpu.o exit.o softirq.o resource.o \
sysctl.o sysctl_binary.o capability.o ptrace.o user.o \
signal.o sys.o kmod.o workqueue.o pid.o task_work.o \
extable.o params.o \
kthread.o sys_ni.o nsproxy.o \
notifier.o ksysfs.o cred.o reboot.o \
async.o range.o smpboot.o \
+ filesys.o
make -j 4
make modules_install
make install
4.编写用户测试程序,测试filesys系统调用
- 查看/boot目录下linux3.19.0的映像文件所占磁盘块
test.c
gcc -o test test.c
../test
- 查看结果
注:prink不会向控制台输出信息,查看printk输出内容可使用dmesg命令查看
BINISM
/
/ - views
Published under(CC) BY-NC-SA 3.0 CN.