实验2:Linux内核重建及内核模块 主讲教师:夏莹杰 xiayingjie@zju.edu.cn.

Slides:



Advertisements
Similar presentations
高级服务器设计和实现 1 —— 基础与进阶 余锋
Advertisements

实用操作系统概念 张惠娟 副教授 1.
第六章 Linux内核移植.
Linux内核与模块 –RHEL6.3内核模块信息
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
Linux Further.
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
Hadoop I/O By ShiChaojie.
SVN的基本概念 柳峰
褚霸 核心系统数据库组 /11/15 Oprofile 系统层面的性能微调工具 褚霸 核心系统数据库组 /11/15.
第二讲 搭建Java Web开发环境 主讲人:孙娜
学习前的准备工作 讲师:burning.
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
存储系统.
SVN服务器的搭建(Windows) 柳峰
第11章:一些著名开源软件介绍 第12章:服务安装和配置 本章教学目标: 了解当前一些应用最广泛的开源软件项目 搭建一个网站服务器
DM81X 视频采集处理 ——简单采集显示例程讲解 广州创龙电子科技有限公司
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
Windows网络操作系统管理 ——Windows Server 2008 R2.
Windows网络操作系统管理 ——Windows Server 2008 R2.
第8章 构建嵌入式Linux系统.
linux驱动模块编程 HelloWorld 广州创龙电子科技有限公司
按键驱动 广州创龙电子科技有限公司 Guangzhou Tronlong Electronic Technology Co., Ltd.
第17章 网站发布.
2014 操作系统课程设计 Operating System Practicum
《手把手教你学STM32》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司 淘宝店铺:
ENS 10.1安装配置指南 王俊涛 | SE.
Linux核心編譯與模組管理 2013/01/19.
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
Windows 7 的系统设置.
YMSM D-PACK 安装手册 作成者:D-PACK维护组(YMSLx) 作成日:
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab3.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
Gzip编译及调试 曹益华
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
SOA – Experiment 2: Query Classification Web Service
第二章 登录UNIX操作系统.
内容摘要 ■ 课程概述 ■ 教学安排 ■ 什么是操作系统? ■ 为什么学习操作系统? ■ 如何学习操作系统? ■ 操作系统实例
C语言程序设计 主讲教师:陆幼利.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
Web安全基础教程
2018 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab3.
本节内容 随机读取 视频提供:昆山爱达人信息技术有限公司.
第四章 团队音乐会序幕: 团队协作平台的快速创建
Drupal Dev 我想知道:什么时候、什么变化.
实验一 体验Nachos下的并发程序设计 陈毅东 2006年春.
欢迎返校! 2016 返校之夜.
本节内容 Win32 API中的宽字符 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
《手把手教你学STM32》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司 淘宝店铺:
JSP实用教程 清华大学出版社 第2章 JSP运行环境和开发环境 教学目标 教学重点 教学过程 2019年5月7日.
iSIGHT 基本培训 使用 Excel的栅栏问题
《手把手教你学STM32-STemWin》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
LOGIX500软件入门 西安华光信息技术有限公司 2008年7月11日.
本节内容 文件系统 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
临界区问题的硬件指令解决方案 (Synchronization Hardware)
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
本节内容 如何调试驱动程序? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第四章 UNIX文件系统.
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
实验六、COM类型病毒分析实验 实验开发教师: 刘乃琦 谌黔燕.
《手把手教你学STM32-STemWin》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
Primary introduction to docker
Presentation transcript:

实验2:Linux内核重建及内核模块 主讲教师:夏莹杰 xiayingjie@zju.edu.cn

重点内容 Linux内核重建 Linux内核模块 查找并且下载一份内核源代码 配置内核 编译内核和模块 配置启动文件 什么是内核模块 内核模块的特点 一个内核模块实例 创建内核模块需要makefile

Linux内核重建

实验环境 Linux操作系统发行版本为ubuntu16.04.1 LTS Linux内核版本为4.6 编译成功后,配置GNU的启动引导工具为grub2

