免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1190 | 回复: 4
打印 上一主题 下一主题

[内核模块] 程序由用户态改写成内核态遇到的问题,求帮助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-02-19 10:55 |只看该作者 |倒序浏览
这是一个gcm的加密测试程序,想要把它打包成内核模块加载到内核中,首先我把代码中该修改的地方都修改了,比如printk还有头文件之类的,然后修改makefile文件出现了问题。
原来的makefile是这样的
INCLUDE_DIRS := ../include ..

INCLUDES := $(foreach i,$(INCLUDE_DIRS),-I $i)

CC  := gcc
CXXFLAGS := -g -D LINUX $(INCLUDES)
LDFLAGS += -g

lib_objs := \
aes128_cbc_dec_by4_sse.o \
……这里是一些在上级的include目录下的文件,略去了……
gcm_avx_gen2.o \
gcm_avx_gen4.o

OBJ := $(foreach i,$(lib_objs),../obj/$(i))

gcm: main.o $(OBJ)
$(CC) $(LDFLAGS) -o $@ main.o $(OBJ)

main.o: main.c do_test.h
$(CC) $(CXXFLAGS) -c $< -o $@


clean:
rm -f *.o *.cmd *.ko *.mod.c

执行make命令,首先生成main.o,然后将上级目录下的include中的文件( OBJ 所代表的) 和main.o一块作为依赖,生成gcm可执行程序。。。
——————————————————————————————————————————
下面是我修改后的makefile
INCLUDE_DIRS := ../include ..
INCLUDES := $(foreach i,$(INCLUDE_DIRS),-I $i)

lib_objs := \
aes128_cbc_dec_by4_sse.o \
……这里是一些在上级的include目录下的文件,略去了……
gcm_avx_gen2.o \
gcm_avx_gen4.o

OBJ := $(foreach i,$(lib_objs),../obj/$(i))
obj-m += gcm.o
gcm-objs:= main.o do_test.h $(OBJ)

main.o: main.c do_test.h
$(CC) $(CXXFLAGS) -c $< -o $@


KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
rm -rf Module.* modules.*

.PHONY: default clean
问题出现了,如果去掉上面makefile中的
main.o: main.c do_test.h
$(CC) $(CXXFLAGS) -c $< -o $@
这两句,那么就不会生成main.o,出现各种错误。
我们知道内核模块编写执行make后首先应该进入系统的内核目录,可是如果不去掉这两句,系统就会先执行这两句,不会进入系统内核目录下,出现各种错误。而且这两句放到前面也是一样的。。。
——————————————————————————————————————————————
不知道有没有说清楚问题。总结起来就是:我们在内核模块编写的时候,makefile中一般都有
obj-m := my_module.o
my_module-objs := extern_app.o test_module.o
这样的部分,可是如果上面的依赖extern_app.o或者test_module.o不能直接生成,而是需要你去写响应的语句才行,那么该怎么办?
希望有朋友帮忙解惑

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
2 [报告]
发表于 2014-02-19 14:47 |只看该作者
回复 1# kingseng824
不知道有没有说清楚问题。总结起来就是:我们在内核模块编写的时候,makefile中一般都有
obj-m := my_module.o
my_module-objs := extern_app.o test_module.o
这样的部分,可是如果上面的依赖extern_app.o或者test_module.o不能直接生成,而是需要你去写响应的语句才行,那么该怎么办?
希望有朋友帮忙解惑


比如hello.ko模块,这个模块依赖文件a.o, b.o, c.o,而这三个对于的源文件为a.c,b.c,c.c
一般这样写:

obj-m:=hello.o
hello-y:=a.o b.o c.o

KERNELBUILD:=/usr/src/linux/
default:
          make -C ${KERNELBUILD} M=${shell pwd) modules
clean:
           rm -rf *.o *.ko Module*

论坛徽章:
0
3 [报告]
发表于 2014-02-19 17:46 |只看该作者
瀚海书香 发表于 2014-02-19 14:47
回复 1# kingseng824

这个我是明白的,但是如果a.o依赖于a.c生成,但是也需要依赖于许多规则怎么办?也就是说makefile不能由a.c直接生成a.o

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
4 [报告]
发表于 2014-02-19 18:58 |只看该作者
回复 3# kingseng824
这个还真没遇到过。
不过话说回来,内核态下不可能依赖其他的库,所以你肯定可以转换成a.o完全有a.c生成的格式

   

论坛徽章:
0
5 [报告]
发表于 2014-02-21 11:03 |只看该作者
回复 1# kingseng824

原則上kernel是不需要用到像 libc這麼龐大的library
kernel基本上所用到的lib都在根目錄底下的lib
如果你想要加入其它的lib就放到那邊即可


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP