diff --git a/study/kernel/process/task/current/Makefile b/study/kernel/process/task/current/Makefile new file mode 100644 index 0000000..96d7084 --- /dev/null +++ b/study/kernel/process/task/current/Makefile @@ -0,0 +1,18 @@ +ifneq ($(KERNELRELEASE),) + +obj-m := my_current.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 diff --git a/study/kernel/process/task/current/my_current.c b/study/kernel/process/task/current/my_current.c new file mode 100644 index 0000000..8a9add2 --- /dev/null +++ b/study/kernel/process/task/current/my_current.c @@ -0,0 +1,39 @@ +#include +#include +#include +#include +#include +#include + +#ifndef THREAD_SIZE +#define THREAD_SIZE 0x00002000 +#endif + +#define my_current my_get_current +#define my_get_current (my_current_thread_info()->task) + +register unsigned long my_current_stack_pointer asm("esp") __used; + + static inline struct thread_info *my_current_thread_info(void) +{ + return (struct thread_info *) + (my_current_stack_pointer & ~(THREAD_SIZE - 1)); +} + +static int __init lkp_init(void) +{ + printk("pid = %d\n",current->pid); + printk("name = %s\n",current->comm); + printk("pid = %d\n",my_current->pid); + printk("name = %s\n",my_current->comm); + return 0; +} + +static void __exit lkp_cleanup(void) +{ + printk("<1>bye!\n"); +} + +module_init(lkp_init); +module_exit(lkp_cleanup); +MODULE_LICENSE("GPL");