linux内存管理子系统 笔记
深入理解linux内核笔记1

郑重声明:未经本人允许,不得用于商业或非商业的转载和使用,如有需要请联系:yrj1978@hotmail.com引子为什么要写这个笔记:1,这本书的中文版翻译了太垃圾,没法阅读。
阅读英文原版,可以很好的理解作者的思路。
作此笔记备忘2,一直以来学习LINUXkernel的知识缺乏系统化,借对这本书的学习,系统化的学习一下LINUXkernel。
3,自己一直在做一个toosmall,toosimple的单进程,特权模式,64bit保护模式的称不上OS的OS,已经做完了bootloader,构思kernel的实现的时候,困惑在内存管理的实现上,阅读这本书,希望能有利于自己的OS的编写。
4,克服惰性,多读书,希望一天能阅读5页,争取半年内阅读完这本原版700多页的巨著。
不足:我不可能完全理解LINUX内存管理的精髓,肯定有很多地方理解错误。
希望大家能够指正,以便提高,谢谢。
学习方法:可能您第一次阅读的时候很多地方都不理解,不用担心。
那您可能需要阅读一些文件系统的知识。
或者阅读全部笔记后,再回头阅读,有些地方您就理解了。
言归正传:一、概要可用工具CodeViz:生成代码调用关系图的工具,这个工具我现在还没有去使用,有兴趣的可以自己试试去建立调用关系图。
http://www.csn.ul.ie/ ̄mel/projects/codeviz/Linuxcrossreference(LXR):以web的方式阅读和查找LINUX内核源代码的工具。
这个工具安装相当麻烦,我建议直接到它的官方网站直接读代码。
http://lxr.linux.no/linux+v2.6.24/模块LINUX内存管理代码模块主要分为4个部分:1.Outofmemory代码在mm/oom_kill.c貌似用于杀进程的时候对内存的操作2.虚拟内存的分配代码在mm/vmalloc.c3.物理内存页面分配代码在mm/page_alloc.cVMA(virtualmemoryaddresses)的创建和进程内的内存区域的管理4.这些模块,贯穿与其他kernel代码之中,形成更复杂的系统模块,如页面替换策略,buffer的输入输出等中间插段广告Linux文化T恤,淘宝销售,有兴趣的可以购买。
linux笔记全(无图版)

linux笔记全(⽆图版)1、ls 查看当前⽬录下的所有内容⿊⾊的是⽂件,蓝⾊的是⽂件夹,也就是⽬录2、rm -f anaconda-ks. cfg 彻底删除⽂件(如不确定,则需要先保存备份,也就是快照)3、ifconfig 查看⽹卡的配置信息(ip地址等)4、ifconfig ens33 192.168.18. 201 /24(⽹络地址/⼦⽹掩码)更改ip地址5、systemctl restart network 重启⽹络服务6、桥接模式,直接可以进⾏通信(同⼀⽹段,配置ip)7、能不能通信的2个条件:在同⼀个物理⽹络内,ip地址也在同⼀⽹段内8、仅主机模式,虚拟机和物理机不能进⾏通信,相当于虚拟机和物理机进⾏了隔离与笔记本(真机)通信截图9、NAT模式,⾃动分配⽹络地址和⽹关,以及dns,可以直接上⽹可以访问互联⽹内的主机,但互联⽹内的主机不能访问本机(max特点)10、route -n 查看⽹关11、cat /etc/resolv. conf 查看dns(注意cat后⾯有⼀个空格,空格不可少)12、验证nat模式可以直接上⽹13、shell:通常指linux的字符界⾯,图形界⾯和字符界⾯都属于shell,但图形界⾯的shell常称为gui,字符界⾯的shell常称为cli14、cat /etc/shells 查看⽂件内容(linux⾥⾯提供的所有的shell)15、linux默认使⽤的shell是bash的shell16、echo $SHELL 查看当前使⽤的shell17、shell默认指的是bash,它的应⽤是最⼴泛的18、linux是彻底的多⽤户多任务,它可以直接多个⽤户同时进⾏操作19、ctrl+alt+f2-f6 对应5个shell ctrl+alt+f1 开始图形界⾯shell 作⽤:如何开始shell(也就是如何打开命令界⾯)20、虚拟终端的缩写为tty, 在字符界⾯下执⾏“tty"命令就可以显⽰⽤户⽬前所在的终端编号(终端名称)。
linux操作系统课程学习笔记,我的Linux学习笔记·Linux操作系统基础

