记录一下操作系统的课设过程
参考了很多前辈的教程,这里简略的总结一下:
1.首先要确定内核与linux系统版本是否匹配(不匹配的话捣鼓半天not support这是最气的),这里采用的是linux16.4版本的操作系统,linux 4.14.0版本的内核。具体的源码可以在github上或者https://www/kernel.org/上面下载。
2.将下载下来的内核压缩包解压到/user/src目录下
3.安装辅助工具
sudo apt install bison flex pkg-config build-essential libncurses5-dev libssl-dev libelf-dev 【如果安装出现问题重启就好了】
3. 增加系统调用号
【使用gedit进行编辑】gedit ./arch/x86/entry/syscalls/syscall_64_tbl(由于本机是64位系统,需要修改的就是这个,如果是32位系统,修改syscall_32_tbl就可以了)
如图所示,这里添加的系统调用号是333(随便填个数字也行,但是必须确保系统调用号是独一无二的)后面对common我猜是表示32位和64位都可以使用?【认真脸 当然写64也行
4.声明系统调用函数原型
gedit include/linux/syscall.h
加入的声明代码 : asmlinkage long sys_mycopy(const char *src_file, const char *copy_file);
5.添加系统调用函数的定义
gedit kernel/sys.c
文件位置如下(路径有问题的可以直接找这个文件来修改):
在文件的最后增加函数定义(借鉴了前辈的代码,优秀的代码千篇一律,感谢前辈为开源社区做出的贡献)
附代码:
1 asmlinkage long sys_mycopy(const char *src_file,const char *copy_file){ 2 int infd,outfd,count; 3 char buf[256]; 4 mm_segment_t fs; 5 fs = get_fs(); 6 set_fs(get_ds()); 7 if((infd=sys_open(src_file,O_RDONLY,0)) == -1) { 8 return 1; 9 } 10 if((outfd=sys_open(copy_file,O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR))== -1){ 11 return 2; 12 } 13 while((count = sys_read(infd,buf,256))>0) 14 { 15 if(sys_write(outfd,buf,count)!= count) 16 return 3; 17 } 18 if(count == -1) return 4; 19 sys_close(infd); 20 sys_close(outfd); 21 set_fs(fs); 22 return 0; 23 }
【之前自己敲代码的时候照着敲都敲错了,二次编译内核浪费了个把小时的时间,真菜啊,,,
6.最费时间的一步:编译内核
没啥说的,照着敲命令:
sudo make menuconfig 选择save然后退出就行,生成.config文件
sudo make -j 2(这里之后系统就会编译14.4的那个内核了,这里2是指你分配给系统2个线程来编译内核,由于编译时间很长,我2线程编译了个把小时,为了省时间,你也可以按照自己的机器分配更多的线程,当然,不同处理器时间不同)
然后就开始开心的玩手机吧。。。。有些编译步骤可能会卡住,花费一些时间,不要管,等着就行,千万不要手残去乱按。。。
7.sudo make modules_install安装模块
花费几分钟时间
8.sudo make install 安装内核
同样几分钟,最后一步啦。
9.重启系统,然后长按shift进入引导界面,高级选项
选择编译好的内核: 注意区分版本,是新编译好的版本是4.14.0,之前下载的那个是末尾有个old,我们选择新编译好的,进入系统。
10.检验系统调用是否成功:
写一个小程序检验一下:将test.c的文件拷贝为名字叫222.c的文件
1 clude<linux/kernel.h> 2 #include<sys/syscall.h> 3 #include<unistd.h> 4 5 int main() 6 { 7 8 long int aaa=syscall(333,"test.c","222.c"); 9 printf("%ld ",aaa); 10 return 0; 11 }