查找并下载一份内核源代码 Linux受GNU通用公共许可证(GPL)保护,内核源代码是完全开发的。官方网站为: http://www.kernel.org,考虑到网络下载速度,可以从阿里镜像站:http://mirrors.aliyun.com/linux-kernel/就近下载 首先通过命令 uname –r 确认你的Linux运行环境采用哪个版本的内核源代码,ubuntu16.04.1 LTS采用的是4.4.0.31-generic版本 这次内核重建实验,我们试下较新的版本即Linux4.6 必须下载到工作目录的文件: linux-4.6.tar.xz patch-4.6.xz

部署内核源代码 此过程比较机械、枯燥,因而容易出错,请严格按照指导手册的步骤来操作。

配置内核 配置是精确控制新内核功能的机会,配置过程也控制哪些需编译到内核的二进制映像中(在启动时被载入),哪些是需要时才装入的内核模块(module) 进行配置时,大部分选项可以使用其缺省值,只有少部分需要根据用户不同的需要选择,例如硬盘分区采用ext2文件系统,则配置项应支持 ext2文件系统等 对每一个配置项,用户有三种选择 “<*>”或“[*]” 将该功能编译进内核 “[]” 不将该功能编译进内核 “[M]” 将该功能编译成可以在需要时动态插入到内核中的模块

编译内核和模块 编译内核就用:make bzImage -jN 这里N是主机 CPU的核数乘以2 执行到这一步可能会出现错误:fatal error:openssl/opensslv.h:No such file or directory,这是因为没有安装openssl,安装openssl:apt-get install libssl-dev 也可能会出现 bc:not found,相应的需要安装bc:apt-get install bc 编译内核及内核模块需较长时间,具体与机器的硬件条件及内核的配置因素有关。

安装内核 安装操作不可逆,一旦操作中出现哪怕些许的失误,将导致Linux系统无法正常初始化,一切努力付之东流!慎重!慎重! 安装内核过程就比较快,先安装模块: make modules_install 安装内核: make install

应用grub配置启动文件 grub就是管理ubuntu系统启动的一个程序。想运行刚刚编译好的内核,就需要修改相应的grub。 mkinitramfs 4.6.0 –o /boot/initrd.img-4.6.0 update-grub2 这个命令会自动修改grub 这样,我们已经编译了内核bzImage(vmlinuz-4.6.0),放到了指定位置/boot;initrd.img-4.6.0、System.map-4.6.0等辅助资源,同样放到了/boot,我们也配置了grub,现在重启主机系统,期待编译过的Linux操作系统内核正常运行。

Linux内核模块

重点内容 Linux内核模块 什么是内核模块 内核模块的特点 一个内核模块实例 创建内核模块需要makefile

monolithic kernel vs micro kernel Linux操作系统的内核是单一体系结构(monolithic kernel)的。与monolithic kernel相对的,是微内核体系结构(micro kernel) micro kernel操作系统的核心部分是一个很小的内核,实现一些最基本的服务,如创建和删除进程、内存管理、中断管理等等。而文件系统、网络协议等其它部分都在微内核外的用户空间里运行。 micro kernel操作系统具有很好的可扩展性而且内核非常的小,但这样的操作系统由于不同层次之间的消息传递要花费一定的代价所以效率比较低。 monolithic kernel操作系统,所有的模块都集成在一起,系统的速度和性能都很好,但是可扩展性和维护性就相对比较差。

鱼与熊掌能否兼得 ? 内核模块(Loadable Kernel Module)或 LKM,是在内核空间运行的程序。 内核模块视同其它静态连接的内核函数,只不过它是“动态”连接的。 与运行在微内核体系操作系统的外部用户空间的服务进程不同,内核模块在内核态代表当前进程执行。

内核模块的优点 比monolithic kernel更加紧凑和灵活。 修改内核模块时,只要编译该模块生成目标代码(.ko) ,然后将.ko插入内核即可。不必全部重新编译整个内核,可节省不少时间,避免人工操作的错误。 模块的目标代码一旦被链接到内核,它的作用和通过静态连接的内核代码完全等价。 所以,当调用模块的函数时,无须显式地消息传递。

内核模块的缺点 由于内核所占用的内存不会被换出,所以连接进内核的模块会给整个系统带来性能、安全、内存利用方面的损失。 装入内核的模块就成为内核的一部分,可以修改内核中的其他部分,因此,模块的使用不当会导致系统崩溃。 为了让内核模块能访问所有内核资源,内核必须维护符号表,并在装入和卸载模块时修改符号表。 模块会要求利用其它模块的功能,所以,内核要维护模块之间的依赖性。

