学号最后三位编号:094
原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/
下载源码:
https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/(官方下载慢)
http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/v5.x/(下载快)
选择linux-5.0.1.tar.xz下载
使用以下两条指令解压
xz -d linux-5.0.1.tar.xz tar -xvf linux-5.0.1.tar
然后进入解压好的文件夹,进行配置
我没有使用i386的缺省编译;用make menuconfig进行设置,make -j2编译(编译完一共占了24g包括以前的一些东西,我默认设置的是20g空间)
(一定要确保空间够!!!)
(一定要确保空间够!!!)
(一定要确保空间够!!!)
重要的话说三遍
中间遇到的问题大多都是缺依赖,最头疼的是空间不够了,需要扩容,而且之前编译的也白费了
根据孟老师的文档,执行以下操作
cd Lab2 mkdir rootfs git clone https://github.com/mengning/menu.git cd menu/
//在这里来修改test.c加入自己学号后两位的系统调用
//我的学号是094 对应为fchmod 代码后附 gcc -o init linktable.c menu.c test.c -m32 -static -pthread cd ../rootfs/ cp ../menu/init ./ find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img
制作完成后,如下图
中间出现的问题:
解决方案:
https://blog.csdn.net/qq_32693119/article/details/80535662
需要启动x86-64的cpu,所以改为qemu-system-x86_64启动
使用gdb调试
创建main.c,代码来源fchmod百度百科(用qemu交互,找不到函数,符号表需要重新编译内核,时间不够)
编译并执行094
对094进行调试
单步执行,并查看寄存器信息
其中eax中放的是系统调用号94,ebx和ecx中则为传入参数文件描述符和权限
然后进入系统调用:
call *%gs:0x10 系统调用会从这里进入,调用int 0x80,进入内核态,system_call()执行。
关于94号系统调用fchmod,其过程为:
1.寄存器eax保存系统调用号94、ebx和ecx保存栈顶参数
2.调用中断指令int 0x80进入内核态
3.执行system_call(),此时根据eax查询系统调用表,找到服务地址,执行服务
4.服务结束后,恢复保存的现场,回到用户态,ret返回结果
原文:https://www.cnblogs.com/gesiyao/p/10561672.html