1、sudo s3. 进入/usr/src目录cd /usr/src4. 解压linux源码tar xvzf linux-3.0.tar.bz25. 进入目录linux-3.0.5cd linux-3.06. 添加系统调用操作:gedit kernel/myservice.c 在文本编辑器中添加#include linux/linkage.hasmlinkage void sys_mycall() printk(KERN_INFO Hello, world!n); return;7. 修改kernel/Makefile添加生成myservice.c添加到Makefile的编译规则中:obj-y +
2、= myservice.o8. .修改arch/x86/include/asm/unistd_32.h,添加以下内容:#define _NR_mycall SYS_ID /SYS_ID表示新添加系统调用的调用号并修改文件中的NR_syscalls,将其值增加19. 修改arxh/x86/include/asm/syscalls.h添加以下内容:asmlinkage void sys_mycall();10. 修改arch/x86/kernel/syscall_table_32.S,添加以下内容:.long sys_mycall11. 配置内核(仅仅修改local versions即可)命令:m
3、ake menuconfig12. 编译内核命令:make j4 bzImage(开4个线程编译)13. 编译内核模块命令:make j4 modules14. 安装内核模块命令:make modules_install15. 安装内核命令:make install16. 重启系统,在系统选择页面选择进入自己编译的linux-3.0内核17. 在桌面建立测试的C程序test.c程序内容如下:stdio.hint main(int argc, char *argv) syscall(SYS_ID); / SYS_ID表示新添加系统调用的调用号 return 0;18. 编译程序gcc test.
4、c o a.out19. 运行程序./a.out20. 查看内核日志(printk的输出信息在内核日志中):dmesg四 实验结果1. 成功完成内核编译的任务,结果显示图如下:2. 下图为添加系统调用结果五 实验小结这次实验的内核编译需要进行一系列比较花时间的操作过程,但同时也锻炼了实际动手能力,在实践中对于操作系统这门课有了进一步的了解。同时,在本次实验中,学习了linux系统的使用方法,掌握了很多的基本命令,也明白了添加系统调用的方法,为以后的学习提供了很大的帮助。实验四:一个简单文件系统的实现1. 熟悉Ext文件系统的原理2. 根据Ext文件系统的数据结构和构建方法,自行实现一个简单的内
5、存文件系统1.设计并实现一个一级(单用户)文件系统程序a.提供以下操作:a) 文件创建/删除接口命令create/deleteb) 目录创建/删除接口命令mkdir/rmdirc) 显示目录内容命令lsb.创建的文件不要求格式和内容2.设计并实现一个二级文件系统程序a.提供用户登录;b.文件、目录要有权限三 实验原理Ext文件系统结构:1. 引导块BootBlock 每个硬盘分区的开头1024字节,即0 byte至1023 byte是分区的启动扇区。存放由ROM BIOS自动读入的引导程序和数据,但这只对引导设备有效,而对于非引导设备,该引导块不含代码。这个块与ext2没有任何关系。2. 超级
6、块SuperBlock每个分区均有一个super block块,定义了文件系统的全局信息,包括块的大小,总块数,空闲块,索引结点数,各种位图和i节点表的地址和大小等信息。3. 数据块位图这是ext2管理存储空间的方法。即位图法。每个位对应一个数据块,位值为0表示空闲,1表示已经分配。数据块位图定义为一个块大小。于是,一个组中的数据块个数就决定了。假设块大小为b 字节。可以区别的块数为b*8个 4. 数据块 DataBlocks每个组的数据最大个数是在块大小定义后就确定了的。所以组容量也就确定了。那么组容量就确定为(b*8)*b字节 若1块=4K,则组块大小=4K*8*4K=128M5. ino
7、de位图 与数据块位图相似,用来表示索引结点是否已经被使用。假设块大小为b字节,每个索引结点数据结构大小为128字节。最多可以有b*8个索引结点,索引结点表需要占用的存储空间大小为(b*8)*128字节。即(b*8)*128/b=8*128个块 6. inode表索引结点表由若干个索引结点数据结构组成,需要占用若干个块。Ext2中的每个索引结点数据结构大小为128字节。每个索引结点即对应一个文件或是目录。是对其除文件名(目录名)以外的所有属性的描述。例如:文件类型,文件创建时间,访问时间,修改时间,文件所占数据块的个数,指向数据块的指针。其中,数据块指针是由15个元组的数据组成 四实验步骤运行
8、结果 1. 根据要求编写源程序,实验源代码见附录1。 2. 运行程序,运行结果如图:1. 根据提示输入help,结果如图:2. 输入ls 列出根目录下的项目,然后创建文件目录c 再输入ls观察是否创建成功: 5 进入文件目录c并在c中创建文件a 6 打开a,并读取a 7. 关闭a7. 删除a9. 删除文件目录c五. 实验小结 本次实验要求建立一个文件系统,由于在专业课上的基本知识学习比较薄弱,所以参考了网上的一些代码,进行了一些修改后最后获得结果。最后,也算完成了一个简单的文件系统,具备了题目中的要求。但在以后的学习中,还要对这一方面的知识进行一些补充。附录1:实验源码:time.hstrin
9、g.hsignal.h#define DATA_BLOCK 263680 /数据块起始地址#define BLOCK_SIZE 512 /块大小#define DISK_START 0 /磁盘开始地址#define BLOCK_BITMAP 512 /块位图起始地址#define INODE_BITMAP 1024/inode 位图起始地址#define INODE_TABLE 1536/索引节点表起始地址#define INODE_SIZE 64 /struct inode的大小struct group_desc char bg_volume_name16; /卷名 unsigned sho
10、rt bg_block_bitmap; /保存块位图的块号 unsigned short bg_inode_bitmap; /保存索引结点位图的块号 unsigned short bg_inode_table; /索引结点表的起始块号 unsigned short bg_free_blocks_count; /本组空闲块的个数 unsigned short bg_free_inodes_count; /本组空闲索引结点的个数 unsigned short bg_used_dirs_count; /本组目录的个数 char bg_pad4; /填充(0xff);struct inode unsi
11、gned short i_mode; /文件类型及访问权限 unsigned short i_blocks; /文件的数据块个数 unsigned long i_size; /大小( 字节) unsigned long i_atime; /访问时间 unsigned long i_ctime; /创建时间 unsigned long i_mtime; /修改时间 unsigned long i_dtime; /删除时间 unsigned short i_block8; /指向数据块的指针 char i_pad24;struct dir_entry /目录项结构 unsigned short i
12、node; /索引节点号 unsigned short rec_len; /目录项长度 unsigned short name_len; /文件名长度 char file_type; /文件类型(1: 普通文件, 2: 目录. ) char name9; /文件名char Buffer512; /针对数据块的 缓冲区char tempbuf4097; /unsigned char bitbuf512; /位图缓冲区unsigned short index_buf256;short fopen_table16; / 文件打开表unsigned short last_alloc_inode; /
13、最近分配的节点号unsigned short last_alloc_block; / 最近分配的数据块号unsigned short current_dir; / 当前目录的节点号struct group_desc super_block1; / 组描述符缓冲区struct inode inode_area1; / 节点缓冲区struct dir_entry dir32; / 目录项缓冲区char current_path256; / 当前路径名unsigned short current_dirlen;FILE *fp;void update_group_desc() fseek(fp,DI
14、SK_START,SEEK_SET); fwrite(super_block,BLOCK_SIZE,1,fp);void reload_group_desc()/载入组描述符 fread(super_block,BLOCK_SIZE,1,fp);void update_inode_bitmap()/更新inode位图 fseek(fp,INODE_BITMAP,SEEK_SET); fwrite(bitbuf,BLOCK_SIZE,1,fp);void reload_inode_bitmap()/载入inode位图 fread(bitbuf,BLOCK_SIZE,1,fp);void upda
15、te_block_bitmap()/更新block位图 fseek(fp,BLOCK_BITMAP,SEEK_SET);void reload_block_bitmap()/载入block位图 void update_inode_entry(unsigned short i)/更新第i个inode入口 fseek(fp,INODE_TABLE+(i-1)*INODE_SIZE,SEEK_SET); fwrite(inode_area,INODE_SIZE,1,fp);void reload_inode_entry(unsigned short i)/载入第i个inode入口 fread(ino
16、de_area,INODE_SIZE,1,fp);void reload_dir(unsigned short i)/更新第i个目录 fseek(fp,DATA_BLOCK+i*BLOCK_SIZE,SEEK_SET); fread(dir,BLOCK_SIZE,1,fp);void update_dir(unsigned short i)/载入第i个目录 fwrite(dir,BLOCK_SIZE,1,fp);void reload_block(unsigned short i)/载入第i个数据块 fread(Buffer,BLOCK_SIZE,1,fp);void update_block
17、(unsigned short i)/更新第i个数据块 fwrite(Buffer,BLOCK_SIZE,1,fp);int alloc_block()/分配一个数据块,返回数据块号; unsigned short cur=last_alloc_block; unsigned char con=128; int flag=0; if(super_block0.bg_free_blocks_count=0) printf(There is no block to be alloced! return(0); reload_block_bitmap(); cur=cur/8; while(bitb
18、ufcur=255) if(cur=511)cur=0; else cur+; while(bitbufcur&con) con=con/2; flag+; bitbufcur=bitbufcur+con; last_alloc_block=cur*8+flag; update_block_bitmap(); super_block0.bg_free_blocks_count-; update_group_desc(); return last_alloc_block;void remove_block(unsigned short del_num)/删除一个block unsigned sh
19、ort tmp; tmp=del_num/8; switch(del_num%8)/更改block位图 case 0:bitbuftmp=bitbuftmp&127;break; case 1:191; case 2:223; case 3:239; case 4:247; case 5:251; case 6:253; case 7:254; super_block0.bg_free_blocks_count+;/int get_inode()/分配一个inode,返回序号 unsigned short cur=last_alloc_inode; if(super_block0.bg_fre
20、e_inodes_count=0)There is no Inode to be alloced! reload_inode_bitmap(); cur=(cur-1)/8; last_alloc_inode=cur*8+flag+1; update_inode_bitmap(); super_block0.bg_free_inodes_count-; return last_alloc_inode;void remove_inode(unsigned short del_num) tmp=(del_num-1)/8; switch(del_num-1)%8)/更改block位图 super_
21、block0.bg_free_inodes_count+;/ dir void dir_prepare(unsigned short tmp,unsigned short len,int type) /新目录和文件初始化.and . reload_inode_entry(tmp);/得到新目录的节点入口地址 if(type=2)/目录 inode_area0.i_size=32; inode_area0.i_blocks=1; inode_area0.i_block0=alloc_block(); dir0.inode=tmp; dir1.inode=current_dir; dir0.nam
22、e_len=len; dir1.name_len=current_dirlen; dir0.file_type=dir1.file_type=2; for(type=2;type32;type+) dirtype.inode=0; strcpy(dir0.name,. strcpy(dir1.name,. update_dir(inode_area0.i_block0); inode_area0.i_mode=01006;/drwxrwxrwx:目录 else inode_area0.i_size=0; inode_area0.i_blocks=0; inode_area0.i_mode=0407;文件 update_inode_entry(tmp);unsigned short reserch_file(char tmp9,int file_type,unsigned short *inode_num,unsigned short *block_num,unsign
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1