第一部分:
/**
* 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\n");
return 0;
}
/* This function is called when the module is removed. */
void simple_exit(void) {
printk(KERN_INFO "Removing Module\n");
}
/* 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\n");
}
module_init(simple_init);
module_exit(simple_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Simple Module");
MODULE_AUTHOR("SGG");
修改Makefile:
运行结果: