OpenEuler

目录

 

实验一:操作系统简介

实验二:内存管理

实验三:进程管理

实验四:中断和异常管理

实验五:内核时间管理

实验六:设备管理

实验七:文件系统

实验八:网络管理

实验九:内核虚拟化


实验一:操作系统简介

配置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包

安装依赖的组件以及一些工具

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的内存,并打印指针地址

  1. 使用 kmalloc 分配 1KB,8KB的内存,打印指针地址;
  2. 查看已分配的内存,根据机器是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.卸载模块

可以看到卸载模块后杀死了改内核进程

任务二:打印输出当前系统 CPU 负载情况

proc文件简介

proc 文件系统是 Linux 中的特殊文件系统,提供给用户一个可以了解内核内部工作过程的可读窗口,在运行时访问内核内部数据结构、改变内核设置的机制。

proc文件系统能够保存系统当前工作的特殊数据,但并不存在于任何物理设备中,对其进行读写时,才根据系统中的相关信息即时生成。所有proc文件挂载在/proc目录下。

/proc 的文件可以用于访问有关内核的状态、计算机的属性、正在运行的进程的状态等信息。大部分 /proc 中的文件和目录提供系统物理环境最新的信息。它们实际上并不存在磁盘上,也不占用任何空间。(用ls –l 可以显示它们的大小)当查看这些文件时,实际上是在访问存在内存中的信息,这些信息用于访问系统。

尽管 /proc 中的文件是虚拟的,但它们仍可以使用任何文件编辑器或像 'more'、'less' 或 'cat' 这样的程序来查看。

1.编写cpu_loadavg.c 以及相应的Makefile文件 该程序用来查看

2. make 并查看编译后产生的文件

3.加载内核模块并查看模块打印信息

  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值