自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

科学边界

炼狱是为追逐光芒

  • 博客(331)
  • 资源 (2)
  • 收藏
  • 关注

原创 Linux内核铁三角文章汇总

最近发现一个word直接转换markdown的工具,因此尝试把以前整理的一些Linux内核文章发到博客上;首先整理一点Linux内核铁三角(进程、内存、IO)的文章:第一部分 进程调度1.第二部分 内存管理第三部分 IO与文件系统...

2020-08-26 17:02:11 690 3

原创 《将博客搬至CSDN》

许久没写博客这几年阅历不少然最怀念的还是那段“笔耕不辍”的岁月近期偶有“重拾旧梦”的想法打开CU,满满熟悉的味道排版依然这么烂搬至CSDN尝试一下~ 管理员在2009年8月13日编辑了该文章文章。 -->

2017-03-29 11:07:05 419

原创 树莓派4B摄像头安装和使用方法详解(支持拍照,录像,实时监控)

接上篇,树莓派网络已经调通,开机通过ssh登录树莓派:step1:硬件安装这里采用的官方配套CSI接口摄像头,采用OV5647模组,定焦镜头,支持500万像素, 160度广视角;注意:安装任何硬件,须在断电下进行,否则极易造成不可逆损坏;安装摄像头较简单,按步骤即可,注意动作适当温柔, 我的pi上摄像头挡板已被弄断????1.找到摄像头接口;2.拉起csi挡板,两头同时轻轻抬起;3.接入排线,注意别接反,一般把有蓝色胶带一面朝挡板;4.平按下csi挡板,两头同时按下;5.镜头板那端,同样

2021-11-16 10:58:09 17127 16

原创 树莓派4B卡片电脑之初见--从零开始安装树莓派系统

