实验一:
配置yum更新源
cd /etc/yum.repos.d/
[base]
name=EulerOS-2.0SP8 base
baseurl=http://mirrors.huaweicloud.com/euler/2.8/os/aarch64/
enabled=1
gpgcheck=1
gpgkey=http://mirrors.huaweicloud.com/euler/2.8/os/RPM-GPG-KEY-EulerOS
[base]
name=openEuler20.03LTS
baseurl=https://repo.openeuler.org/openEuler-20.03-LTS/OS/aarch64/
enabled=1
gpgcheck=0
任务1:
yum makecache 更新yum源
备份
sz boot_origin.tgz 将备份文件发送到本地
旧版本
将系统盘备份
下载内核源码zip包
登录 - Gitee.com
安装依赖的组件
yum install elfutils-libelf-devel
yum install openssl-devel
yum install bc
yum install ncurses-devel
开始编译
编译成功
make modules_install安装模块,大概两分钟。
make install 安装内核
……
任务2:
内核模块编程
Linux 提供了一种动态加载内核的机制,这种机制称为模块(Module)。
内核模块是具有独立功能的程序。
它可以被单独编译,但是不能单独运行,它的运行必须被链接到内核作为内核的一部分在内核空间中运行。
模块具有一下特点:
1) 模块本身不被编译入内核映像,从而控制了内核的大小;
2) 模块一旦被加载,它就和内核中的其它部分完全一样。
编写hello.c程序和相应的Makefile
Makefile如下
make
查看编译后的文件目录结构
加载模块 sudo insmod hello.ko
使用命令 lsmod 查看模块是否被加载 如下:
查看加载内容 sudo dmesg | tail -n 2 (可以看到打印的信息)
卸载hello模块 rmmod hello
查看卸载内容 dmesg | tail -n 1
实验二:
任务一:
- 使用 kmalloc 分配 1KB,8KB的内存,打印指针地址;
- 查看已分配的内存,根据机器是32位或64位的情况,分析地址落在的区域。
kmalloc()函数:
在设备驱动程序或者内核模块中动态分配内存
分配成功时,返回分配的虚拟地址;分配失败时,返回NULL。
1.创建一个kmalloc-module目录
编写kmalloc.c 与 Makefile
编译 make
加载模块 insmod kmalloc.ko
使用命令 lsmod 查看模块加载内容 如下:
卸载模块 查看日志
查看系统配置页面的大小 4KB
kmallocmem1 addr = ffff97a3c51dc000
kmallocmem2 addr = ffff97a3d65ae000
用户内存空间地址是从0000000000000000起始到00ffffffffffffff结束,其余内存地址均属于内核内存空间,kmalloc 分配的内存地址,位于内核空间。



