- 博客(51)
- 资源 (28)
- 收藏
- 关注
原创 创建overlayfs说明
可以使用mkfs.jffs2或者flash_erase来对nor flash进行格式化。:只需要格式化一次norflash,之后都不需要。
2023-11-30 13:57:45 501
原创 Linux System.map解析
在Linux中,System.map文件是内核符号名称及其对应内存地址的映射表。它在内核构建过程中创建,并位于内核源代码树的根目录中(通常是/linux/System.map)。System.map文件由内核的崩溃转储分析工具和一些性能分析工具使用,以将内核地址映射到它们对应的符号名称。System.map文件是一个纯文本文件,对于每个符号,它包含三列信息:符号的虚拟地址、符号类型(函数、数据等)和符号名称。虚拟地址是符号所在内核内存中的位置。符号类型指示符号是函数、变量还是某种其他类型的数据。
2023-04-21 14:29:13 1138
原创 解读OOM killer机制输出的日志
在业务繁忙的服务器,小内存方案,内存泄露的场景中,我们常常发现系统在非常大的内存压力情况下触发了OOM killer机制。OOM killer机制是内存管理中在资源极端短缺情况下一种迫不得已的进程终止机制。OOM killer机制会根据算法选择并终止占用内存资源比较多的进程,以释放内存......
2022-08-12 19:32:09 2246
原创 Linux 应用内存信息分析 VSS/RSS/PSS/USS
在分析Linux内存使用时,不仅需要分析kernel内存使用情况,还需要分析Linux应用的内存使用情况,这就引出了VSS/RSS/PSS/USS
2022-08-12 14:25:19 1332
原创 gpf_maskf分配掩码描述
gfp_mask定义在include/linux/gfp.h文件中。修饰符在Linux4.4内核中被重新归类,大致可以分成如下几类。下面详细介绍各种修饰符的标志。
2022-08-10 10:34:52 363
原创 第四章-并发与同步思考题
1.在ARM处理器中,如何实现独占访问内存?1.linux提供了atomic_t的原子变量结构在实现独占访问内存,不同架构有不同的实现。2.ARM使用ldrex和strex指令来保证中间执行的指令的原子性,指令后缀ex表示exclusive(独家的),不考虑原子性ldrex与ldr是一致的。3.ARM处理器核心有Local monitor和Global monitor来实现ldrex和strex指令的独占访问。2.atomic_cmpxchg()和atomic_xchg()分别表示什么含义?
2022-08-08 17:03:09 179
原创 第一章-处理器体系结构
1.请简述精简指令集 RISC 和复杂指令集 CISC的区别。1.简单指令集一般在一个cycle就完成执行。2.CISC指令集更容易做到向前兼容,凭借此一统PC和服务器市场。3.RISC指令集,只保留简单的指令集,可以省下很多晶体管,所以更容易实现低功耗和嵌入式。2. 请简述数值0x12345678 在大小端字节序处理器的存储器中的存储方式1.大端模式下地址的增长顺序与值的增长顺序相同。0x430:1234 5678 0000 00000x440:0000 0000 0000 0000
2022-08-08 17:01:32 161
原创 第三章 内存管理之预备知识
UMA架构:内存有统一的结构并且可以统一寻址。目前大部分嵌入式系统、手机系统以及台式机操作系统等采用UMA架构。如下图,该系统使用UMA架构,有4个CPU,它们都有L1高速缓存,其中CPU0和CPU1组成一个簇(Cluster0),它们共享一个L2高速缓存。另外,CPU2和CPU3组成另外一个簇(Cluster1),它们共享另外一个L2高速缓存。4个CPU都共享同一个L3的高速缓存。最重要的一点,它们可以通过系统总线来访问物理内存DDR。.........
2022-08-08 17:00:57 503
原创 第二章 ARM64在Linux内核中的实现
虚拟地址是运行时段所在的地址,可以理解为运行时地址。加载地址是加载时section所在的地址,可以理解为加载地址。
2022-07-27 14:04:51 2192
原创 Linux内核汇编代码分析
读懂Linux内核汇编代码对理解ARMv8架构和指令集有很大裨益。下面将分析从内核汇编入口到C语言入口start_kernel()函数之间的一大段汇编代码。
2022-07-27 11:08:27 3694
原创 案例分析(三)linux-5.4 mmc无法挂载文件系统
项目背景问题描述复现方法实验调试实验一:从log中查看mmc过程解决方法方法一方法二方法三修复后log项目背景项目:”h618-linux-5.4-bsp板型:H618-p2介质:mmc问题描述在基础kernel跑起来后,init尝试挂载文件系统失败报如下错误:[/init]: Wait /dev/mmcblk0p4 ready ...[ 3.484810][ 3.484810] insmod_device_driver[ 3.484810][ 3.4.
2021-10-26 16:05:37 1536
原创 案例分析(二)内存越界检测工具kasan
KASAN简介 Kasan 是 Kernel Address Sanitizer 的缩写,它是一个动态检测内存错误的工具,主要功能是检查内存越界访问和使用已释放的内存等问题。在Linux-4.0中Kasan 集成在 Linux 内核中,随 Linux 内核代码一起发布,并由内核社区维护和发展。但知道Linux-4.4版本才开始之初ARM64。此次采用的是Linux-4.9版本做实验。KASAN原理 Kasan 的原理是利用“额外”的内存来标记那些可以被使用的内存的状态。这些做标记的区域被称为影子区
2021-10-16 16:49:01 3084
原创 案例分析(一):decodecode解析oops异常失败
环境架构:arm64工具链:gcc-linaro-5.3.1-2016.05-x86_64_aarch64-linux-gnulinux-5.4log文件在win7环境生成decodecode文件在Ubuntu环境背景在分析oops异常时发现一个叫decodecode的脚本,可以在没有源代码或符号表的情况下,将oops异常的log作为输入就可以解析出错误位置的汇编代码。但在使用decodecode脚本的时候出现了如下错误:$ ARCH=arm64 $ CROSS_COMPILE=g
2021-10-12 17:18:32 2197
原创 Linux内核异常调试工具与方法
常见调试通道(工具)串口调试通道通过串口shell查看/修改寄存器:查看一个寄存器空间内容:a.1 启动linux内核,进入shell界面a.2 执行“cd /sys/class/sunxi_dump”a.3 执行“echo xxxx > dump”,xxx为想要查看的地址,虚拟/物理地址都可以a.4 执行“cat dump”,即可看到寄存器的内容# cd /sys/class/sunxi_dump/# echo 0x01f01400 >dump# cat
2021-10-12 14:24:22 2647 1
原创 提交代码到Linux开源社区(MAINLINE)
1.下载最新Linux源码$ git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux.git2.修改.gitconfig$ vi ~/.gitconfig[user] email = yourname@youremail.com name = yourname[core] editor = vim autocrlf = input compression = -1[gui] encoding = utf-8[
2021-09-27 18:07:23 627
原创 ftrace介绍
Kernel trace 工具的发展历史 Linux 跟踪工具在内核的发展就像是肥皂剧一样,剧情婉转,主题反复,并且相互竞争。本章试图总结当前Linux 众多跟踪工具的现状和历史原因,并最终引出 ftrace 工具。 编者对于以下内容并非亲历者(主要来自 LWN 和 maillist),如有歪曲请拍砖。以下部分虽属八卦,但是,学习一些模块的设计方案和历史进程是我们学习方法论的一部分,从这些纠结的方案和博弈中可以看到很多权衡和利弊,帮助更好的获得其中的思想。Why Trace the kernel
2021-08-17 11:17:45 1646
原创 3.4 进程切换
目录1.进程切换2.硬件上下文3.任务状态段3.1 thread字段1.进程切换为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换(process switch)、任务切换(task switch)或上下文切换(context switch)。下面几节描述在 Linux 中进行进程切换的主要内容。2.硬件上下文一、尽管每个进程可以拥有属于自己的地址空间,但所有进程必须共享CPU寄存器。因此,在恢复一个进程的执行之前,内核必须确保
2021-04-19 02:02:43 2156 2
原创 3.3 撤销进程
1. 撤销进程很多进程终止了它们本该执行的代码,从这种意义上说,这些进程“死”了。当这种情况发生时,必须通知内核以便内核释放进程所拥有的资源,包括内存、打开文件及其他资源,如信号量。进程终止的一般方式是调用exit()库函数,该函数释放C函数库所分配的资源,执行编程者所注册的每个函数,并结束从系统回收进程的那个系统调用。exit()函数可能由编程者显式地插入。另外,C编译程序总是把exit()函数插入到main()函数的最后一条语句之后。内核可以有选择地强迫整个线程组死掉。这发生在以下两种典型情况下
2021-04-15 23:14:04 1580
原创 3.2 进程的创建
1.概述Linux系统中采用了与其他操作系统不同的方式创建进程。Linux将进程的创建的两个步骤分解为fork()和exec()。fork()通过拷贝当前进程创建一个子进程。其与父进程的区别仅仅在于PID(每个进程唯一)、PPID(父进程进程号)和某些资源和统计量(如:挂起的信号,子进程不继承)。exec()函数负责读取可执行文件并将其载入地址空间开始运行。2.写时拷贝(copy-on-write)2.1 背景传统的fork()系统调用直接把所有的资源复制给新创建的进程。这种实现过于简单且
2021-04-14 02:38:58 1658
原创 3.1 进程概述
1.从程序到进程从上图可以看到一个程序通过编译器编译成汇编程序,经过汇编器编程目标代码,通过链接器形成可执行文件,最后交给操作系统来执行。从上图可知,从OS看来当程序执行时,程序也摇身一变成为了进程,在OS看来每个进程时没有多大的差异性的。都被封装在ELF的可执行文件格式中。可以通过top命令感知系统中各个进程以及动态变化,如下图。2.进程的家族关系进程是一个动态的实体,它是具有生命周期的。OS中进程的生生死死随时发生,所以操作系统对进程的描述就模仿人类的活动。一个进程不会平白
2021-04-07 03:03:51 533
原创 2.4 动手实践,代码级-把虚拟内存地址转换为物理内存地址
paging_lowmem.c#include <linux/kernel.h>#include <linux/init.h>#include <linux/module.h>#include <linux/mm.h>#include <linux/mm_types.h>#include <linux/sched.h>#include <linux/export.h>static unsigned long
2021-04-02 01:28:05 1044 1
原创 2.3 保护模式下的分页机制
1. 分页机制的引入分页机制是分段机制之后进行的,目的是为了将线性地址转换成物理地址。x86架构规定,分页机制是可选的,但众多操作系统采用的都是分页机制。2. 分页机制中的页所谓分页,就是将虚拟地址空间或线性地址空间划分成若干大小相等的片,称为页(Page)对物理地址空间分成与页大小相对的存储块,称为块或页面(Page Frame)在32为系统中页默认为4KB的大小。3. 分页原理分页可以是每个进程拥有自己独立的虚拟地址空间。为了达到这个效果CPU就需要一次地址的变化,也就是
2021-03-31 03:01:14 581 1
原创 2.2 保护模式下的段机制
1.一切从hello world说起#include <stdio.h>int main(void){ printf("hello world!\n"); return 0;}我们通过编译,汇编,链接,装载并执行gcc -S hello.c -o hello.s //编译gcc -c hello.s -o hello.o //汇编gcc -c hello.o -o a.out //链接./a.out //装载并执行图解如下2. 问题由上述编译,汇编
2021-03-30 03:05:50 349
原创 2.1 内存管理之内存寻址
1. 内存寻址概述1.1 图灵机内存寻址的历史某种程度上来说就是现代计算机的历史。从最早的图灵机说起。如下图:输入,输出,状态转移函数是图灵机的三要素,图灵机通过纸带完成内存寻址。图灵机是现代计算机的鼻祖。1.2 冯诺依曼体系结构冯诺依曼体系核心思想:数据连续存储和选择读取思想。计算机背后的核心问题之一,就是如何有效的进行内存寻找,因为所以数据运算的前提都是需要从内存中取得数据。冯诺依曼体系给出了一种解决方案。1.3 CPU体系结构关系图1.4 x86架构不同内存寻址的时期
2021-03-30 00:34:43 1228
原创 1.3 Linux内核中的双链表结构
1. 双链表1.1 双链表的演化在C语言中,一个基本的双向链表定义如下:struct my_list { void * mydata; struct my_list *next; struct my_list *prev;};图解如下prev称为前驱指针,next称为后继指针。这种结构可以从两个方向遍历链表从而提高效率。为什么要对双链表作为重点介绍? d...
2021-03-28 17:57:34 149
原创 1.2 Linux内核结构以及内核模块的编程
1. Linux的单内核与微内核1.1 两者整体框图比较1.2 单内核操作系统的各个子系统,比如说文件系统,内存管理,进程管理,网络系统,进程间通信,互相之间可以直接调用。特点,由于各个子系统可以相互访问,所以性能比较高。但是可维护性比较差。典型的Linux就是单内核1.3 微内核只有一些核心的代码放到了微内核里,比如核心进程间通信,中断,调度程序。而文件系统,内存管理。可能以服务器的形式放在外部。特点,由于各个模块访问是通过通信的方式访问,所以效率比较低,但是每个服务器相对独立,
2021-03-28 15:29:10 160 1
原创 1.1-linux操作系统概述
1. linux系统整体结构2. linux设计理念机制与策略分离3. 系统调用机制系统调用在应用程序和内核中起一个接口的作用把很多操作都隔离起来了。系统调用机制起 一个隔离变化的作用。以应用程序访问文件为例。应用程序不需要关注,访问的是哪种文件系统,hardware不需要关注访问的哪种存储介质。这里system call就起了一个隔离变化的作用。3.参考文献Linux内核设计与实现深入理解Linux内核...
2021-03-28 14:14:58 147
原创 linux字符设备驱动创建基本框架
1.#mermaid-svg-sIc5Woe5yvqQctVc .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-sIc5Woe5yvqQctVc .label text{fill:#333}#mermaid-svg-sIc5Woe5yvqQctVc .node rect,#mermaid-svg-sIc5Woe
2021-01-24 19:04:55 102
原创 基于阿尔法开发板构建卡启动固件
1.前言看了正点原子的视频,突发奇想,我能不能只用一张SD卡就自己构建完整的linux系统,包括u-boot,linux内核,rootfs。说干就干,也顺便当记个笔记。没使用过正点原子视频的同学可能看不懂。2.u-boot2.1 u-boot修改u-boot使用正点原子提供的版本,不过为了满足直接启动的需要,需要给u-boot的默认env进行修改。diff --git a/include/configs/mx6ullevk.h b/include/configs/mx6ullevk.h
2020-11-29 04:07:22 2247
原创 使用映射网络驱动器与samba将虚拟机中的Ubuntu(Linux)系统的目录映射到Windows中
1. 文章部分参考了https://www.cnblogs.com/abc36725612/p/8183490.html2. 设置linux系统为静态ipWindows版本——>win7,64位Ubuntu版本——>Ubuntu16.042.1 必须保证linux系统是能上网的我们可以通过ping www.hao123.com来确认。2.2 设置Ubuntu为静态IP2.2.1 点击虚拟机——>设置2.2.2 点击网络适配器——>桥接模式2.2.3
2020-10-30 00:21:49 1135 1
原创 批量去掉文件中的^M
1 "^M"在Linux下的输入方法 ctrl v + ctrl m方案一:find -type f | xargs sed -i 's/^M//g'或者find -name *.[ch] | xargs sed -i 's/^M//g'方案二:xxx.sh: ^M: not found^M是Windows上的回车符\r在UNIX上的显示形式。这种情况多半是在Windows上编辑了shell脚本,然后拿到UNIX/Linux上执行。只要将文件中所有的\r删除即可。tr -d "\r"
2020-05-31 00:51:07 517
原创 19_构造一个简单的linux内核
1. 下载内核源码linux-3.18.6cd workspacewget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xztar -xf linux-3.18.6.tar.xzcd linux-3.18.6sudo make distcleanmake i386_defconfigsudo make -j22. 编译时遇到的问题2.1 fatal error: linux/compiler-gcc6.h:
2020-05-27 23:51:50 179
原创 16_Linux内核源码
1 linux内核源码代码简介1.1 前面的章节,已经对计算机系统和操作系统有了一个初步的了解,总结起来就是计算机有“3大法宝”存储程序计算机函数调用堆栈中断1.2 操作系统有“两把宝剑”中断上下文进程上下文2 内核目录介绍2.1 arch目录arch目录是与体系结构相关的子目录列表,里面存放了许多CPU体系结构的相关代码,比如arm,x86等。arch目录中的代码在linux内核代码中占比相当庞大,主要原因是arch目录中的代码可以使linux内核支持不同的CPU和体系结构。
2020-05-26 23:46:38 223
原创 15_02_一个简单的操作系统内核源代码
1 重要结构体介绍(定义进程块)struct Thread { unsigned long ip; //用于存放eip unsigned long sp; //用于存放esp};----------------------//定义进程管理相关的数据结构typedef struct PCB { int pid; //进程ID volatile long state; //进程状态 char stack[KERNEL_STACK_SIZE]; //内核堆栈 struct Th
2020-05-26 00:22:37 1160
原创 linux-3.9-mykernel环境搭建
linux-3.9环境搭建参考这里搭建。增加报错时的解决方案。1 linux环境搭建步骤1.1 安装qemusudo apt-get install qemusudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu1.2 下载linux源码wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.9.4.tar.xzlinux-3.9.4不一定能下载出来这里是另一个下载链接linux-
2020-05-11 23:41:26 455
AArch32 & AArch64 Registers map详细解析与索引
2023-05-04
vim_plug_3.0
2020-12-19
Q-dir多窗口文件整理工具
2020-10-30
OpenSSH-server
2020-10-13
vim_plug_2.0
2020-09-22
linux-3.9.4.tar_4942.xz
2020-05-11
vim_plugin.zip
2020-05-01
linux环境下,vim82.zip
2020-04-18
Vundle.vim-master.zip
2020-04-18
模拟电子技术基础(第四版)习题解答_童诗白
2018-08-17
(带书签)Linux C函数参考手册(用例及详解)
2018-08-17
linux文件的操作函数用法详解
2018-08-17
(带书签)linux常用命令用例及详解
2018-08-17
STC15单片机实战指南书稿
2018-08-17
自动搜索算法(带源码和详细说明)
2018-08-17
基于多LED的高精度室内可见光定位方法
2018-08-16
王爽《汇编语言》第三版答案
2018-08-16
Makefile中文教程
2018-08-16
PADS9.3三合一完美精简版
2018-06-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人