Lab 5
This commit is contained in:
		
							parent
							
								
									8d1b1537be
								
							
						
					
					
						commit
						dcf7056a24
					
				
							
								
								
									
										3
									
								
								lab_5/Kbuild
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								lab_5/Kbuild
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | # kbuild part of makefile | ||||||
|  | obj-m   := hello1.o hello2.o | ||||||
|  | ccflags-y := -I$(obj)/inc | ||||||
							
								
								
									
										11
									
								
								lab_5/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								lab_5/Makefile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | ifneq ($(KERNELRELEASE),) | ||||||
|  | include Kbuild | ||||||
|  | else | ||||||
|  | # normal makefile
 | ||||||
|  | KDIR ?= /lib/modules/`uname -r`/build | ||||||
|  | 
 | ||||||
|  | default: | ||||||
|  | 	$(MAKE) -C $(KDIR) M=$$PWD | ||||||
|  | clean: | ||||||
|  | 	$(MAKE) -C $(KDIR) M=$$PWD clean | ||||||
|  | endif | ||||||
							
								
								
									
										125
									
								
								lab_5/hello1.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								lab_5/hello1.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,125 @@ | |||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Copyright (c) 2017, GlobalLogic Ukraine LLC | ||||||
|  |  * All rights reserved. | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright | ||||||
|  |  *    notice, this list of conditions and the following disclaimer. | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  |  *    notice, this list of conditions and the following disclaimer in the | ||||||
|  |  *    documentation and/or other materials provided with the distribution. | ||||||
|  |  * 3. All advertising materials mentioning features or use of this software | ||||||
|  |  *    must display the following acknowledgement: | ||||||
|  |  *    This product includes software developed by the GlobalLogic. | ||||||
|  |  * 4. Neither the name of the GlobalLogic nor the | ||||||
|  |  *    names of its contributors may be used to endorse or promote products | ||||||
|  |  *    derived from this software without specific prior written permission. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY GLOBALLOGIC UKRAINE LLC ``AS IS`` AND ANY | ||||||
|  |  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||||
|  |  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||||
|  |  * DISCLAIMED. IN NO EVENT SHALL GLOBALLOGIC UKRAINE LLC BE LIABLE FOR ANY | ||||||
|  |  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||||
|  |  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  |  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||||
|  |  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||||
|  |  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||||
|  |  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <linux/init.h> | ||||||
|  | #include <linux/module.h> | ||||||
|  | #include <linux/printk.h> | ||||||
|  | #include <linux/slab.h> | ||||||
|  | 
 | ||||||
|  | MODULE_AUTHOR("Serhii Popovych <serhii.popovych@globallogic.com>"); | ||||||
|  | MODULE_DESCRIPTION("Hello, world in Linux Kernel Training"); | ||||||
|  | MODULE_LICENSE("Dual BSD/GPL"); | ||||||
|  | 
 | ||||||
