操作系统概念——编程项目二
第一部分:
/** * simple.c * * A simple kernel module. * * To compile, run makefile by entering "make" * * Operating System Concepts - 10th Edition * Copyright John Wiley & Sons - 2018 */ #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> /* This function is called when the module is loaded. */ int simple_init(void) { printk(KERN_INFO "Loading Module "); return 0; } /* This function is called when the module is removed. */ void simple_exit(void) { printk(KERN_INFO "Removing Module "); } /* Macros for registering module entry and exit points. */ module_init( simple_init ); module_exit( simple_exit ); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Simple Module"); MODULE_AUTHOR("SGG");
第二部分:
#include<linux/list.h> #include<linux/kernel.h> #include<linux/module.h> #include<linux/init.h> #include<linux/types.h> #include<linux/slab.h> struct birthday{ int day; int month; int year; struct list_head list; }; static LIST_HEAD(birthday_list); void add_birthday_list(int day, int month, int year){ struct birthday *person; person = kmalloc(sizeof(*person), GFP_KERNEL); person->day = day; person->month = month; person->year = year; INIT_LIST_HEAD(&person->list); list_add_tail(&person->list, &birthday_list); } int simple_init(void){ add_birthday_list(23, 1, 2003); add_birthday_list(12, 5, 2001); add_birthday_list(5, 9, 1994); add_birthday_list(3, 8, 1950); add_birthday_list(5, 12, 1920); printk(KERN_INFO "Loading Module"); struct birthday *ptr; list_for_each_entry(ptr ,&birthday_list , list){ printk(KERN_INFO "his irthday: %d/%d/%d", ptr->day, ptr->month, ptr->year); } return 0; } void simple_exit(void){ struct birthday *ptr, *next; list_for_each_entry_safe(ptr, next, &birthday_list, list){ list_del(&ptr->list); kfree(ptr); } printk(KERN_INFO "Removing Module "); } module_init(simple_init); module_exit(simple_exit); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Simple Module"); MODULE_AUTHOR("SGG");
修改Makefile: 运行结果: