OpenEuler
目录
实验一:操作系统简介
实验二:内存管理
实验三:进程管理
实验四:中断和异常管理
实验五:内核时间管理
实验六:设备管理
实验七:文件系统
实验八:网络管理
实验九:内核虚拟化
实验一:操作系统简介
配置yum更新源
cd /etc/yum.repos.d/
[base]
name=EulerOS-2.0SP8 base
baseurl=.8/os/aarch64/
enabled=1
gpgcheck=1
gpgkey=.8/os/RPM-GPG-KEY-EulerOS
[base]
name=openEuler20.03LTS
baseurl=.03-LTS/OS/aarch64/
enabled=1
gpgcheck=0
任务1:
yum makecache 更新yum源
备份
sz boot_origin.tgz 将备份文件发送到本地
旧版本
将系统盘备份
下载内核源码zip包
安装依赖的组件以及一些工具
yum install elfutils-libelf-devel
yum install ncurses-devel
yum install openssl-devel
yum install bc
yum install bison
yum install flex
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的内存,并打印指针地址
- 使用 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 分配的内存地址,位于内核空间。
任务二:使用vmalloc分别分配8KB、1MB、64MB的内存,打印指针地址
vmalloc()函数功能是在设备驱动程序或者内核模块中动态分配内存,且分配的内存是内核内存。
头文件:#include <linux/vmalloc.h>
分配内存以字节为单位,成功返回分配的虚拟地址;分配失败时,返回NULL。
vmalloc函数的工作方式类似于kmalloc,只不过前者分配的内存虚拟地址是连续的,而物理地址则无需连续。它通过分配非连续的物理内存块,再修改页表,把内存映射到逻辑地址空间的连续区域中。通过vmalloc获得的页必须一个一个地进行映射,效率不高,因此,只在不得已(一般是为了获得大块内存)时使用。
kmalloc能分配的大小有限,vmalloc能分配的大小相对较大,但是vmalloc比kmalloc速度要慢。
1.先编写vmalloc.c 以及对应的Makefile
2.进行编译 并查看编译后生成文件
3. 将模块加载进内核并查看
4.将模块卸载并查看
可以看出分配的是内核空间的内存。
任务三:
内存泄漏
内存泄漏指的是程序中己动态分配的内存未释放或无法释放,从而产生内存泄漏。
内存泄漏的危害:
1.可用的内存越来越少,堆积后的后果就导致内存溢出;
2.导致其他应用程序无法使用内存
3.应用程序访问内存时,不停地产生缺页错误;
4.使得CPU不停地从磁盘上的swap空间读取页面数据,导致应用程序性能下降,cpu无法进行其他工作。
如何防止内存泄漏
1.使用自动控制内存的语言,如JAVA
2.在使用手动控制内存的语言时一定要注意在分配了内存之后要free掉。
3.使用内存泄露检测器,在编写代码过程中对代码进行检测
内存溢出
内存溢出指的是程序在申请内存时,没有足够的内存空间供其使用。
内存溢出的危害:
1.程序无法运行,有时候会自动关闭软件;
2.易遭受缓冲区溢出攻击/黑客攻击。
如何防止内存溢出:
注意不要出现内存泄漏即可。
内存越界
内存越界指的是程序向系统申请一块内存后,使用时超出申请范围。
内存越界的危害:
导致内存越界错误,程序向内存块中写入数据,超过内存块的边界,写到了其他内存对象中,导致覆盖了其他内存对象中的数据。
防止内存越界:
1.使用安全的语言
2.使用安全的函数库
3.边界检测,防止越界的发生
实验三:进程管理
任务一:创建并运行内核线程
内核线程:
内核经常需要在后台执行一些操作,这种任务就可以通过内核线程(kernle thread)完成,内核线程是指独立运行在内核空间的标准进程。内核线程和普通的进程间的区别在于:内核线程没有独立的地址空间,mm指针被设置为NULL;它只在内核空间运行,从来不切换到用户空间去;并且和普通进程一样,可以被调度,也可以被抢占。
内核线程只能由其它的内核线程创建,Linux内核通过给出的函数接口与系统中的初始内核线程kthreadd交互,由kthreadd衍生出其它的内核线程。
1.首先编写kthread.c 以及相应的Makefile
2.编译并查看编译后的文件
3.加载模块并查看打印信息
4.卸载模块
OpenEuler
目录
实验一:操作系统简介
实验二:内存管理
实验三:进程管理
实验四:中断和异常管理
实验五:内核时间管理
实验六:设备管理
实验七:文件系统
实验八:网络管理
实验九:内核虚拟化
实验一:操作系统简介
配置yum更新源
cd /etc/yum.repos.d/
[base]
name=EulerOS-2.0SP8 base
baseurl=.8/os/aarch64/
enabled=1
gpgcheck=1
gpgkey=.8/os/RPM-GPG-KEY-EulerOS
[base]
name=openEuler20.03LTS
baseurl=.03-LTS/OS/aarch64/
enabled=1
gpgcheck=0
任务1:
yum makecache 更新yum源
备份
sz boot_origin.tgz 将备份文件发送到本地
旧版本
将系统盘备份
下载内核源码zip包
安装依赖的组件以及一些工具
yum install elfutils-libelf-devel
yum install ncurses-devel
yum install openssl-devel
yum install bc
yum install bison
yum install flex
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的内存,并打印指针地址
- 使用 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 分配的内存地址,位于内核空间。
任务二:使用vmalloc分别分配8KB、1MB、64MB的内存,打印指针地址
vmalloc()函数功能是在设备驱动程序或者内核模块中动态分配内存,且分配的内存是内核内存。
头文件:#include <linux/vmalloc.h>
分配内存以字节为单位,成功返回分配的虚拟地址;分配失败时,返回NULL。
vmalloc函数的工作方式类似于kmalloc,只不过前者分配的内存虚拟地址是连续的,而物理地址则无需连续。它通过分配非连续的物理内存块,再修改页表,把内存映射到逻辑地址空间的连续区域中。通过vmalloc获得的页必须一个一个地进行映射,效率不高,因此,只在不得已(一般是为了获得大块内存)时使用。
kmalloc能分配的大小有限,vmalloc能分配的大小相对较大,但是vmalloc比kmalloc速度要慢。
1.先编写vmalloc.c 以及对应的Makefile
2.进行编译 并查看编译后生成文件
3. 将模块加载进内核并查看
4.将模块卸载并查看
可以看出分配的是内核空间的内存。
任务三:
内存泄漏
内存泄漏指的是程序中己动态分配的内存未释放或无法释放,从而产生内存泄漏。
内存泄漏的危害:
1.可用的内存越来越少,堆积后的后果就导致内存溢出;
2.导致其他应用程序无法使用内存
3.应用程序访问内存时,不停地产生缺页错误;
4.使得CPU不停地从磁盘上的swap空间读取页面数据,导致应用程序性能下降,cpu无法进行其他工作。
如何防止内存泄漏
1.使用自动控制内存的语言,如JAVA
2.在使用手动控制内存的语言时一定要注意在分配了内存之后要free掉。
3.使用内存泄露检测器,在编写代码过程中对代码进行检测
内存溢出
内存溢出指的是程序在申请内存时,没有足够的内存空间供其使用。
内存溢出的危害:
1.程序无法运行,有时候会自动关闭软件;
2.易遭受缓冲区溢出攻击/黑客攻击。
如何防止内存溢出:
注意不要出现内存泄漏即可。
内存越界
内存越界指的是程序向系统申请一块内存后,使用时超出申请范围。
内存越界的危害:
导致内存越界错误,程序向内存块中写入数据,超过内存块的边界,写到了其他内存对象中,导致覆盖了其他内存对象中的数据。
防止内存越界:
1.使用安全的语言
2.使用安全的函数库
3.边界检测,防止越界的发生
实验三:进程管理
任务一:创建并运行内核线程
内核线程:
内核经常需要在后台执行一些操作,这种任务就可以通过内核线程(kernle thread)完成,内核线程是指独立运行在内核空间的标准进程。内核线程和普通的进程间的区别在于:内核线程没有独立的地址空间,mm指针被设置为NULL;它只在内核空间运行,从来不切换到用户空间去;并且和普通进程一样,可以被调度,也可以被抢占。
内核线程只能由其它的内核线程创建,Linux内核通过给出的函数接口与系统中的初始内核线程kthreadd交互,由kthreadd衍生出其它的内核线程。
1.首先编写kthread.c 以及相应的Makefile
2.编译并查看编译后的文件
3.加载模块并查看打印信息
4.卸载模块