添加了进程创建的基本知识...

This commit is contained in:
gatieme committed 2016-05-18 23:44:02 +08:00
1 parent 581f98e6d4
commit 5a480b92bc
5 files changed
+304 -1

No files matched your search

+18
View File
@@ -0,0 +1,18 @@
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
make -C $(KERNELDIR) M=$(PWD) modules
clean:
make -C $(KERNELDIR) M=$(PWD) clean
endif
+30
View File
@@ -0,0 +1,30 @@
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
unsigned int cpu = get_cpu();
struct module *mod;
printk(KERN_ALERT "this module: %p==%p\n", &__this_module, THIS_MODULE);
printk(KERN_ALERT "module state: %d\n", THIS_MODULE->state);
printk(KERN_ALERT "module name: %s\n", THIS_MODULE->name);
list_for_each_entry(mod, *(&THIS_MODULE->list.prev), list);
printk(KERN_ALERT "module name: %s\n", mod->name);
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "module state: %d\n", THIS_MODULE->state);
}
module_init(hello_init);
module_exit(hello_exit);
+41
View File
@@ -0,0 +1,41 @@
| 日期 | 内核版本 | 架构| 作者 | GitHub| CSDN |
| ------------- |:-------------:|:-------------:|:-------------:|:-------------:|:-------------:|
| 2016-05-12 | [Linux-4.5](http://lxr.free-electrons.com/source/?v=4.5) | X86 & arm | [gatieme](http://blog.csdn.net/gatieme) | [LinuxDeviceDrivers](https://github.com/gatieme/LDD-LinuxDeviceDrivers) | [Linux-进程管理与调度](http://blog.csdn.net/gatieme/article/category/6225543) |
Unix标准的复制进程的系统调用时fork(即分叉),但是Linux,BSD等操作系统并不止实现这一个,确切的说linux实现了三个,fork,vfork,clone(确切说vfork创造出来的是轻量级进程,也叫线程,是共享资源的进程)
| 系统调用 | 描述 |
|:-------------:|:-------------:|
| fork | fork创造的子进程是父进程的完整副本,复制了父亲进程的资源,包括内存的内容task_struct内容 |
| vfork | vfork创建的子进程与父进程共享数据段,而且由vfork()创建的子进程将先于父进程运行 |
| clone | Linux上创建线程一般使用的是pthread库 实际上linux也给我们提供了创建线程的系统调用,就是clone |
>关于fork, vfork和clone的用户空间的详细知识,请参见
>
>[Linux中fork,vfork和clone详解(区别与联系)](http://blog.csdn.net/gatieme/article/details/51417488)
>
>在那里我们详细讲解了,linux系统编程创建进程的方法,写时复制技术,vfork和clone的由来,但是并未涉及内核中的实现机制,
>
>但是在这里,我们会着重关注内核中是如何实现这个三个系统调用来创建进程,或者是从原有的进程中复制出一个新的进程
#为什么叫进程复制
-------
为什么我们老是把linux进程的创建叫做进程的复制呢?
#系统调用
-------
fork, vfork和clone系统调用的入口函数分别是sys_fork, sys_vfork, sys_clone函数。
其定义依赖于具体的体系结构, 因为在用户空间和内核空间之间传递参数的方法因体系结构而异, 但是他们的完成的工作却是基本相同,他们的任务就是从处理器寄存器中提取到由用户空间提供的信息,然后调用与体系结构无关的do_fork函数, 后者才是进程的真正创建者,完成了进程复制的所有工作
File diff suppressed because it is too large. Load diff
@@ -88,14 +88,20 @@ static void print_uts_namespace(struct uts_namespace *utsns)
static int __init init_uts_name(void)
{
printk("=====================\n");
print_uts_namespace(utsns);
printk("=====================\n");
return 0;
}
static void __exit exit_uts_name(void)
{
printk(KERN_ALERT "Good Bye!!--uts_name");
printk("=====================\n");
printk(KERN_ALERT "Good Bye!!--uts_name\n");
printk("=====================\n");
}
module_init(init_uts_name);