2014-10-11 168 views
2

基本上,对于我的操作系统类,我正在编写一个模拟5个终端机场穿梭机的内核模块。到目前为止,我已经能够实现系统调用并验证它们是否正常工作。但是,我试图将这些系统调用链接到一个模块中。对于每个内核存根和函数,当我尝试插入模块时,它表示它是未定义的。另外,作为副产品,当我运行此命令时,模块不会插入:make; sudo insmod terminal.ko由于模块中存在未知符号,这是我发现很少或没有任何文档的错误。内核模块函数未定义

这里的输出,当我试图让并将其插入:

make -C /lib/modules/`uname -r`/build/ M=`pwd` modules 
make[1]: Entering directory `/home/taylor/OPSYS_P2/linux-3.16.4' 
    Building modules, stage 2. 
    MODPOST 1 modules 
WARNING: "STUB_issue_request" [/home/taylor/OPSYS_P2/linux-3.16.4/opsyscall/module/terminal.ko] undefined! 
WARNING: "issue_request" [/home/taylor/OPSYS_P2/linux-3.16.4/opsyscall/module/terminal.ko] undefined! 
WARNING: "STUB_stop_shuttle" [/home/taylor/OPSYS_P2/linux-3.16.4/opsyscall/module/terminal.ko] undefined! 
WARNING: "stop_shuttle" [/home/taylor/OPSYS_P2/linux-3.16.4/opsyscall/module/terminal.ko] undefined! 
WARNING: "STUB_start_shuttle" [/home/taylor/OPSYS_P2/linux-3.16.4/opsyscall/module/terminal.ko] undefined! 
WARNING: "start_shuttle" [/home/taylor/OPSYS_P2/linux-3.16.4/opsyscall/module/terminal.ko] undefined! 
make[1]: Leaving directory `/home/taylor/OPSYS_P2/linux-3.16.4' 
insmod: ERROR: could not insert module terminal.ko: Unknown symbol in module 

主模块代码:

#include <linux/module.h> 
#include <linux/proc_fs.h> 
#include <linux/seq_file.h> 
#include <linux/time.h> // Time Lib 

#include "./syscall.h" 

MODULE_LICENSE("GPL"); 

// Stubs for kernel module implementation of shuttle services 
extern int (* STUB_start_shuttle)(void); 
extern int (* STUB_stop_shuttle)(void); 
extern int (* STUB_issue_request)(char passenger_type, int initial_terminal, int destination_terminal); 

static int terminal_show(struct seq_file *m, void *v) { 

    seq_printf(m,"%s\n", "The Shuttle is out of service"); 

    return 0; 
} 

static int terminal_open(struct inode *inode, struct file *file) { 
    return single_open(file, terminal_show, NULL); 
} 

static const struct file_operations terminal_fops = { 
    .owner = THIS_MODULE, 
    .open = terminal_open, 
    .read = seq_read, 
    .release = single_release, 
}; 

/** 
* Terminal Init 
*  Sets up a proc file, sets syscall stubs correctly 
*/ 
static int __init terminal_init(void) { 
    proc_create("terminal", 0, NULL, &terminal_fops); 

    // Redirect stub syscalls to our implementation 
    STUB_start_shuttle = &start_shuttle; 
    STUB_stop_shuttle = &stop_shuttle; 
    STUB_issue_request = &issue_request; 
    return 0; 
} 

/** 
* Terminal Exit 
*  Removes the proc file, tears down stubs 
*/ 
static void __exit terminal_exit(void) { 
    STUB_start_shuttle = NULL; 
    STUB_stop_shuttle = NULL; 
    STUB_issue_request = NULL; 
    remove_proc_entry("terminal", NULL); 
} 

module_init(terminal_init); 
module_exit(terminal_exit); 

这里的syscall.h文件:

#pragma once 

#include <linux/err.h> 
#include <linux/kthread.h> 
#include <linux/list.h> 
#include <linux/sched.h> 
#include <linux/time.h> 

// Prototype Declarations 
int start_shuttle(void); 
int stop_shuttle(void); 
int issue_request(char passenger_type, int initial_terminal, int destination_terminal); 

这里的相应的c文件,syscall.c:

#include "syscalls.h" 
/** 
* Start Shuttle - Syscall 
* Description: Starts the shuttle up in its own thread unless it is already running 
*/ 
int start_shuttle(void) { 
    int result = 0; 
    return result; 
} 

/** 
* Stop Shuttle - Syscall 
* Description: Tells the shuttle to stop unless it is already stopping 
*/ 
int stop_shuttle(void) { 
    int result = 0; 
    return result; 
} 

/** 
* Issue Request - Syscall 
* Description: Adds a passenger, if valid, into a chosen terminal with a desired 
*    destination 
*/ 
int issue_request(char passenger_type, int initial_terminal, int destination_terminal) { 
    printk(KERN_DEBUG "Shuttle Service: Invalid issue_request - passenger_type %c initial_terminal %d destination_terminal %d\n", 
     passenger_type, initial_terminal, destination_terminal); 
    return 1; 
} 

任何和所有的帮助/建议将会很棒!

运行Ubuntu 14.04,内核版本3.16.4

回答

3

不能使用不能从模块导出的符号。使用EXPORT_SYMBOL。