文章目录 一、ARM64 架构体系内存分布 二、Linux 内核启动源码 start_kernel 三、内存初始化源码 mm_init 四、内存初始化源码 mem_init 一、ARM64 架构体系内存分布...内核启动源码 start_kernel ---- 在 Linux 内核初始化完成后 , 会在 " 初始化内存 " 时 , 输出 内存布局 ; Linux 内核启动源码是定义在 linux-5.6.18...-5.6.18\init\main.c#795 四、内存初始化源码 mem_init ---- 在 linux-5.6.18\init\main.c#795 定义的 mm_init 方法 中 , 调用了...mem_init 方法初始化内存 , 该方法定义在 arch\x86\mm\init_32.c#766 位置 ; 在内存初始化时 , 会打印如下格式的 " 内核空间 内存分布 " 日志 : printk...源码 : void __init mem_init(void) { pci_iommu_alloc(); #ifdef CONFIG_FLATMEM BUG_ON(!
前面已经分析了linux内存管理算法(伙伴管理算法)的准备工作。...当前主要分析伙伴管理算法,则仅对mem_init()做专门的分析,其余的暂且后面再分析。...伙伴管理算法的初始化函数入口是mem_init(),其实现: 【file:/arch/x86/mm/init_32.c】 void __init mem_init(void) { pci_iommu_alloc...managed_pages则是记录管理区的管理页面数,totalhigh_pages则是记录高端内存的页面总数; 具体看一下__free_reserved_page(): 【file:/include/linux...ClearPageReserved(page); init_page_count(page); __free_page(page); } 其中ClearPageReserved定义在/include/linux
手把手教你分析 Linux 启动流程 上一次咱们分析了 Linux 的启动流程和初始化流程,今天主要分析一下内存方面的初始化和常见的内存分配方式。...start_kernel |--->mm_init |--->mem_init linux4.14/init/main.c 在 mem_init 函数中会初始化伙伴系统和 slab...2、有的人可能知道 Linux 有一个 bootmem 分配器,这个是在Linux初始化过程中的一个临时分配器,他会在 setup_arch 函数中初始化,然后在 mm_init 中关掉,只是在伙伴系统出现之前的临时使用...bootmem_init ·················· END ·················· 点击关注公众号,免费领学习资料 欢迎大家关注我的微信公众号,定期给大家分享 C 语言、单片机、嵌入式 Linux
不知道大家有没有产生过一个疑问:从给 Linux 服务器按下开机电源按钮后到启动成功的一段时间里,在这中间 Linux 操作系统都做了哪些事情?...在 Linux 服务器没有通电的时候,操作系统还只是躺在硬盘启动区中的一段程序,CPU 没有工作,内存也没有启动。但是在你按下开机键后,Linux 服务器内部就开始变得热闹了起来。...叫做《Linux 源码趣读》。这周,这本新书正式印刷出炉了。 对于 Linux 启动过程,代码的运行在书中总结成下面一张图来表示。但分了 50 小节来讲述每一个步骤中的细节。...mem_init(main_memory_start,memory_end); trap_init(); blk_dev_init(); sched_init(); buffer_init...具体包括内存模块初始化 mem_init、中断初始化 trap_init、块设备初始化 blk_dev_init、进程调度初始化 sched_init、硬盘初始化 hd_init 等。
指的是 随机存取存储器 RAM 和 只读存储器 ROM ; ② 设备内存 : Device Memory , 指的是 分配给 " 外围设备寄存器 " 的 物理地址 ; ARM64 架构 , 参考 【Linux...内核 内存管理】Linux 内核内存布局 ④ ( ARM64 架构体系内存分布 | 内核启动源码 start_kernel | 内存初始化 mm_init | mem_init ) 博客 , 物理地址最大支持...Memory-Mapped 外围设备寄存器 一般是 连续编址 的 , 三、外围设备寄存器物理地址 映射到 虚拟地址空间 用户空间 的 应用进程 , 访问 " 外围设备寄存器 " 只能通过 " 虚拟地址 " 实现 , Linux
那么接下来就进入练习1的内容,我们可以先去看看需要做什么再回过来看代码: 练习1:在kern/pmap.c文件中,为以下功能实现代码: boot_alloc() mem_init() page_init...根据 mem_init() 里面的下一步描述,我们需要使用 boot_alloc 分配一个 struct PageInfo 的数组,这一部分应该也很简单: pages = (struct PageInfo...Fill in the missing code in mem_init() after the call to check_page()....还是一样,根据测试和注释驱动: void mem_init(void) { uint32_t cr0; size_t n; i386_detect_memory(); kern_pgdir...顶端这些部分应该是映射到物理内存的顶部,即内核地址空间;底下几行还没写 应该参考一下上面那个 mem_init 函数就知道啦 2. 我们已经将内核和用户环境放置在相同的地址空间中。
include 4#include 5#include 6#include 7#include 8#include 9#define KVM_API_VERSION 12 10#define RAM_SIZE 128000000 11#define...= -1) 277 close(fd); 278 return ret; 279} 280int mem_init(struct KVMSlot *slot, char *file)...memory_size = RAM_SIZE; 304 slot->start_addr = 0; 305 slot->slot = 0; 306 kvm_init(); 307 mem_init
Linux内核在启动时会打印出内核内存空间的布局图,下面是ARM Vexpress平台打印出来的内存空间布局图: ? 这部分信息打印是在mem_init()函数中实现的。...[start_kernel->mm_init->mem_init] pr_notice("Virtual kernel memory layout:\n" " vmalloc : 0x%
看完了进入内核前的工作后,我网络编程课的抄写作业自然是可以圆满完成啦,不过看了一部分后觉得确实很有意思,所以也是决定继续看下去,并且计划看完linux源码后跟着MIT6.s081写一个小的操作系统内核,...接下来我们看一下mem_init这个函数做了啥。...诶这个时候我们是不是又会想起来在进入Linux内核前的准备一文中提到过的INT指令,例如INT 0x80这个指令就是相当于直接告诉CPU中断号0x80。...那至于这里提到的中断描述符表IDT,我们也在进入Linux内核前的准备一文中设置GDT这一段中提到过啦,IDT从idtr寄存器中可以找到,而idt这个表采用的是一个结构体数组的方式进行存储,对应的内容就是上面提到的段选择子和段内偏移地址啦...并且呢当时在内存管理中,我们用mem_init()初始化了主内存的管理结构mem_map,以此来对内存进行管理。
after_page_tables //设置了页表之后 进入main函数 看一看mem_init… 小结 ---- 本系列参考哈工大MOOC整理而来 本系列需要汇编语言作为前置基础,不清楚汇编的...---- 进入main函数 main函数是不会退出返回的,上面给出的main代码还少了两句,具体可以参考linux 0.11源码。...---- 看一看mem_init… 这里我们来看看内存的初始化都干了啥 mem_init方法负责初始化相关内存页表,这里end_mem参数是setup阶段拿到的内存大小,该内存大小会存入90002
//Linux操作系统,在init/main.c中 void main(void) { mem_init(); trap_init(); blk_dev_init(); chr_dev_init
Linux 文件系统 目录 说明 bin 存放二进制可执行文件 sbin 存放二进制可执行文件,只有 root 才能访问 boot 存放用于系统引导时使用的各种文件 dev 用于存放设备文件 etc...是超级管理员 localhost 表示主机名 ~ 表示当前目录(家目录),其中超级管理员家目录为 /root,普通用户家目录为 /home/chan $ 表示普通用户提示符,# 表示超级管理员提示符 Linux...test.tar.gz 文件搜索命令 locate:在后台数据库搜索文件 updatedb:更新后台数据库 whereis:搜索系统命令所在位置 which:搜索命令所在路径及别名 find:搜索文件或文件夹 用户和组 Linux
Linux文件操作 Linux中,一切皆文件(网络设备除外)。 硬件设备也“是”文件,通过文件来使用设备。 目录(文件夹)也是一种文件。...boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件和镜像文件。...deb:deb是Device(设备)的缩写,该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。...系统会自动识别一些设备,例如U盘、光驱等,当识别后,Linux会把识别的设备挂载到这个目录下。...---- Linux文件的操作方式 文件描述符fd fd是一个大于等于0的整数。 每打开一个文件,就创建一个文件描述符,通过文件描述符来操作文件。
bl init_clock @ 跳转到 init_clock 标号, 执行时钟初始化操作 bl mem_init @ 跳转到 mem_init 标号 , 执行内存初始化操作...-Tu-boot.lds -o u-boot.elf $^ arm-linux-objcopy -O binary u-boot.elf u-boot.bin %.o : %.S arm-linux-gcc...@ 跳转到 mem_init 标号 , 执行内存初始化操作 , 该段代码定义在 mem.S 文件中 bl light_led @ 打开开发板上的 LED 发光二极管...@ 伪指令 mem.S 可以理解成一个函数 , 该函数由 start.S 进行调用 , 它必须是一个全局的 mem_init: @ 定义内存初始化的标号...-Tu-boot.lds -o u-boot.elf $^ arm-linux-objcopy -O binary u-boot.elf u-boot.bin %.o : %.S arm-linux-gcc
disable_mmu @ 跳转到 disable_mmu 标号执行, 关闭 MMU bl init_clock @ 跳转到 init_clock 标号, 执行时钟初始化操作 bl mem_init...@ 跳转到 mem_init 标号 , 执行内存初始化操作 , 该段代码定义在 mem.S 文件中 bl light_led @ 打开开发板上的 LED 发光二极管...@内存 初始化代码 @**************************** .text @ 宏 指明代码段 .global mem_init...@ 伪指令 mem.S 可以理解成一个函数 , 该函数由 start.S 进行调用 , 它必须是一个全局的 mem_init: @ 定义内存初始化的标号...-Tu-boot.lds -o u-boot.elf $^ arm-linux-objcopy -O binary u-boot.elf u-boot.bin %.o : %.S arm-linux-gcc
linux安装.net 下载.net https://dotnet.microsoft.com/download/thank-you/dotnet-sdk-2.1.4-linux-x64-binaries...下载安装包后执行命令: dotnet-sdk-2.1.302-linux-x64.tar.gz yum install libicu -y cd /root ln -s /data1/soft /data.../soft tar zxvf dotnet-sdk-2.1.302-linux-x64.tar.gz -C /data1/soft/dotnet/ echo 'export DONET_ROOT=$PATH
Linux ESC :wq 和:wq!的区别 Linux ESC:wq 和:wq!...的区别 发布者:IT人在线 | 发表时间:2018-12-4 17:20:43 Linux ESC :wq esc(键退出)->:(符号输入)->wq(保存退出) wq(存盘并退出 write%quite
为了解决内存紧缺的问题,Linux引入了虚拟内存的概念。为了解决快速存取,引入了缓存机制、交换机制等。...要深入了解Linux内存运行机制,需要知道下面提到的几个方面。 首先,Linux系统会不时地进行页面交换操作,以保持尽可能多的空闲物理内存。...其次,Linux进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存中,Linux内核根据“最近最经常使用”算法,仅仅将一些不经常使用的页面文件交换到虚拟内存中。...Linux虽然可以在一段时间内自行恢复,但是恢复后的系统已经基本不可用了。...Linux下可以使用文件系统中的一个常规文件或者一个独立分区作为交换空间。同时Linux允许使用多个交换分区或者交换文件。
相信很多在linux平台工作的童鞋, 都很熟悉管道符 '|', 通过它, 我们能够很灵活的将几种不同的命令协同起来完成一件任务.就好像下面的命令: echo 123 | awk '{print $0+123...EAGAIN 如果所有管道写端对应的文件描述符被关闭,则read返回0 如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE 当要写入的数据量不大于PIPE_BUF时,linux...当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。
---- O_SYNC 缓存同步 为了保证磁盘系统与缓冲区内容一致,Linux系统提供了sync,fsync,fdatasync三个函数。...---- Linux文件IO流程图 内核中会有一个线程,不断地将高速页缓冲区中的数据写入到物理磁盘中。
领取专属 10元无门槛券
手把手带您无忧上云