|  | struct TimingList { | ||||||
|  | 	struct TimingList *next; | ||||||
|  | 	ktime_t time_before; | ||||||
|  | 	ktime_t time_after; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static struct TimingList *list_head; | ||||||
|  | 
 | ||||||
|  | static struct TimingList *write_first_node(void) | ||||||
|  | { | ||||||
|  | 	list_head = kmalloc(sizeof(struct TimingList), GFP_KERNEL); | ||||||
|  | 	list_head->next = NULL; | ||||||
|  | 
 | ||||||
|  | 	return list_head; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static struct TimingList *insert_next_node(struct TimingList *tail) | ||||||
|  | { | ||||||
|  | 	struct TimingList *new_node = kmalloc(sizeof(struct TimingList), | ||||||
|  | 						GFP_KERNEL); | ||||||
|  | 
 | ||||||
|  | 	tail->next = new_node; | ||||||
|  | 	new_node->next = NULL; | ||||||
|  | 
 | ||||||
|  | 	return new_node; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static struct TimingList *add_new_node(struct TimingList *tail) | ||||||
|  | { | ||||||
|  | 	if (tail == NULL) | ||||||
|  | 		return write_first_node(); | ||||||
|  | 	else | ||||||
|  | 		return insert_next_node(tail); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void print_time_diff(struct TimingList *node) | ||||||
|  | { | ||||||
|  | 	pr_info("%lld\n", node->time_after - node->time_before); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void destroy_list(void) | ||||||
|  | { | ||||||
|  | 	struct TimingList *current_node = list_head; | ||||||
|  | 	struct TimingList *next_node = NULL; | ||||||
|  | 
 | ||||||
|  | 	list_head = NULL; | ||||||
|  | 
 | ||||||
|  | 	while (current_node != NULL) { | ||||||
|  | 		print_time_diff(current_node); | ||||||
|  | 
 | ||||||
|  | 		next_node = current_node->next; | ||||||
|  | 		kfree(current_node); | ||||||
|  | 		current_node = next_node; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | EXPORT_SYMBOL(destroy_list); | ||||||
|  | 
 | ||||||
|  | static int __init hello_init(void) | ||||||
|  | { | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void print_hello(int message_count) | ||||||
|  | { | ||||||
|  | 	int i; | ||||||
|  | 	struct TimingList *current_tail = list_head; | ||||||
|  | 
 | ||||||
|  | 	for (i = 0; i < message_count; i++) { | ||||||
|  | 		current_tail = add_new_node(current_tail); | ||||||
|  | 
 | ||||||
|  | 		current_tail->time_before = ktime_get(); | ||||||
|  | 		pr_info("Hello, world!\n"); | ||||||
|  | 		current_tail->time_after = ktime_get(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | EXPORT_SYMBOL(print_hello); | ||||||
|  | 
 | ||||||
|  | static void __exit hello_exit(void) | ||||||
|  | { | ||||||
|  | 	destroy_list(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | module_init(hello_init); | ||||||
|  | module_exit(hello_exit); | ||||||
							
								
								
									
										68
									
								
								lab_5/hello2.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								lab_5/hello2.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,68 @@ | |||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Copyright (c) 2017, GlobalLogic Ukraine LLC | ||||||
|  |  * All rights reserved. | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright | ||||||
|  |  *    notice, this list of conditions and the following disclaimer. | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  |  *    notice, this list of conditions and the following disclaimer in the | ||||||
|  |  *    documentation and/or other materials provided with the distribution. | ||||||
|  |  * 3. All advertising materials mentioning features or use of this software | ||||||
|  |  *    must display the following acknowledgement: | ||||||
|  |  *    This product includes software developed by the GlobalLogic. | ||||||
|  |  * 4. Neither the name of the GlobalLogic nor the | ||||||
|  |  *    names of its contributors may be used to endorse or promote products | ||||||
|  |  *    derived from this software without specific prior written permission. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY GLOBALLOGIC UKRAINE LLC ``AS IS`` AND ANY | ||||||
|  |  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||||
|  |  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||||
|  |  * DISCLAIMED. IN NO EVENT SHALL GLOBALLOGIC UKRAINE LLC BE LIABLE FOR ANY | ||||||
|  |  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||||
|  |  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  |  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||||
|  |  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||||
|  |  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||||
|  |  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <linux/init.h> | ||||||
|  | #include <linux/module.h> | ||||||
|  | #include <linux/printk.h> | ||||||
|  | #include <linux/slab.h> | ||||||
|  | 
 | ||||||
|  | #include "hello1.h" | ||||||
|  | 
 | ||||||
|  | MODULE_AUTHOR("Serhii Popovych <serhii.popovych@globallogic.com>"); | ||||||
|  | MODULE_DESCRIPTION("Hello, world in Linux Kernel Training"); | ||||||
|  | MODULE_LICENSE("Dual BSD/GPL"); | ||||||
|  | 
 | ||||||
|  | static unsigned int message_count = 0; | ||||||
|  | 
 | ||||||
|  | static int __init hello_init(void) | ||||||
|  | { | ||||||
|  | 	if (message_count > 10) { | ||||||
|  | 		pr_err("Error: message_count too large (%d > 10)\n", message_count); | ||||||
|  | 		return -EINVAL; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (message_count == 0 || message_count >= 5) | ||||||
|  | 		pr_warn("Warning: message_count = %d (message_count == 0 or 5 <= message_count <= 10)\n", message_count); | ||||||
|  | 
 | ||||||
|  | 	print_hello(message_count); | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void __exit hello_exit(void) | ||||||
|  | { | ||||||
|  | 	destroy_list(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | module_param(message_count, uint, 0444); | ||||||
|  | MODULE_PARM_DESC(message_count, "Amount of Hello World!-s to print on load"); | ||||||
|  | 
 | ||||||
|  | module_init(hello_init); | ||||||
|  | module_exit(hello_exit); | ||||||
							
								
								
									
										2
									
								
								lab_5/inc/hello1.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								lab_5/inc/hello1.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | |||||||
|  | void print_hello(int message_count); | ||||||
|  | void destroy_list(void); | ||||||
							
								
								
									
										18
									
								
								lab_5/test.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										18
									
								
								lab_5/test.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,18 @@ | |||||||
|  | #!/bin/sh | ||||||
|  | 
 | ||||||
|  | if [ -z "$1" ]; then | ||||||
|  | 	echo "Error: no script supplied" | ||||||
|  | 	echo "Usage: $0 path/to/testing/script" | ||||||
|  | 	exit 1 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | while read l; do | ||||||
|  | 	if [ -z "$l" ]; then | ||||||
|  | 		continue; | ||||||
|  | 	fi; | ||||||
|  | 
 | ||||||
|  | 	echo "$ $l"; | ||||||
|  | 	$($l); | ||||||
|  | 
 | ||||||
|  | 	echo -e "" | ||||||
|  | done < $1 | ||||||
							
								
								
									
										33
									
								
								lab_5/tests/lab5-test
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								lab_5/tests/lab5-test
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | |||||||
|  | insmod hello2.ko | ||||||
|  | 
 | ||||||
|  | insmod hello1.ko | ||||||
|  | 
 | ||||||
|  | insmod hello2.ko | ||||||
|  | rmmod hello2.ko | ||||||
|  | 
 | ||||||
|  | insmod hello2.ko message_count=0 | ||||||
|  | rmmod hello2.ko | ||||||
|  | 
 | ||||||
|  | insmod hello2.ko message_count=1 | ||||||
|  | rmmod hello2.ko | ||||||
|  | 
 | ||||||
|  | insmod hello2.ko message_count=3 | ||||||
|  | rmmod hello2.ko | ||||||
|  | 
 | ||||||
|  | insmod hello2.ko message_count=5 | ||||||
|  | rmmod hello2.ko | ||||||
|  | 
 | ||||||
|  | insmod hello2.ko message_count=8 | ||||||
|  | rmmod hello2.ko | ||||||
|  | 
 | ||||||
|  | insmod hello2.ko message_count=10 | ||||||
|  | rmmod hello2.ko | ||||||
|  | 
 | ||||||
|  | insmod hello2.ko message_count=12 | ||||||
|  | rmmod hello2.ko | ||||||
|  | 
 | ||||||
|  | insmod hello2.ko | ||||||
|  | rmmod hello1.ko | ||||||
|  | 
 | ||||||
|  | rmmod hello2.ko | ||||||
|  | rmmod hello1.ko | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user