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