2020-2021-1 20212824《Linux内核原理与分析》第七周作业

fork

fork.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main(){
        int pid;
        /* pid 在父进程和子进程中各返回一次
         * 所以else if 和 else 的内容都会被执行
         * 在子进程中fork 的返回值是0
         * 在父进程中fork 的返回指是子进程的id
         * */
        pid = fork();//这是一个系统调用
        if(pid < 0){
                fprintf(stderr,"Fork failed");
                exit(-1);
        }else if(pid == 0){
                printf("this is child process\n");
        }else{
                printf("this is parent process\n");
                printf("this is the child pid %d\n",pid);
                /*parent will wait for child to complete*/
                wait(NULL);
                printf("child complete\n");
		}
  • fork创建进程,是靠复制父进程的。但是有些东西是不能复制的
  • 比如pid
  • 比如内存堆栈
    copy_process创建进程主要代码

GDB调试

设置断点

  • b sys_clone
  • b do_fork
  • b dup_task_struct
  • b copy_process
  • b copy_thread
  • b ret_from_fork
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

struct pt_regs *childregs = task_pt_regs(p) //找到内核堆栈压栈的地址

在这里插入图片描述
可以看到ret_from_fork可以跟踪到部分汇编代码
当到达syscall_exit时,就无法跟踪了

总结

库函数fork、vfork和clone这3个系统调用都可以创建一个新进程,且都是通过do_fork函数来创建进程的,只是传递的参数不同;
在do_fork中,最主要的是copy_process,这个东西主要干的是用dup_task_struct,复制当前的 task_struct、信息检查、初始化、把进程状态设置为 TASK_RUNNING、复制所有进程信息、调用 copy_thread 初始化子进程内核栈、设置子进程pid。

linux内核编译

已经完成的步骤有

  • make oldconfig

  • 在这里插入图片描述

  • sudo make bzImage -j4

  • 在这里插入图片描述

  • 然后就卡在sudo make modules

编译内核遇到的问题

从内核4.2版本开始,很多文件的位置发送了变化
sys.c文件在kernel/sys.c
syscalls.h文件在include/linux/syscalls.h
syscall_32.tbl就迁移到arch/x86/entry/syscalls目录下了

make[1]: *** [scripts/Makefile.host:9:scripts/kconfig/lexer.lex.c] 错误 127

sudo apt-get install flex
sudo apt-get install bison

没有可制作的目标…由"certs/x509_certificate_list"需求。停止

这个要去修改.config文件的内容

CONFIG_MODULE_SIG_KEY = "修改为空"
CONFIG_SYSTEM_TRUSTED_KEYS="修改为空"

对于sys_xzx的未定义引用

这个要去修改函数的写法
tbl文件中

335 64 xzx sys_xzx

磁盘扩容的问题

因为我是virtualbox虚拟机,磁盘扩容和vm虚拟机还不大一样,具体参考了

但是出了点问题,我没有把空间挂载到/目录上去,导致在进行在进行sudo make modules -j4的时候报错了。说设备空间已经满了,于是我打算重启再扩充一次磁盘空间,但是由于/路径下以及满了,虚拟机不能正常启动,所以我打算进入单用户模式调一下,再继续实验。

在这里插入图片描述
在这里插入图片描述

scripts/extract-cert.c:21:10: fatal error: openssl/bio.h: No such file or directory

sudo apt-get install libssl-dev

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值