linux操作系统课程学习笔记,我的Linux学习笔记·Linux操作系统基础今天的笔记主要是关于Linux操作系统根底的相关学问。
那就从我⾯前的电脑开端讲起。
计算机和操作系统计算机主要包括五个部分:运算器,控制器,存储器,输⼊设备和输出设备。
通常,运算器,控制器再加上其他⼀些部件如寄存器等构成了我们通常所说的CPU(central processing unit),存储器则主要是内存。
运算器,控制器和存储器可以实现数据的处理.但是数据从何⽽来,运算之后的结果去往哪⾥?这就需要输⼊设备和输出设备(I/O设备)。
我们通常⽤到的输⼊设备包括键盘⿏标等,输出设备为屏幕,打印机等。
值得⼀提的是,计算机中有个叫做硬盘的东西,它并不是存储器,⽽是⼀个I/O设备。
在将数据读取到内存时,它是⼀个输⼊设备;⽽将结果保存到磁盘时,它就变成了⼀个输出设备。
这么多设备整合在⼀起,就成了⼀台计算机。
它可以接收我们的指令(键盘⿏标),通过运算(CPU),把结果展⽰给我们(屏幕,硬盘等)。
但是这么多硬件是如何协调作⽤,共同完成⼀个任务⽽不会我⾏我素地乱来呢?我们需要⼀个东西,它可以控制硬件有序地⼯作,各⾃执⾏⾃⼰的任务,这个东西就是操作系统(Operating System)。
操作系统是⼀个特殊的软件,它的任务就是硬件管理—控制CPU的运算,控制内存的分配,控制计算机的⼏乎⼀切。
假如⼀台电脑没有操作系统,它可能只是⼀个艺术品,或者⼀堆废铁。
⼀个完整的操作系统包括内核和⼀些辅助软件。
内核的主要任务就是进⾏硬件管理,它是⼀个操作系统最基础最底层的东西。
内核若想很好地控制硬件并使其发挥相应的功能,需要和硬件相识相知相爱,他俩可以成为完美的⼀对,全都仰仗于驱动的帮忙。
驱动是硬件的灵魂,它向操作系统提供了访问和使⽤硬件的接⼝,以便在某项任务中最⾼效地调⽤硬件。
什么是LinuxLinux就是⼀个操作系统,它可以管理整个计算机硬件,并且可以接收我们的指令,来指挥硬件完成相应的任务,并把结果反馈给我们。
鸟哥的linux私房菜(基础篇)学习笔记

鸟哥的linux私房菜(基础篇)学习笔记鸟哥的linux私房菜(基础篇)是一本非常好的Linux入门教材,它全面介绍了Linux 的基础知识,包括Linux的安装、文件系统、用户管理、进程管理、磁盘管理、文件编辑器、Shell编程以及Linux网络等方面。
本文将简单介绍一些我学习这本书时的笔记和心得,以期为Linux新手提供一些帮助。
1. 操作系统和内核操作系统是由内核和外壳组成的,内核是操作系统最基础的组成部分,它负责处理硬件和软件的交互,包括驱动程序、内存管理、进程管理和文件系统等。
而外壳则是用户和操作系统进行交互的界面,我们可以通过命令行或者图形化界面与系统进行交互。
2.文件系统在Linux系统中,所有资料都以文件的形式保存在文件系统中,文件系统采用树形结构。
在Linux中,根目录是"/",其他目录都是在根目录下面的子目录。
我们可以使用ls 命令来查看文件目录和文件,也可以使用cd命令来进入和退出目录,另外,文件名是区分大小写的。
3.用户管理在Linux中,每个用户都有自己的ID号、用户名和密码。
通过用户管理,我们可以添加、删除或修改用户,另外,我们可以通过权限控制来限制普通用户访问系统的某些文件或命令,使系统更安全。
4.进程管理在Linux中,每个程序都是一个进程,我们可以使用ps命令查看系统中运行的进程,也可以使用kill命令来终止特定的进程。
另外,我们可以使用top命令来查看系统中当前占用CPU资源最多的进程,以便优化系统性能。
5.磁盘管理Linux系统中的磁盘分为硬盘和分区,我们可以使用fdisk命令来分区,也可以使用mkfs命令来格式化分区,以便在系统中进行挂载。
另外,我们可以使用df命令来查看文件系统的使用情况,以便合理管理磁盘空间。
6.文件编辑器在Linux中,有很多种文件编辑器,如vi、vim、nano等。
其中,vi是最常用的编辑器,而vim是vi的增强版,它提供了更多的功能和快捷键。
实验九Linux内存