编写一个简单的内核模块helloworld.ko #include <linux/module.h> /* Needed by all modules */ #include <linux/kernel.h> /* Needed for KERN_INFO */ int init_module(void) { printk(KERN_INFO “Hello World!\n”); /* 试试printf(), 验证ko不在用户态 */ return 0; } void cleanup_module(void) { printk(KERN_INFO “Goodbye!\n”); MODULE_LICENSE(“GPL”);

内核模块必备要素 任何模块程序的编写都需要包含linux/module.h这个头文件。文件包含了对模块的结构定义以及模块的版本控制。 函数init_module()和函数cleanup_module( )是模块编程中最基本的也是必须的两个函数: init_module()向内核注册模块所提供的新功能 cleanup_module()负责注销所有由模块注册的功能 printk()函数不是printf() printk()函数由Linux内核定义,功能与printf相似。 字符串KERN_INFO表示消息的优先级, syslogd针对不同优先级的消息进行不同的处理。

内核模块的加载 系统调用 modprobe程序 insmod [path]modulename.ko 从命令行中读入模块,通常是扩展名为“.ko”,elf格式的目标文件 确定模块对象代码所在文件的位置。通常这个文件在lib/modules的某个子目录中。 计算存放模块代码、模块名和数据结构module所需要的内存大小。 在用户空间中分配一个内存区,把module结构、模块名以及为正在运行的内核重定位的模块代码拷贝到这个内存里。其中,module结构中的init域指向这个模块的入口函数重新分配到的地址;exit域指向出口函数所重新分配的地址。 调用init_module(),向它传递上面所创建的用户态的内存区的地址。 释放用户态内存, 整个过程结束。

内核模块的卸载 rmmod [path]modulename

内核模块实用程序modutils insmod加载内核模块 rmmod卸载内核模块 ksyms显示内核符号和模块符号表的信息,可以读取/proc/kallsyms文件。 lsmod显示当前系统中正在使用的模块信息。 实际上这个程序的功能就是读取/proc文件系统中的文件/proc/modules中的信息。 modprobe连接(与insmod类似)在命令行中指定的一个模块,但它还可以(与insmod不同)递归地连接指定模块所引用到的其他模块。

内核模块的make文件 TARGET = helloworld KDIR = /usr/src/linux PWD = $(shell pwd) obj-m += $(TARGET).o default: make -C $(KDIR) M=$(PWD) modules KDIR目录中包含了内核驱动模块所需要的各种头文件及依赖。 KDIR的内核源码版本,必须与runtime系统一致

内核模块的make文件 $(KDIR)表示源代码最高层目录的位置。 “obj-m += $(TARGET).o”告诉kbuild,希望将$(TARGET),也就是helloworld,编译成内核模块。 “M=$(PWD)”表示生成的模块文件都将在当前目录下。

多文件内核模块的make文件 TARGET = helloworld KDIR = /usr/src/linux PWD = $(shell pwd) obj-m += $(TARGET).o $(TARGET)-y := start.o stop.o default: make -C $(KDIR) M=$(PWD) modules

start.c #include <linux/kernel.h> /*我们在做内核的工作 */ #include <linux/module.h> /*初始化模块 */ int init_module() { printk("Hello, world!\n"); /* 如果我们返回一个非零值, 那就意味着 * init_module 初始化失败并且内核模块 * 不能加载 */ return 0; }

stop.c #include <linux/kernel.h> /*我们在做内核的工作 */ #define __NO_VERSION__ #include <linux/module.h> #include <linux/version.h> /* 不被module.h包括,因为__NO_VERSION__ */ /* Cleanup - 撤消 init_module 所做的任何事情*/ void cleanup_module() { printk("Bye!\n"); }

实验资料 下载地址:https://person.zju.edu.cn/xiayingjie 教学与课程 实验2:Linux内核重建和内核模块 实验指导材料1&实验指导材料2 完成时间:10月6日——10月27日 完成要求: 针对两个实验指导材料中的研究内容,按照实验报告模板格式撰写实验报告

Q & A