1 / 27
文档名称:

Linux内核之旅.doc

格式:doc   大小:355KB   页数:27页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

Linux内核之旅.doc

上传人:fy3986758 2019/5/18 文件大小:355 KB

下载得到文件列表

Linux内核之旅.doc

相关文档

文档介绍

文档介绍:一、什么是模块模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的。模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或其他内核上层的功能。二、编写一个简单的模块模块和内核都在内核空间运行,模块编程在一定意义上说就是内核编程。因为内核版本的每次变化,其中的某些函数名也会相应地发生变化,因此模块编程与内核版本密切相关。//#include<linux/>005#include<linux/>006#include<linux/>/*必要的头文件*/009staticint__initlkp_init(void){printk(“<1>Hello,World!fromthekernelspace…\n”);return0;013}015staticvoid__exitlkp_cleanup(void){printk(“<1>Goodbye,World!leavingkernelspace…\n”);018}020module_init(lkp_init);021module_exit(lkp_cleanup);022MODULE_LICENSE(“GPL”);.说明第4行:,此文件必须包含进来。第5行:。第6行:,它们允许释放内核占用的内存。建议浏览一下该文件中的代码和注释。第9-12行:这是模块的初始化函数,它必需包含诸如要编译的代码、初始化数据结构等内容。第11行使用了printk()函数,该函数是由内核定义的,功能与C库中的printf()类似,它把要打印的信息输出到终端或系统日志。字符串中的<1>是输出的级别,表示立即在终端输出。第15-18行:这是模块的退出和清理函数。此处可以做所有终止该驱动程序时相关的清理工作。第20行:这是驱动程序初始化的入口点。对于内置模块,内核在引导时调用该入口点;对于可加载模块则在该模块插入内核时才调用。第21行:对于可加载模块,内核在此处调用module_cleanup()函数,而对于内置的模块,它什么都不做。第22行:提示可能没有GNU公共许可证。()。函数module_init()和cleanup_exit()是模块编程中最基本也是必须的两个函数。module_init()向内核注册模块所提供的新功能,而cleanup_exit()注销由模块提供的所有功能。模块编程属于内核编程,因此,除了对内核相关知识有所了解外,还需要了解与模块相关的知识。,表一给出应用程序与内核模块程序的比较。表一应用程序与内核模块程序的比较 C语言应用程序内核模块程序使用函数Libc库内核函数运行空间用户空间内核空间运行权限普通用户超级用户入口函数main()module_init()出口函数exit()module_exit()–insmod运行直接运行insmod调试Gdbkdbug,kdb,kgdb等从表一我们可以看出,内核模块程序不能调用libc库中的函数,它运行在内核空间,且只有超级用户可以对其运行。另外,模块程序必须通过module_init()和module-exit()函数来告诉内核“我来了”和“我走了”。(如果对以下第2~4点理解上有困难,可以越过)如前所述,Linux内核是一个整体结构,像一个圆球,而模块是插入到内核中的插件。尽管内核不是一个可安装模块,但为了方便起见,Linux把内核也看作一个“母”模块。那么模块与模块之间如何进行交互呢,一种常用的方法就是共享变量和函数。但并不是模块中的每个变量和函数都能被共享,内核只把各个模块中主要的变量和函数放在一个特定的区段,这些变量和函数就统称为符号。到低哪些符号可以被共享?Linux内核有自己的规定。对于内核这个特殊的母模块,在kernel/“移出”的符号,例如进程管理子系统可以“移出”的符号定义如下:/*进程管理*/EXPORT_SYMBOL(do_mmap_pgoff);EXPORT_SYMBOL(do_munmap);EXPORT_SYMBOL(do_brk);EXPORT_SYMBOL(exit_mm);…EXPORT_SYMBOL(schedule);EXPORT_SYMBOL(jiffi