内核空间(所有进 程及内核共享)
永久内存映射区(4M)
动态内存映射区 (min 120M)
非连续区 vmalloc()
用户空间(对系统 其他进程不可见)
直接内存映射区 (max 896M)
0x00000000
0xC0000000
连续区 kmalloc()
3
1.2 Linux内存管理—虚拟内存的实现
❖ 释放原先申请的内存空间free()
释放内存后,不能再去访问被释放的内存空间 不能两次释放相同的指针 C语言中,malloc/free 需配套使用
10
实验九 Linux内存管理
❖ 预备知识
Linux内存管理 Linux内存分配 Linux内存回收
❖ 实验指导
内存信息的监视 内存的申请和释放
❖ 实验目的、内容
11
3.1 实验目的
❖ 掌握Linux虚拟内存管理的原理 ❖ 掌握Linux中动态内存操作函数的使用方法 ❖ 掌握Linux监测内存使用情况的方法
12
3.2 实验内容
❖ 利用系统提供的内存操作函数进行内存的申请、使 用和释放
❖ 利用系统提供的内存操作函数进行内存的申请、调 整、使用和释放
Ioremap
实现已知物理地址到虚拟 地址的映射
适用于物理地址已知的场合, 如设备驱动
alloc_bootmem
在启动kernel时,预留一段 内存,内核看不见
小于理内存大小,内存管理
要求较高
6
1.3 Linux内存回收
❖ 堆内存:程序从堆中分配的、大小任意的、使用完 后必须显示释放的内存
❖ 堆内存的分配:malloc()、realloc () 、new () ❖ 对内存的回收:free () 、delete ()
实验8Linux的内存管理

内存管理的概念
内存管理的定义
内存管理是指操作系统对计算机内存 资源的分配、回收、保护和扩充等一 系列操作,以确保系统高效、稳定地 运行。
内存管理的目标
提高内存利用率,减少内存碎片,实 现多任务环境下的内存共享和保护, 以及提供虚拟内存等。
Linux内存管理的特点
分段和分页机制
Linux采用分段和分页机制来管理内存,将物理内 存划分为大小相等的页框,同时将进程地址空间 划分为多个段,每个段对应一个页表项,实现地 址空间的隔离和权限控制。
。
03 通过实验操作和观察,加深对Linux内存管理的 理解和认识。
实验环境
操作系统
Linux(建议使用Ubuntu或CentOS等常见发行版 )
开发工具
GCC编译器、GDB调试器、Valgrind内存检测工 具等。
实验材料
一台配置有Linux操作系统的计算机,具备基本的 编程和调试能力。
02
Linux内存管理概述
VS
共享内存的实现方式
在Linux中,共享内存可以通过shmget() 、shmat()和shmdt()等系统调用来实现 。首先,使用shmget()函数创建一个共 享内存段;然后,使用shmat()函数将共 享内存段连接到当前进程的地址空间;最 后,使用shmdt()函数将共享内存段从当 前进程的地址空间中分离。
06
内存优化与性能提升
内存泄漏问题及其解决方案
内存泄漏定义
内存泄漏是指程序在申请内存后,未能正确释放,导致系统内存逐 渐耗尽的现象。
检测工具
使用Valgrind等内存检测工具,可以检测程序中的内存泄漏问题。
解决方案
及时释放不再使用的内存,避免不必要的内存申请,采用智能指针等 RAII技术来管理内存。
Linux的内存管理

