又懂内核编译的大虾么?想深入请教几个问题。关于内核编译和内核模块生成的。 30
2016-01-22
展开全部
知识点:
1. 编译多个.c源文件的ko(单个文件编写网上有太多的教程,多个c源文件编译是这我这回遇到的)
2. 编写带参数的内核模块(这个顺便也给记下,虽然貌似没有用到)
3. insmod,rmmod,mknod,modprobe,dmesg等命令使用(dmesg比较有用,有些人不知道用这个命令,就说要用串口显示信息,其实dmesg命令更方便,-c选项清空信息)
4. 无法插入内核的原因。(这个也是关键,很多时候操作起来比较简单,比如编译内核源码,但可能会碰到一系列错误,解决一堆错误最能提升一个人的能力)
一、编译多个.c文件的ko模块并插入内核
//test_module.c
#include <linux/init.h>
#include <linux/module.h>
#include "extern_app.h"
static char *who = "linux ss";
static int many = 1;
module_param(many, int, S_IRUGO);
module_param(who, charp, S_IRUGO);
static int __init hello_init(void)
{
test();
static int i = 0;
for(i = 0; i < many; i++)
printk(KERN_ALERT "Hello, %s!\n", who);
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT "Goodbye\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
//extern_app.c
#include <linux/init.h>
#include <linux/module.h>
int test(void)
{
printk("test here.\n");
return 0;
}
//extern_app.h
#ifndef __EXTERN_APP_H
#define __EXTERN_APP_H
extern int test(void);
#endif
//Makefile
#ifneq ($(KERNELRELEASE),)
obj-m := my_module.o
my_module-objs := test_module.o extern_app.o
#else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
1. 编译多个.c源文件的ko(单个文件编写网上有太多的教程,多个c源文件编译是这我这回遇到的)
2. 编写带参数的内核模块(这个顺便也给记下,虽然貌似没有用到)
3. insmod,rmmod,mknod,modprobe,dmesg等命令使用(dmesg比较有用,有些人不知道用这个命令,就说要用串口显示信息,其实dmesg命令更方便,-c选项清空信息)
4. 无法插入内核的原因。(这个也是关键,很多时候操作起来比较简单,比如编译内核源码,但可能会碰到一系列错误,解决一堆错误最能提升一个人的能力)
一、编译多个.c文件的ko模块并插入内核
//test_module.c
#include <linux/init.h>
#include <linux/module.h>
#include "extern_app.h"
static char *who = "linux ss";
static int many = 1;
module_param(many, int, S_IRUGO);
module_param(who, charp, S_IRUGO);
static int __init hello_init(void)
{
test();
static int i = 0;
for(i = 0; i < many; i++)
printk(KERN_ALERT "Hello, %s!\n", who);
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT "Goodbye\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
//extern_app.c
#include <linux/init.h>
#include <linux/module.h>
int test(void)
{
printk("test here.\n");
return 0;
}
//extern_app.h
#ifndef __EXTERN_APP_H
#define __EXTERN_APP_H
extern int test(void);
#endif
//Makefile
#ifneq ($(KERNELRELEASE),)
obj-m := my_module.o
my_module-objs := test_module.o extern_app.o
#else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询