- 博客(155)
- 资源 (30)
- 收藏
- 关注
原创 linux内核异常处理流程梳理
第二组表示异常发生在ELn(n可以为1,2,3),处理异常的特权等级也是ELn(n可以为1,2,3),但是这里是linux内核,所以我们的特权为EL1,我们可以理解为异常发生在EL1,处理异常的特权等级也是EL1。在linux这里就是说,第三组和第四组表示异常发生在EL0,但是异常处理却在EL1,而他们的区别就是,第三组表示异常发生在64位环境下,第四组表示异常发生在32位环境下。我们也看到第一组都是invalid的,是因为EL0发生了异常,不会在EL0处理,会陷入EL1处理,所以第一组也不需要实现。
2023-02-02 15:31:51 840
原创 linux内存管理(十六)-kmalloc函数解析
kmalloc_order就是真正进行页面分配的函数,首先flags加上__GFP_COMP标志,这样子就是使用了复合页,然后通过alloc_pages从伙伴系统中分配页面,如果分配成功,再调用page_address函数,把page结构体转化为虚拟地址,最后返回虚拟地址。如果比较小,则从slab管理器中分配内存。kmalloc_order_trace函数的作用是调用kmalloc_order进行真正的页面分配,然后在trace_kmalloc函数中使用tracer动态跟踪kmalloc。
2023-02-02 10:36:22 1257
原创 proc文件系统下各参数解析
proc全称是process information pseudo-filesystem,翻译过来就是进程信息伪文件系统。proc文件系统是一个伪文件系统,它提供了一个到内核数据结构的接口,一般挂载在/proc。proc文件系统中的大多数文件都是只读的,但有些文件是可写的,允许修改内核变量。在Ubuntu20.04,内核版本是5.15.0-56。我们可以看到proc文件系统下的文件和目录如下图所示:我们首先看到的是很多的数字,这些数字就是我们系统的每一个进程的信息,数字目录下面的文件的含义是一样的。我
2023-01-16 06:18:16 3435
原创 linux内存管理(十五)解析设备树中的内存信息过程分析
原来early_init_dt_mark_hotplug_memory_arch是通过memblock_isolate_range分离出对应的start_rgn和end_rgn,然后对[start_rgn,end_rgn]进行memblock_set_region_flags设置标志位。early_init_dt_scan_root也很简单,就是获取size-cells和address-cells信息,并且赋值给dt_root_size_cells 和dt_root_addr_cells而已。
2023-01-10 21:01:03 1592
原创 linux内核顺序锁的代码分析
顺序锁的特点使用方法也比较简单,只有read_deqretry可能有点疑问,就是读者退出临界区的时候会检测在读操作的过程中有没有写操作,如果有写操作则返回1,说明需要重新读,再跑一次循环吧;如果没有写操作,则返回0,说明不需要重新读,可以退出循环。
2023-01-07 23:25:20 509
原创 linux内核互斥锁的代码分析
自旋锁很好用,但是有个缺点,就是一直会占用cpu,直到获取锁。有时候我们不需要这样子,我们可以在锁被占用的时候把进程切换出去,直到锁被释放,我们再回来加锁,这样子才更符合我们实际应用。
2023-01-07 20:48:16 984
原创 读操作系统导论记录linux下锁的历史发展
如何评价一种锁实现的效果。为了评价锁是否能并工作得好,我们应该先设立一些标准。第一是锁是否能完成它的基本任务,即提供互斥。最基本的,锁是否有效,能够阻止多个线程进入临界区?第二是公平性。当锁可用时,是否每一个竞争线程有公平的机会抢到锁?是否会有这样子极端的情况:是否有竞争锁的线程会饿死,一直无法获得锁?第三是性能,具体来说,是使用锁之后增加的时间开销。有几种场景需要考虑。一种是没有竞争的情况,即只有一个线程抢锁、释放锁的开支如何?另外一种是一个CPU上多个线程竞争,性能如何?
2022-11-10 23:47:05 326
原创 麒麟操作系统使用dconf配置环境变量记录
最后还有一个问题,我们虽然使用上面的方法修改了dconf的配置,而且在设置页面也看到配置修改是ok的,但是系统实际配置没有生效。有时候我们需要修改默认配置,我们可以先去/usr/share/glib-2.0/schemas/目录找到对应的gschema.xml文件,找到文件后进行修改。我们的dconf默认配置是保存在/usr/share/glib-2.0/schemas/*.gschema.xml文件中,用户登录之后会把默认配置记录到。/.config/dconf/user文件。
2022-11-05 14:06:59 2273
原创 yocto的bitbake过程记录
我们使用yocto编译镜像的时候,第一步是要配置编译环境,第二步就是使用bitbake工具编译出我们需要的镜像。这里我们就来分析一下使用yocto进行bitbake的过程吧。现在我们尝试一下分析bitbake一个包和一个镜像的过程。使用的是NXP官方的imx8mp的yocto。,下载用户手册,根据用户手册搭建yocto环境,编译yocto。
2022-10-10 15:24:58 2942 6
原创 ARMv8常用寄存器记录
AArch64执行状态提供了31个在任何时间任何特权级下都可访问的64位的通用寄存器。每个寄存器都有64位宽,它们通常被称为寄存器X0-X30。每个AArch64 64位通用寄存器(X0-X30)也具有32位(W0-W30)形式。每一个通用寄存器可以作为64位的通用寄存器,我们叫他们(X0-X30),也可以作为32位的通用寄存器(W0-W30)。如下图所示,每一个通用寄存器都是64位的。32位寄存器(W0-W30)取自相应的64位寄存器(X0-X30)的低32位。
2022-08-25 00:23:41 4527
原创 麒麟操作系统的kdump环境搭建
kexec是一个快速启动机制,允许通过已运行的内核的上下文启动一个linux内核,不需要经过BIOS。实现kdump机制的关键,包括二个组成部分:一是内核空间的系统调用kexec_load,负责在生产内核启动时将捕获内核加载到指定的地址。二是用户空间的工具kexec-tools,将捕获内核的地址传递给生产内核,从而在系统崩溃的时候能够找到捕获内核的地址并运行。这是内核崩溃转储的本质。捕获内核会在生产内核崩溃时启动起来,与相应的 ramdisk 一起组建一个微环境,用以对生产内核下的内存进行收集和转存。...
2022-08-09 09:17:05 756
原创 ARM系统中9种中断响应步骤记录
看了贺贺老师的大系统中断的9种示例文档,理解整个ARM在安全和非安全模式中对各种中断的响应流程,cpu在不同执行环境(3种)来了不同中断(3种),cpu在这九种情况下中断响应流程的详细解析
2022-07-31 23:38:08 2592 4
原创 ubuntu修改控制台的名字
我们每一次打开一个新的控制台,他的名字都比较长,一般都是路劲,如果同时打开多个控制台,就不太容易区分哪个了,我们可以使用一下方法,可以很简单的给我们的控制台重命名
2022-07-25 21:49:50 541
原创 systemd开机启动和关机回调脚本
关机执行脚本:rtc_load.service把这个文件放到/lib/systemd/system/目录,然后使用以下命令创建几个软连接:
2022-07-04 11:14:36 4494
原创 dpdk环境搭建
一、首先我们需要准备一个物理机或者一个虚拟机。物理机:需要一个高性能的网卡跑dpdk和一个普通网卡进行网络通信,机器安装Ubuntu16.04.虚拟机:使用vnware安装Ubuntu16.04,配置一个多队列网卡和一个普通网卡。二、虚拟机配置如果使用物理机,我们不需要做任何配置,只需要安装Ubuntu16.04即可。如果没有物理机,我们就需要使用vmware安装Ubuntu 16.04,并且进行下面的配置。1.添加一个多队列网卡2.修改新增的网卡类型修改虚拟机所在的目录中的vmx文件。
2022-06-30 01:29:12 3086
原创 Ubuntu 环境搭建
yocto:sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat libsdl1.2-dev xterm
2022-06-09 20:08:34 1018
原创 eBPF学习记录(五)linux内核源代码编译eBPF程序
linux 内核源代码编译bpftool的命令:make -C tools/bpf/bpftool编译ebpf程序命令问题记录:对于参数问题,当前 BPF 程序尝试把所有参数一次性放入,受限于栈最大长度 512,很容易出现被截断现象。以 BCC 程序为例的解决方法:遍历参数列表 argv 时,每个参数读取之后直接调用 perf_submit 提交至 ringbuf,而不是读取所有参数后仅提交一次,最后用户态程序负责把这些字符串拼接起来。这样可以做到参数最大个数不受限制,且每个参数长度可接近栈最大
2022-06-09 19:29:21 4174
原创 使用cgroup控制cpu、内存、IO资源实践
一、按比例控制cpu资源1.挂载cgroup文件系统jian@ubuntu:~/share$ sudo mkdir /cgroupjian@ubuntu:~/share$ sudo mount -t cgroup -o cpu cgroup /cgroup2.创建两个cpu资源分组ga和gajian@ubuntu:~/share$ sudo mkdir /cgroup/gajian@ubuntu:~/share$ sudo mkdir /cgroup/gb3.把进程分配给两个资源组组首先
2022-05-12 21:26:20 1374
原创 eBPF学习记录(四)使用libbpf开发eBPF程序
上一节,我们使用了bpftrace 开发eBPF程序跟踪内核和用户态的程序,bpftrace 简单易用,非常适合入门,可以带初学者轻松体验 eBPF 的各种跟踪特性。但是,bpftrace 并不适用于所有的 eBPF 应用,它本身的限制导致我们无法在需要复杂 eBPF 程序的场景中使用它。在复杂的应用中,还是推荐使用 BCC 或者 libbpf 进行开发。现在讲一下BCC 的开发,有问题可以看官方文档。现在我们试试使用BCC开发一个eBPF程序,分以下3个步骤,使用 C 开发一个 eBPF 程序使用
2022-03-06 21:38:56 6957
原创 eBPF学习记录(三)使用BCC开发eBPF程序
上一节我们已经初步体验了 eBPF 程序的开发和执行过程,现在我们试试了解一下bpftrace使用方法。
2022-02-27 22:46:47 7192 1
原创 eBPF学习记录(二)使用bpftrace开发eBPF程序
上一节我们已经对eBPF有了一定的了解,现在我们试试开发一个最简单的eBPF程序,分以下3个步骤使用 C 开发一个 eBPF 程序新建一个 hello.c 文件,并输入下面的内容:int hello_world(void *ctx){ bpf_trace_printk("Hello, World!"); return 0;}就像所有编程语言的“ Hello World ”示例一样,这段代码的含义就是打印一句 “Hello, World!” 字符串。其中, bpf_trac
2022-02-21 21:01:51 2367 1
原创 eBPF学习记录(一)eBPF介绍
一、什么是eBPFeBPF, 从它的全称“扩展的伯克利数据包过滤器 (Extended Berkeley Packet Filter)” 来看,它是一种数据包过滤技术,是从 BPF (Berkeley Packet Filter) 技术扩展而来的。BPF 提供了一种在内核事件和用户程序事件发生时安全注入代码的机制,这就让非内核开发人员也可以对内核进行控制。随着内核的发展,BPF 逐步从最初的数据包过滤扩展到了网络、内核、安全、跟踪等,而且它的功能特性还在快速发展中,这种扩展后的 BPF 被简称为 eBPF
2022-02-18 15:33:18 10331 2
原创 嵌入式linux使用trace调试步骤记录
0.内核配置:CONFIG_FUNCTION_TRACERCONFIG_FUNCTION_GRAPH_TRACER1.挂载debugfs文件系统mount -t debugfs none /sys/kernel/debug2.进入tracing调试目录cd /sys/kernel/debug/tracing3.设置为function_graph功能echo function_graph > ./current_tracer4.添加需要跟踪的函数blk_update_requeste
2022-02-10 21:24:11 3113
原创 linux用户态使用gpio中断方法
一、用户空间gpio的调用文件用户空间访问gpio,即通过sysfs接口访问gpio,下面是/sys/class/gpio目录下的三种文件:–export/unexport文件–gpioN指代具体的gpio引脚–gpio_chipN指代gpio控制器(1) export/unexport文件接口:/sys/class/gpio/export,该接口只能写不能读用户程序通过写入gpio的编号来向内核申请将某个gpio的控制权导出到用户空间当然前提是没有内核代码申请这个gpio端口比如 ech
2022-02-10 16:57:31 11956
原创 嵌入式通过绑定实现双网卡冗余
双网卡冗余是通过绑定实现的,我们需要通过以下几个步骤实现:1.配置内核选中CONFIG_BONDING2.配置/etc/network/interfaces文件,在文件中添加以下:source-directory /etc/network/interfaces.dauto lo iface lo inet loopbackauto eth0 iface eth0 inet manual bond-master bond0auto eth1 iface e
2022-01-19 10:06:55 1857
原创 软中断内核源码分析
上一章我讲解了tasklet的实现代码,我们已经知道tasklet其实是通过软中断来完成的,那么软中断到底是怎么调用的呢?首先,我们看看软中断到底有哪些类型:在这里插入代码片我们已经知道有这么多种软中断,...
2021-12-09 00:19:02 1000
原创 apt报错Hash 校验和不符解决办法
1、桌面空白处右键选择【在这里打开终端】2、sudo apt update更新软件列表时,提示”Hash 校验和不符“,如下图所示。3、su解决方法,首先切换到root用户。4、mkdir /etc/gcrypt建立gcrypt目录。5、echo all >>/etc/gcrypt/hwf.deny输入all到所有hwf.deny文件。6、apt updateupdate第一次失败则多尝试update两次就可以了。正常更新软件包列表了。...
2021-11-24 14:06:46 5510 1
原创 linux虚拟文件系统(六)-文件关闭操作分析
close分析大家可以使用以下函数关闭一个文件,无论是字符设备文件还是已经挂载好的文件系统中的文件:int close(int fd);其中close这个函数就是使用了close函数进行系统调用,其系统调用为:SYSCALL_DEFINE1(close, unsigned int, fd){ int retval = __close_fd(current->files, fd); /* can't restart close syscall because file table e
2021-09-05 22:02:17 1099
原创 linux虚拟文件系统(五)-文件打开操作分析
open分析大家可以使用以下函数打开一个文件,无论是字符设备文件还是已经挂载好的文件系统中的文件:int open(const char*pathname,int flags,mode_t mode);其中open这个函数就是使用了open函数进行系统调用,其系统调用为:SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode){ if (force_o_largefile()) flags
2021-08-21 15:55:15 1772
原创 linux虚拟文件系统(四)-文件系统挂载操作分析
ext4文件系统挂载大家可以使用以下命令挂载一个u盘到 /mnt目录下:mount -t ext4 /dev/sda1 /mnt其中mount这个应用程序就是使用了mount函数进行系统调用,其系统调用为:SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name, char __user *, type, unsigned long, flags, void __user *, data){ retur
2021-08-04 23:28:11 1283
原创 linux虚拟文件系统(二)-ext4文件系统结构
EXT4是第四代扩展文件系统(英语:Fourth extended filesystem,缩写为 ext4)是Linux系统下的日志文件系统,是ext2和ext3文件系统的后继版本。
2021-08-01 13:41:09 5165 1
RegBit.exe.zip
2024-05-29
glxgears x11perf测试工具.docx
2024-05-07
IOZone硬盘性能测试工具培训.doc
2024-05-07
硬盘测试工具FIO测试方法培训.docx
2024-05-07
LTP测试工具使用.docx
2024-05-07
mymymyprintf.c
2024-04-17
load-monitor.zip
2024-04-17
tcr-reader.zip
2024-04-17
WakeMeOnLan(远程唤醒开机)
2024-03-26
14. 预处理器.docx
2024-03-14
各头部企业嵌入式面经手册
2024-03-07
如何学习Linux下的GPIO
2024-03-05
Linux时间子系统.docx
2024-01-27
eMMC-驱动架构分析
2024-01-23
DIM-SUM操作系统内核开发的一系列问题及其解答
2024-01-11
EPCM3568B-LI系统的系统基本操作手册
2024-01-11
Linux内核设备树介绍
2023-11-01
银河麒麟嵌⼊式操作系统安装教程
2023-11-01
RISC-V的特权规范
2023-11-01
RISCV-伪指令列表
2023-11-01
swap的分析及其使用
2023-11-01
linux使用gdb调试方法详解
2022-04-27
老同学给的入门级驱动开发资料
2022-01-20
老同学给的入门级linux系统编程资料
2022-01-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人