total Mem: 256024 −/+ buffers/cache: Swap: 522072
used 192284 80604
free 63740 75420
shared 0
buffers 10676
cached 101004
0
522072
表8-1中第二行输出(Mem:)显示物理 中第二行输出(Mem:) 内存:total列显示共有的可用内存 列显示共有的可用内存( 内存:total列显示共有的可用内存(不显示 核心使用的物理内存,通常大约1MB), 核心使用的物理内存,通常大约1MB), used列显示被使用的内存总额 free列显示 used列显示被使用的内存总额,free列显示 列显示被使用的内存总额, 全部空闲的内存,shared列显示多个进程共 全部空闲的内存,shared列显示多个进程共 享的内存总额,buffers列显示磁盘缓存的当 享的内存总额,buffers列显示磁盘缓存的当 前大小。 前大小。 表8-1中第二行输出(Swap)显示交换 中第二行输出(Swap) 空间的信息,与上一行类似。 空间的信息,与上一行类似。如果该行为全 0,则没有使用交换空间。 则没有使用交换空间。
1.实时监控内存使用情况 (1)在命令行用“free”命令监控内存使 在命令行用“ 用情况
在提示符后输入命令free:# 在提示符后输入命令free:#free :#free 表8-1所示为输出情况。 所示为输出情况。
表8-1
一个256MB的RAM和512MB交换空间的系统情况 的 一个 和 交换空间的系统情况
Linux的内存管理 Linux的内存管理
一、实验目的 二、实验工具与设备 三、实验预备知识 四、实验内容和步骤 五、实验总结
linux操作系统知识点