树莓派,于嵌入式攻城师,如雷贯耳之大名;前些日review ARM汇编,用qemu模拟的树莓派4,部分异常指令(数据对齐,timer中断触发等)在qemu无法真实模拟,遂想在真机耍玩一把。无奈电子玩具近期缺货异常,一拖再拖尔。机遇巧合,一网友分享的驴车项目(https://www.dfrobot.com.cn/), 基于树莓派实现;闷鳖多时对无人驾驶的热忱正无处释放,果断第一时间加入;入手整车一台,昊男兄在微雪搞了个团购,价格的确实惠,这个实惠嘛,服务就…还有待加强;当然啦,缺少支持的好处就是,更容易自

2021-11-09 09:55:56 1100

原创 ARM64基础14:ARM64的中断处理之GIC400实现(以树莓派4采用的BCM2711芯片为例)

接上篇,ARM64基础13:ARM64的异常处理之中断处理(以树莓派4采用的BCM2711芯片为例)传统中断控制器,比如树莓派4b的legacy interrupt controller,具备中断enable寄存器;中断状态寄存器;随着新业务的出现,比如1.中断源变得越来越多;2.不同类型的中断出现,比如多核间中断,中断优先级,软中断等;传统中断控制器已经无法满足需求,由此GIC控制器应运而生;...

2021-09-26 17:49:38 2565 5

原创 ARM64基础13:ARM64的异常处理之中断处理(以树莓派4采用的BCM2711芯片为例)

ARM64的中断属于异常模式的一种,对中断的处理流程跟上节的异常处理类似,走其中的一个分支;树莓派4b的中断控制器分两种:传统的中断方式legacy interrupt和GIC(BCM2711支持GIC-400);

2021-09-23 20:53:03 2953 5

原创 ARM64基础12:ARM64的异常模式及异常向量表

1.ARM64的异常等级ARM64包含4个异常等级:EL0:非特权模式,常用来跑应用程序;EL1:特权模式,常用来跑内核;EL2:虚拟化监控程序,例如hypervisor;EL3:安全模式,例如secure monitor;2.同步异常和异步异常同步异常包括:1.系统调用,svc, hvc, SMC等;2.MMU引发的异常;3.SP和PC对齐检查;4.未分配的指令;异步异常:IRQ中断;FIQ中断;SError注:在官方手册D1.12有详细列出那些是同步异常;3.异常入口

2021-09-13 11:37:34 6384 6

原创 ARM64基础11:GCC内嵌汇编补充

目的:(1)优化,对特定代码进行优化;(2)C语言需要访问某些特殊指令来实现特殊功能,比如内存屏障指令;内嵌汇编两种模式:基础内嵌汇编:不带参数;扩展的内嵌汇编:C语言变量参数;(1)基础内嵌汇编格式:asm关键字:表明是一个GNU扩展;修饰词(qualifiers)volatile:基础内嵌汇编中,通常不需要;inline:内敛,asm代码会尽可能小;汇编代码块:GCC编译器把内嵌汇编当成一个字符串;GCC编译器不会去解析和分析内嵌汇编;多条汇编指令,需要使用“\n\t”换行

2021-09-06 18:16:43 2249

原创 ARM64基础10:GNU LD链接器介绍

连接器Linker:是一个程序,将一个或多个编译器或汇编生成的目标文件,及依赖库,连接为一个可执行文件。GNU Linker采用AT&T链接脚本语言;链接脚本文件:包含ld程序链接的规则,其决定输出可执行文件的内存布局;LD命令:arm64版本的连接器是aarch64-linux-gnu-ld查看命令参数:aarch64-linux-gnu-ld --helpLD命令的参数有很多,常用的如下:$(ARMGNU)-ld -T $(SRC_DIR)/linker.ld -Map xxx.

2021-09-01 16:46:42 1935

原创 ARM64基础9:GNU AS汇编器介绍

ARM64的汇编器(1)ARM公司官方的汇编器;(2)GNU AS汇编器:aarch64-linux-gnu-as;(3)gcc采用as作为汇编器,所以汇编码是AT&T格式;(4)AT&T格式:源于贝尔实验室;(5)ARM格式:ARM官方汇编语法;汇编语法(1)label:任何以冒号结尾的标识符,都被认为是一个标号;(2)注释:“//”,注释“#”,在一行的开始,注释整行;(3)指令、伪指令、寄存器,可以全部大写或者小写,GNU默认风格是小写;(4)Symbol:代表

2021-08-30 18:32:15 1670 1

原创 ARM64基础8:A64其他常用指令

1.加载指令(PC相对地址)ADR: 加载PC相对地址的label地址,范围+/- 1MB;ADRP: 加载PC相对地址,label地址,并且4KB对齐,范围+/- 4GB;/* others inst */.align 3.global my_test_datamy_test_data: .dword 0x12345678abcdeeff.global adrp_testadrp_test: adr x0, my_test_data adrp x1, my_test_data

2021-08-26 15:39:43 1365

原创 ARM64基础7:A64的比较和跳转指令

pstate的nzcv标志位条件标志位描述N负数标志(上次运算结果为负值,则N=1,否则N=0)Z上次运算结果为0C对于加法运算,无符号溢出,C=1, 其他不变V有符号溢出条件码后缀助记符标志位定义0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1无符号大于或者等于0011CC/LOC=0无符号小于0100MIN=1负值0101PLN=0正值或0

2021-08-25 17:41:14 4681

原创 ARM64基础6:A64的算术和移位指令

条件操作码在pstate处理器(对应a32之前是CPSR)状态中有4个条件操作吗NCZV条件标志位描述N负数标志(上次运算结果为负值,则N=1,否则N=0)Z上次运算结果为0C对于加法运算,无符号溢出,C=1, 其他不变V有符号溢出普通加法指令add1.使用寄存器的加法;2.使用立即数的加法;3.使用移位操作的加法adds指令,影响条件标志位csubs指令,影响条件标志位cadc指令ADC Xd, Xn, Xm //Xd = Xn + X

2021-08-22 20:04:53 1835

原创 ARM64基础5:A64的存储和加载指令

ldr和str指令ARMv8也是基于指令加载和存储的架构,即不能直接操作内存;LDR <reg_dst>,<addr> //把存储器地址的数据加载到目的寄存器中;STC <reg_src>,<addr> //把原寄存器的值,存储到内存中;ldr指令寻址1:地址偏移模式ldr Xd,[Xn,$offset].global ldr_test //申明全局函数ldr_test: // 1. ldr地址偏移模式 mov x1, 0x80000

2021-08-17 20:28:55 3163

原创 用QEMU模拟调试裸机ARM64汇编,支持gdb单步调试

完全是方便自己查询,做个记录。树莓派4支持ARM64, cortex A72,支持最新的ARMv8指令集,且有众多的开源资料,适合用来学习ARM64汇编,其他芯片大同小异,遇到需要,再进一步研究qemu支持的芯片;这里直接采用笨叔提供的qemu工具,以及初始化代码BenOS,再添加自己的测试代码来调试ARM汇编指令。考虑版权因素,用到的工具及BenOs源码,这里不公开,有兴趣的朋友,可以去购买笨叔的教材,获取详细资料。编译好BenO后,在qemu启动BenOS: qemu-system-aarch6

2021-08-11 20:37:30 5938 1

原创 ARM64基础4:在C语言中嵌入ARM64汇编代码

如题,有时为了提高部分代码运行性能,可以将部分C代码实现,用汇编改写(自己编写常比编译器优化效果更好)1.先看案例:#include <stdio.h> static int compare_data(int a, int b){ int val; asm volatile ( "cmp %1,

2021-08-02 16:59:01 3755

原创 ARM64基础3:在ARM64汇编中调用C语言函数

如题,演示汇编程调用C函数方法1.创建两个文件compare.cint compare_data(int a, int b){ return (a >= b) ? a : b;}main.S文件.section .data.align 3print_data: .string "big data: %d\n".section .text.globl mainmain: stp x29, x30, [sp, -16]!

2021-08-02 15:48:07 919

原创 ARM64基础2:在C语言调用ARM64汇编函数

如题,通过C语言代码调用汇编实现的函数1.创建两个文件:compare.S和main.ccompare.S.section .text.globl compare_datacompare_data: cmp x0, x1 csel x0, x0, x1, hi //若x0>1则返回x0, 否则返回x1 retmain.c文件#include <stdio.h>extern int compare_data(int a, i

2021-07-31 17:32:21 1091 1

原创 ARM64基础1:用ARM汇编实现,查找给定数组的最大数

如题,用ARM汇编实现功能,在给定数组中查找最大数.section .data //定义数据段段.align 3 //以2^3对齐my_data: //定义一个数据 .quad 1 .quad 2 .quad 5 .quad 8 .quad 10 .quad 12my_data_count: //数组的个数 .quad 6.align 3print_data: //定义一个字符串 .string "big data: %d\n".sectio

2021-07-31 17:16:05 1423 2

原创 ARM64基础0:ARM64架构简介

如题,一些ARM64通用的架构知识

2021-07-31 17:15:05 6326

原创 ARM64相关列表

如题,收藏一些ARM64相关的笔记,随心所为,纯为方便自己查阅;

2021-07-31 17:13:04 313

原创 用Eclipse+QEMU搭建可视化环境,单步调试Linux内核

step1:安装java环境Eclipse运行依赖jave环境;sudo apt install openjdk-13-jrestep2:安装Eclipse-CDT官网:http://www.eclipse.org/cdt/step3:配置Eclipse-CDT(1)创建工程在Eclipse菜单选择File->New->Project,选择Makefile Project with Exiting Code,即可创建一个新工程;(2)配置调选项选择Eclipse菜单中的Ru

2021-07-28 20:28:17 1627 1

原创 配置jupyter notebook在局域网中访问

1.生产配置文件jupyter notebook --generate-config2.生产密码jupyter notebook password显示:Enter password: **** Verify password: ****将生成的密钥拷贝配置文件echo "c.NotebookApp.password = 'sha1:***************'" >> ~/.jupyter/jupyter_notebook_config.py3.设置访问IPecho "

2021-07-22 20:09:50 1132 1

原创 ubuntu16.04 挂载exfat的u盘

搞了个高速移动固态盘,考虑会跨平台使用,格式化为exfat格式:接入ubuntu16.04不能自动挂载,手动挂载提示不支持文件系统格式;解决办法:安装支持工具sudo apt install exfat-utilssudo mount /dev/sdb1 /mnt/usb1/$mount.../dev/sdb1 on /mnt/usb1 type fuseblk (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permis

2021-07-08 17:05:26 534

原创 使用qemu搭建ARM64调试环境,支持文件共享,支持gdb调试

环境主机ubuntu版本: 20.04qemu模拟处理器:ARM64Linux内核版本:https://www.kernel.org/ 最新版step1:安装编译工具链sudo apt-get install gcc-aarch64-linux-gnu查看版本号leon@leon:~/work$ aarch64-linux-gnu-gcc -vUsing built-in specs.COLLECT_GCC=aarch64-linux-gnu-gccCOLLECT_LTO_WRAPPE

2021-07-06 10:18:03 3587 8

原创 Linux内核之IO4:块I/O流程与I/O调度器

1一个块IO的一生从page cache到bio到request当APP打开一个文件,内核为文件维护一个pagecache(磁盘的一个副本);读写文件时如果page cache命中,只会读写内存不操作磁盘;没有命中,才操作磁盘。在内核用file结构体表示,可见其包含一个inode结构体,一个地址空间;相关的几个结构体在内核对应关系如下:可见,当多个进程同时打开同一个文件时,不同的file结构体对应同一个inode和同一个地址空间,地址空间是由一颗radixtree维护(即pagecache

2020-08-27 18:02:43 1316

原创 Linux内核之IO3:文件系统一致性

1 掉电与文件系统一致性由上一节文件系统的布局分析可知,当操作一个文件时,比如往/a目录下添加一个b,即添加/a/b文件,需要修改inode bitmap, inode table, block bitmap, data block。这一系列的操作是非原子的,假如任何一个环节掉电,造成某些步骤丢失,就会造成数据的不完整,文件将无法正常访问。2 append一个文件的全流程而硬件是不可能原子执行的,因此会造成不一致性。3 模拟文件系统不一致性案例(1) 做一个image,用来模拟磁盘dd

2020-08-27 17:55:39 1381

原创 Linux内核之IO2:EXT文件系统详解(案例解析)

一切都是文件,Linux通过VFS中间层,支持多种文件系统,对APP统一接口;文件系统的本质是将用户数据和元数据(管理数据的数据),组织成有序的目录结构。1 EXT2文件系统总体存储布局一个磁盘可以划为多个分区,每个分区必须先用格式化工具(某种mkfs)格式化成某种格式的文件系统,然后才能存储文件,格式化的过程会在磁盘上写一些管理存储布局信息。一个典型的ext格式化文件系统存储布局如下:文件系统最小存储单位是Block,Block大小格式化时确定,一般4K;启动块(BootBlock):大小

2020-08-27 17:43:04 2179

原创 Linux内核之IO1: I/O模型

在业务执行过程中,常伴随大量的IO操作,如果IO操作和CPU消耗不能合理安排,将会导致整体业务执行效率低下,用户体验极差。比如手机启动过程,有大量CPU消耗和IO操作。用Bootchart记录android启动过程的CPU/IO消耗如下图Systemd readahead:Systemd readahead-collect.service搜集系统启动过程中的文件访问信息,Systemdreadahead-replay.service在后续启动过程中完成回放,即将IO操作与CPU并行;提高效率的

2020-08-27 16:57:20 825

原创 Linux内核之内存5: 其他工程问题以及调优

1.DMA和cache一致性(1)不带CACHE自己写驱动,申请DMA,可以用Coherent DMA buffersvoid * dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t*dma_handle,gfp_t flag);void dma_free_coherent (struct device *dev, size_t size,void *cpu_addr,dma_addr_t dma_handle);

2020-08-27 16:49:28 533

原创 Linux内核之内存4: 内存与I/O的交换

1. page cacheLinux读写文件过程;read:用户进程调用read命令,内核查询读取的文件内容是否在内存(内核pagecache)中,若该页内容缓存在内存中,直接读取返回给用户进程;若缓存不存在,则启动BIO,从硬盘读取该页面到内存,再送给用户进程;write过程:比如往某文件5K处写入10byte,内核先查询该页是否在内存缓存(内核pagecache),不在,同read,从硬盘读取该页4~8K到内存,再往5k处写入10byte,标明该页为脏页;写回磁盘时机,则由内存管理的BIO

2020-08-27 12:03:11 804

原创 Linux内核之内存3: 进程的内存消耗和内存泄漏

1.进程的VMA(1)进程地址空间在Linux系统中,每个进程都有自己的虚拟内存空间0~3G;内核空间只有一个3G~4G;进程通过系统API调用,在内核空间申请内存,不统计在任何用户进程;进程消耗内存,单指用户空间内存消耗;(2)VMA列表LINUX用task_struct来描述进程,其中的mm_struct是描述内存的结构体,mm_struct有一个vma列表,管理当前进程的所有vma段。每个进程的内存由多个vma段组成:(3)查看VMA方法:1.pmap由图知,从接近0地址开始

2020-08-27 11:46:50 1401

原创 Linux内核之内存2: 内存的动态申请、释放的原理和细节

1.slab、kmalloc/kfree、/proc/slabinfo和slabtopBuddy 是直面物理内存的,所有的内存分配,最终都通过Buddy的get_free_page/page_alloc分配;Buddy的粒度太大,最小分配一页(4k); 而我们常常需要分配小内存;所以Linux引入一个二级分配的概念:1.内核分配内存,调用kmalloc()/kfree()–调用slab–再调用Buddy ;2.用户空间malloc/free–调用C库–C库通过brk/mmap调用Buddy;fr

2020-08-27 11:35:57 1615

原创 Linux内核之内存1: CPU寻址原理和分页管理

1.1 CPU寻址内存,虚拟地址、物理地址(1)寻址内存:CPU访问外设,有两种类型,一个是内存空间,一个是IO空间;IO空间,X86通过in/out指令访问外设,IO空间只存在X86架构,在RISC架构不存在;内存空间,CPU通过指针访问所有内存空间,内存空间分为两类,普通内存和位于内存空间的寄存器。其他设备的寄存器,比如通过I2C总线访问触摸屏的寄存器,与CPU内存空间无关。(2) MMU原理对于一个支持MMU的CPU,只要开启MMU,CPU跟程序员视角一致,看到的永远是虚拟地址;在访问

2020-08-27 11:26:29 975 3

原创 Linux内核之进程6: 深度睡眠

1.深度睡眠特点及存在原因深度睡眠TASK_UNINTERRUPTIBLE:不可被信号唤醒;浅度睡眠TASK_INTERRUPTIBLE:唤醒方式,等到需要的资源,响应信号;深度睡眠场景:有些场景是不能响应信号的,比如读磁盘过程是不能打断的,NFS也是;执行程序过程中,可能需要从磁盘读入可执行代码,假如在读磁盘过程中,又有代码需要从磁盘读取,就会造成嵌套睡眠。逻辑做的太复杂,所以读磁盘过程不允许打断,即只等待IO资源可用,不响应任何信号;应用程序无法屏蔽也无法重载SIGKILL信号,深度睡眠可

2020-08-26 19:58:38 1094 1

原创 Linux内核之进程5:Cgroup

1.按群分组Cgroup按群分组,分配资源,属于二级分配(1)按群组分配资源将进程分组,多个组按权重分配CPU配额,单个组内任务再按进程调度算法分配案例:启动三个a.out,一共耗CPU800%(八核)创建两个CGROUP:A和Bcd /sys/fs/cgroup/cpusudo mkdir Asudo mkdir B关注A/B中两个成员,cgroup.procs:本群组包含的进程cpu.shares:本组权重值,与其他组竞争的权重值;将进程1164/1184加入组A,114

2020-08-26 19:52:51 1177

原创 Linux内核之进程4:CPU的负载均衡

1.线程的负载均衡对task_struct做负载均衡;分布式系统中,linux的每个核都自动以劳动为乐,(共产主义社会)。分别对RT任务和普通线程做负载均衡:RT任务:将n个优先级最高的线程自动分配到n个核;pull_rt_task()push_rt_task()普通任务:周期性负载均衡,在时钟tick会检查哪个核空闲,优先使空闲核工作(从负载重的核pull任务,或push任务给空闲核,每个CPU以劳动为乐);idle时负载均衡;某个核进入idle状态,会主动pull任务执行;for

2020-08-26 18:12:15 1700

原创 Linux内核之进程3:进程调度

1. 吞吐率和响应吞吐:单位时间内做的有用功;响应:低延迟。吞吐追求的整个系统CPU做有用功,响应追求的是某个特定任务的延迟低;1GHZ的CPU切换线程保存恢复现场约几个微妙级别,看似消耗不了太多时间,但是由于系统的局部性原理,会保存当前线程数据的缓存,切换线程会打乱局部性引起cachemiss,而CPU访问cache速度远大于内存访问,这样综合看来上下文切换花销还是很大的。无用功占用较多CPU;所以追求吞吐量和低延迟,这两个目标是矛盾的编译内核选项有如下服务器版追求吞吐量,配置为不抢占

2020-08-26 17:31:50 514

原创 Linux内核之进程2:进程和线程的本质

1.进程拥有资源mm,fs,files,signal…fork创建一个新进程,也需要创建task_struct所有资源;实际上创建一个新进程之初,子进程完全拷贝父进程资源,如下图示:比如fs结构体:子进程会拷贝一份fs_struct,*p2_fs = *p1_fs;pwd路径和root路径与父进程相同,子进程修改当前路径,就会修改其p2_fs->pwd值;父进程修改当前路径,修改p1_fs->pwd;其他资源大体与fs类似,最复杂的是mm拷贝,需借助MMU来完成拷贝;即写时拷贝

2020-08-26 17:15:51 879

原创 Linux内核之进程1:进程的概念

1.什么是进程?进程:资源的封装单位;linux用一个PCB来描述进程,即task_struct, 其包含mm,fs,files,signal…root目录,是一个进程概念,不是系统概念;apropos chrootman chroot 2如下图,将分区/dev/sda5挂载到/mnt/a,调用chroot,改变root目录,当前进程下的文件b.txt即位于当前进程的根目录。(2)fd也是进程级概念;(base) leon@leon-Laptop:/proc/29171$ ls

2020-08-26 17:04:54 636

s3c2451 spec文档

s3c2451文档,s3c2451是s3c2440最佳替代品

2013-12-17

Linux内核与设计第三版(中英文)

Linux内核与设计原书第三版(中英文)

2013-06-19

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除