Linux 操作系统基础知识概览以下是一些关于Linux 操作系统的常见知识点:1.Linux 基础:●Linux 的起源和发展历史●Linux 的主要组成部分:内核、Shell、文件系统等●常见的Linux 发行版(如Ubuntu、Debian、CentOS 等)●常用的命令行工具和基本命令(如ls、cd、mkdir、rm 等)2.用户和权限管理:●用户账户的创建和管理●用户组的概念和使用●文件和目录的权限设置和管理●sudo 权限和root 用户的重要性3.文件系统:●Linux 文件系统的层级结构●常见的文件系统类型(如ext4、XFS、Btrfs 等)●挂载和卸载文件系统●磁盘和分区管理工具(如fdisk、parted 等)4.进程管理:●进程的概念和属性●进程的创建、终止和管理●进程状态的了解和监控●进程间通信的方式(如管道、信号、共享内存等)5.网络和安全性:●网络配置和网络接口管理●网络命令和工具(如ifconfig、ping、ssh 等)●防火墙和安全性措施(如iptables、SELinux 等)●远程访问和远程管理(如SSH、SCP、rsync 等)6.软件包管理:●软件包管理系统(如apt、yum、dnf 等)●软件包的安装、升级和卸载●软件包的依赖关系和解决依赖问题●软件源和仓库的管理7.Shell 脚本编程:●Shell 脚本的基础语法和结构●变量、条件语句、循环和函数的使用●Shell 命令和管道的组合●脚本的调试和错误处理以上只是Linux 操作系统知识的一些常见方面,涵盖了基础知识、用户和权限管理、文件系统、进程管理、网络和安全性、软件包管理以及Shell 脚本编程等。
要深入学习Linux,建议进一步学习和实践这些知识点,并探索更多高级主题,如网络服务配置、系统性能优化等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4-4 linux内存管理子系统4-4-1 linux内存管理(参考课件)物理地址:cpu地址总线上寻址物理内存的地址信号,是地址变换的最终结果逻辑地址:程序代码经过编译后,出现在汇编程序中的地址(程序设计时使用的地址)线性地址:又名虚拟地址,32位cpu架构下4G地址空间CPU要将一个逻辑地址转换为物理地址,需要两步:1、首先CPU利用段式内存管理单元,将逻辑地址转换成线性地址;2、再利用页式内存管理单元,把线性地址最终转换为物理地址相关公式:逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器)(通用的)16位CPU:逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器)线性地址=段寄存器的值×16+逻辑地址的偏移部分物理地址=线性地址(没有页式管理)32位CPU:逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器)线性地址=段寄存器的值+逻辑地址的偏移部分物理地址<——>线性地址(mapping转换)ARM32位:逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器)逻辑地址=段内偏移量(段基地址为0)线性地址=逻辑地址=段内偏移量(32位不用乘以32)物理地址<——>线性地址(mapping转换)************************!!以下都是x86模式下!!*********************************一、段式管理1.1、16位CPU:(没有页式管理)1.1.1、段式管理的由来:16位CPU内部有20位地址总线,可寻址2的20次方即1M的内存空间,但16位CPU 只有16位的寄存器,因此只能访问2的16次方即64K。
因此就采用了内存分段的管理模式,在CPU内部加入了段寄存器,这样1M被分成若干个逻辑段,每个逻辑段的要求如下:1、逻辑段的起始地址(段地址)必须是16的整数倍,即最后4个二进制位须全是0 (因此不必保存)。
2、逻辑段的最大容量为64K。
1.1.2、物理地址的形成方式:段地址:将段寄存器中的数值左移4位补4个0(乘以16),得到实际的段地址。
段偏移:在段偏移寄存器中。
1)逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器)2)由逻辑地址得到物理地址的公式为:(因为没有页式管理,所以这一步就得到了物理地址)物理地址PA=段寄存器的值×16+逻辑地址的偏移部分(注意!!)(段与段可能会重叠)按段式管理能访问2的32次方共4GB 的空间(2的16次方个段,每个段可以为2的16次方byte的大小),但是只有20位地址总线,因此只能访问1M的内存。
1.2、32位CPU:1)实模式:与16位时是一样的段寄存器的值×16就是段地址2)保护模式:段寄存器的值是一个选择器,间接指出一个32位的段地址段基地址长达32位,每个段的最大容量可达4G,段寄存器的值是段地址的“选择器”(segment selector),用该“选择器”从内存(segment descriptor)中得到一个32位的段地址,存储单元的线性地址就是段地址加上段内偏移量,这与32位CPU的物理地址的计算方式完全不同。
!!!线性地址=段基地址+段内偏移量/逻辑地址(段选择器指向的内存中存储的基地址+段偏移寄存器)!!! 这里不用乘以16或者32,因为段基址寄存器可以完全存下段地址。
32位CPU得到线性地址后,再经过页式管理就能得到物理地址二、页式管理2.1页:线性地址被分为固定长度的组,称为页。
例如32位的机器,每页4KB,可划为2的20次方个页(划分虚拟单元),32位机器的线性地址空间为4G。
2.2物理页:也称为页框、页桢;分页单元把所有的物理内存也划分为固定长度的管理单位(划分实在的单元),它的长度一般与线性地址页是相同的。
二者的区别:页划分的是线性地址,物理页划分的是实际的物理地址二者的联系:1、页的长度一般相同,2、通过mapping转换,存在映射关系。
通过分页管理模型,由线性地址得到物理地址1、分页单元中,页目录的地址存放在CPU的cr3寄存器中,是进行地址转换的开始点。
2、每个进程,都有其独立的虚拟地址空间,运行一个进程,首先要将它的页目录地址放到cr3寄存器中,将其他进程的页目录地址保存下来。
3、每个32位的线性地址被划分为三部分:页目录索引(10位);页表索引(10位);偏移(12位)(mapping映射关系由下图反映)上图中页的大小为2的12次方,即4K。
两级分页模型(页不算在内)******************************!!以上都是x86模式!!*********** *******************Linux内存管理Linux有限度地使用了Intel的段式管理机制,而完全采用了页式管理机制。
(也可以说没有采用段式管理)所有段的基地址全部为零(那么所有段都重合,相当于只有一个段)又因为"线性地址=段基地址+段内偏移量/逻辑地址偏移部分",所以"线性地址=逻辑地址"。
在linux系统中,逻辑地址=线性地址=虚拟地址物理地址<——>线性地址(mapping转换)linux页式管理linux2.6.29内核采用了四级页式管理架构,来兼容二级、三级管理架构的CPU。
页全局目录、页上级目录、页中间目录、页表(四级时,线性地址为64位)4-4-2进程地址空间(参考课件)linux操作系统采用虚拟内存管理技术,使得每个进程的地址空间都是独立的。
该空间大小是3G,用户看到的都是虚拟地址,无法看到实际的物理地址。
虚拟内存管理的优点:1、保护操作系统,2、用户程序可以使用比实际物理内存更大的地址空间。
linux将4G的虚拟地址空间划分为用户空间和内核空间。
用户空间:0~0xbfffffff(0~3G):用户进程通常情况下只能访问用户空间。
内核空间:0xc0000000~0xffffffff(3G-4G)用户空间对应进程,所以每当进程切换,用户空间就会跟着变化。
每个进程的地址空间都是独立的。
每个进程的页目录、页表不一样,因此通过页式转换就可以得到不同的物理地址。
例如:同一个用户程序运行多次,产生多个进程,每个进程访问的虚拟地址(逻辑地址、线性地址)都是一样的,但是每个进程都有一套独立的页目录、页表,因此得到的实际物理地址是不同的。
每个进程的页目录和页表就可以理解为进程独立的用户空间。
Fork(),execve(),malloc()等进程相关操作分配的内存,都是虚拟地址。
只有当进程去访问新获取的虚拟地址时,才会由“请页机制”去分配实际的物理地址。
实际的物理内存只有当进程真的去访问新获取的虚拟地址时,才会由“请页机制”产生“缺页”异常,从而进入分配实际页框的程序。
该异常是虚拟内存机制赖以生存的基本保证——它会告诉内核去为进程分配物理页,并建立对应的页表,这之后虚拟地址才实实在在地映射到了物理地址上。
动态分配——Linux内核中,动态分配内存使用函数kmalloc()头文件:#include<linux/slab.h>原型:void *kmalloc(size_t size,int flags) ——kfree,适用于分配小于128KB的内存功能:分配实际的物理页框,虽然返回的是虚拟地址,但已经有对应的物理页了。
参数:Flags取值为:1、GFP_KERNEL,分配实际的内存,分配不到时睡眠。
返回虚拟地址,但对应有实际的物理单元。
(16M-896M)2、GFP_ATOMIC,用来在进程上下文之外的代码(包括中断处理)中分配内存,从不睡眠。
3、__GFP_DMA,要求分配能够DMA的内存(物理地址在16M以下的页桢)4、__GFP_HIGHMEM,分配的内存位于高端内存。
(896M以上)当用完这些页,需要使用下列函数之一来释放它们:◎kfree函数◎get_zeroed_page(unsigned int flags)——free_page返回指向新页面的指针,并将页面清零。
◎__get_free_page(unsigned int flags)——free_page和get_ zeroed _page类似,但不清零页面。
◎__get_free_pages(unsigned int flags,unsigned int order)——free_pages分配若干的连续的页面,返回指向该内存区域的指针,但也不清零这段内存区域。
当用完这些页,需要使用下列函数之一来释放它们:◎void free_page(unsigned long addr)◎void free_pages(unsigned long addr,unsigned long order)如果释放的页面和先前分配的页面数目不等,会导致系统错误。
4-4-3内核地址空间(参考课件)内核空间是由内核负责映射,它并不会跟着进程改变,是固定的。
内核映射的这一套页目录、页表是固定不变的。
内核空间:3G-4G。
高端内存:物理内存896M以上的内存。
1、直接内存映射区:线性地址=3G+物理地址。
从3G开始,最大896M的线性地址区间,我们称作直接内存映射区,这是因为该区域的线性地址和物理地址之间存在线性转换关系。
2、动态内存映射区:最小120M。
由内核函数vmalloc()来分配。
线性空间连续,物理空间不一定连续。
分配一段虚拟地址,仅仅是一个地址,并不对应实际的物理地址。
分配的虚拟地址在动态内存映射区,但可能处于低端内存,也可能处于高端内存(因为直接映射区最大为896M)。
3、永久内存映射区:4M。
(PKMAP)896M以上的高端内存,可以使用该区域来访问。
访问方法:1)使用alloc_page(__GFP_HIGHMEM)分配高端内存页(得到物理页)2)使用kmap函数将分配到的高端内存映射到该区域。
(得到线性地址)4、固定内存映射区:4M。
每个地址项都服务于特定的用途,如ACPI_BASE等。
映射关系做好了,不能改变。
4-4-4内核链表(参考课件)链表数据结构:一般包含两个域:数据域和指针域。
链表数据结构的定义:struct list_head{struct list_head *next,*prev;}内核链表具备双链表功能,通常它都组织成双向循环链表,在[include/linux/list.h]中。
传统链表和linux链表的比较:1、传统链表:单向链表,指针指向下一节点,指针为下一节点数据类型的指针。
缺点,节点类型变化,则指针类型也要变化,不通用。
2、linux链表:双向循环链表,指针类型固定为struct list_head,链表头也为struct list_head类型,但是不含数据。