![](https://img-blog.csdnimg.cn/20210302112311863.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
ok6410开发板
本系列博客以 ok6410开发板 为硬件对象, sd卡启动 为 启动方式, 探究 u-boot 及 kernel 的 启动过程和移植过程
__pop_
这个作者很懒,什么都没留下…
展开
-
OK6410A 开发板 (八) 47 linux-5.11 OK6410A 应用空间查看内存的工具
freecat /proc/slabinfocat /proc/xxx/mapscat /proc/xxx/stack物理页面 页帧 页帧号虚拟页32B个字节管理4096Bmalloc/freemmap/munmapbrkmmap原创 2024-02-23 11:00:13 · 343 阅读 · 0 评论 -
linux 运行时 usb-mouse 的运行流程
【代码】linux 运行时 usb-mouse 的运行流程。原创 2024-02-23 10:43:28 · 361 阅读 · 0 评论 -
OK6410A 开发板 (八) 126 linux-5.11 OK6410A GPIO驱动的应用
linux-3.0.1 gpio 驱动 ok6410aGPIO原创 2022-12-05 10:03:01 · 182 阅读 · 0 评论 -
从文件系统到存储设备的数据流
MMC原创 2022-09-04 01:36:08 · 222 阅读 · 0 评论 -
ARM32 ARM64 的设备树匹配及兼容ATAGS
arm32 arm64 u-boot 加载 linux的命令 bootmarm64 linux 被加载的情况bootm的命令 bootm <uImage_addr> // 无设备树,bootm 0x30007FC0 bootm <uImage_addr> <initrd_addr> <dtb_addr> // 有设备树 --- nand read.jffs2 0x30007FC0原创 2022-01-26 15:15:06 · 1307 阅读 · 0 评论 -
arm-linux 异常 的返回
之前在这里列出了 几个 几个异常入口,现在要考虑 这些异常入口最终会走到哪里去将其分为四种情况考虑// TODO循环卡死 vector_addrexcptn __dabt_invalid __irq_invalid __pabt_invalid __und_invalid __dabt_svc __pabt_svc __und_svc返回内核空间 __fiq_abt __irq_svc返回用户空间 _原创 2022-01-26 10:39:00 · 1126 阅读 · 0 评论 -
OK6410A 开发板 (八) 125 linux-5.11 OK6410A 进程通信之pipe
管道,本质是用__get_free_page在内核空间申请一个空间,并将其初始化为一个环行buffer。写的时候,就填充这个buffer,写满了,就根据IO设置,阻塞或者非阻塞,写到非空,唤醒读进程。读的时候,就从这个buffer拿值,读空了,就根据IO设置,阻塞或者非阻塞,读到非满,唤醒写进程。有名管道,本质上是管道的升级版,将内核的这个环行缓冲区与磁盘文件绑定磁盘文件对所有非亲属进程可见,从而非亲属进程可通过磁盘文件访问该环行缓冲区测试代码 : https://github.com/lis原创 2022-01-10 10:24:44 · 239 阅读 · 0 评论 -
OK6410A 开发板 (八) 124 linux-5.11 OK6410A rootfs中留给开发者的内存/cpu/进程/磁盘/文件系统相关命令
内存相关命令top free pmap vmstat ps htop demidecodegotop https://github.com/cjbassi/gotopnmon hwinfo lshw inxi screenfetch dmesg atop htop corefreq glances Gnome 系统监视器cpu相关命令用户接口cat /proc/cpuinfo 命令top vmstat sar磁盘fdisk du.原创 2022-01-08 15:44:49 · 490 阅读 · 0 评论 -
OK6410A 开发板 (八) 123 linux-5.11 OK6410A rootfs中留给开发者的内存访问接口
与内存相关的文件系统我们如果想用rootfs中的文件来观测内存则需要观测的文件所属的文件系统 为 内核文件系统// https://blog.csdn.net/u011011827/article/details/119322870 中的 "linux 真实文件系统分类"相关的文件系统有以下几种 sysfs,procfs,rootfs,devtmpfs,debugfs可以从 /proc/filesystems中查看 当前的linux系统中注册了哪些 系统,在从中根据经验挑选出 内核文件系统原创 2022-01-07 13:05:50 · 451 阅读 · 0 评论 -
OK6410A 开发板 (八) 122 linux-5.11 OK6410A 以linux用户角度去应用用户空间内存
以linux用户角度去应用用户空间内存 //在 用户空间是以 段的形式管理的在内核空间是通过 VMA 来管理这些段的 // https://blog.csdn.net/u011011827/article/details/117335579 中的 VMA 代码段内存 通过增加代码长度 通过汇编指定一个段为代码段(虽然里面可能是数据) 数据段内存 全局变量 // __attribute__((section(".ARM.__at_address"))) , 这个东西要该默原创 2022-01-07 12:26:54 · 441 阅读 · 0 评论 -
OK6410A 开发板 (八) 121 linux-5.11 OK6410A 以linux用户角度去应用内核空间内存
以用户角度去应用内核空间内存 // https://blog.csdn.net/u011011827/article/details/117335579level 1 api level1 phy mem api : get_page_from_freelist add_to_free_list level1 virt mem api : 1.线性映射/直接映射区 page_to_virt page_address 2.vmalloc 动态映射区 __allo原创 2022-01-07 12:21:29 · 302 阅读 · 0 评论 -
OK6410A 开发板 (八) 120 linux-5.11 OK6410A cache 配置
arm32 linux 有 5种缓存策略,分别对应三大类 // 三大类 通过 cp15 中的C1寄存器的两个bit 来决定// P740 的 bit[2](C) 和 bit[3](W) 1. uncached 2. buffered 3. writethrough writeback writealloc 3 中的三种 可通过 内存页表中字段(P727)的 "TEX+C+B" 来 决定,参考 ARMv6 的 RF P711可用 early_param("cachepolicy", e原创 2022-01-04 15:24:30 · 378 阅读 · 0 评论 -
OK6410A 开发板 (八) 119 linux-5.11 OK6410A arm-linux的栈
硬件上:armv6 有 6个 R13R13_usr 和 R13_sys 是同一个还有 R13_svc R13_abt R13_und R13_irq R13_fiq软件上linux boot时有一个栈linux 各种异常处理有栈(5个异常模式,1个system模式) 对应多少个栈? svc mode 对应每个进程有一个栈? irq mode 是固定的栈? abort 呢? und 呢 ? fiq 呢? system mode 呢?linux 在 user mode 时 有.原创 2022-01-04 15:23:23 · 715 阅读 · 0 评论 -
OK6410A 开发板 (八) 118 linux-5.11 OK6410A arm异常原因及linux应用场景及结果
异常之后,会返回吗?应用程序会被杀掉吗?内核会崩溃吗?gic 还会一直中断吗? .section .vectors, "ax", %progbits.L__vectors_start: W(b) vector_rst W(b) vector_und W(ldr) pc, .L__vectors_start + 0x1000 W(b) vector_pabt W(b) vector_dabt W(b) vector原创 2021-12-31 14:47:54 · 450 阅读 · 0 评论 -
OK6410A 开发板 (八) 118 linux-5.11 OK6410A linux对arm异常处理的相同部分解析
.section .vectors, "ax", %progbits.L__vectors_start: W(b) vector_rst W(b) vector_und W(ldr) pc, .L__vectors_start + 0x1000 W(b) vector_pabt W(b) vector_dabt W(b) vector_addrexcptn W(b) vector_irq ...原创 2021-12-31 13:52:31 · 379 阅读 · 0 评论 -
OK6410A 开发板 (八) 117 linux-5.11 OK6410A Prefetch Abort 实例分析
流程vector_pabt vector_stub pabt, ABT_MODE, 4 __pabt_usr usr_entry pabt_helper bl CPU_PABORT_HANDLER // v6_pabort do_PrefetchAbort const struct fsr_info *inf = ifsr_info + fsr_fs(ifsr); inf->fn(addr, ifsr | FSR_LNX_PF, regs);原创 2021-12-31 13:29:51 · 705 阅读 · 0 评论 -
OK6410A 开发板 (八) 116 linux-5.11 OK6410A 匿名inode
kvm 中使用了 "匿名inode系统" 的 APIanon_inode_getfileanon_inode_getfd // anon_inode_getfd 封装了anon_inode_getfilefs/anon_inodes.c anon_inode_getfile anon_inode_getfdanon_inode_init anon_inode_mnt = kern_mount(&anon_inode_fs_type); anon_inode_inode =原创 2021-10-16 17:35:48 · 150 阅读 · 0 评论 -
OK6410A 开发板 (八) 117 linux-5.11 OK6410A linux系统调用
访问内核空间,linux提供了系统调用,分为两类, 1.文件系统相关的接口open,read,等file_operations中的接口(具体有什么,看具体文件系统) 2.进程控制 3.进程通信 4.内存管理 5.系统控制 reboot 6.用户管理如何查看当前运行或者编译的 linux系统中有多少个 系统调用,以及分别是什么 编译时 : cat System.mmap |grep " sys_" , 这里面不仅包括系统调用,还包括一些变量,还有弱符号 编译时 : arch/arm/ker原创 2021-09-13 13:15:17 · 210 阅读 · 0 评论 -
OK6410A 开发板 (八) 116 linux-5.11 OK6410A 用户空间虚拟内存布局
不同架构的 用户空间虚拟内存布局 不同, 以 arm 为例用户空间实际从0x10 000开始,从低到高有代码段,数据段,堆,栈用户空间范围为1000 -beff ffffvdsostacksigpageheap-mmap-ldlibcheap-brk数据段代码段vdso为了提供系统调用 ,x86提供了3类指令int/sysenter/syscall其中 sysenter和syscall相对于int来说,快一点而不管怎么快,都要从用户态切换到内核态新机制出现了,vs原创 2021-09-13 10:25:19 · 143 阅读 · 0 评论 -
OK6410A 开发板 (八) 115 linux-5.11 OK6410A 内存文件系统的挂载实例
mount -t tmpfs tmpfs /work/mount/struct mount 结构体$1 = (struct mount *) 0x816f5780 // struct mount 结构体 地址$2 = { // struct mount 结构体 内容 mnt_hash = { next = 0x0, pprev = 0x0 }, mnt_parent = 0x816f5780, // 表示挂载到了 /work/mount原创 2021-09-10 15:38:31 · 133 阅读 · 0 评论 -
OK6410A 开发板 (八) 114 linux-5.11 OK6410A各个文件系统的挂载
在 linux 启动过程中,挂载顺序如下 1. 内核 1. tmpfs // tmpfs 挂载到了 自己 ,有一个 根: dentry 和 inode , 对应一个 struct mount 2. rootfs // rootfs 挂载到了自己 ,有一个 根: dentry 和 inode , 对应一个 struct mount 3. bdev_cache_init 4. nsfs_init 5. devtmpfs // devtmpfs 挂载到了自己 ,有一个 根: dentry 和原创 2021-09-10 15:11:50 · 157 阅读 · 0 评论 -
OK6410A 开发板 (八) 113 linux-5.11 OK6410A rootfs 文件系统
struct file_system_type rootfs_fs_type = { .name = "rootfs", .init_fs_context = rootfs_init_fs_context, .kill.原创 2021-09-10 12:36:23 · 114 阅读 · 0 评论 -
OK6410A 开发板 (八) 112 linux-5.11 OK6410A tmpfs 文件系统 CONFIG_SHMEM=y & CONFIG_TMPFS=y
"CONFIG_SHMEM=y & CONFIG_TMPFS=y" 相较于 "CONFIG_SHMEM=y & CONFIG_TMPFS=n" 多了0a1,2> " Press <F1>, ? for help> 16a19,21> -shmem_acct_size> -shmem_file_operations> -shmem_get_inode17a23,25> -shmem_initxattrs原创 2021-09-09 20:22:11 · 215 阅读 · 0 评论 -
OK6410A 开发板 (八) 111 linux-5.11 OK6410A tmpfs 文件系统 CONFIG_SHMEM=y & CONFIG_TMPFS=n
公有部分▼ variables -shm_mnt▼ functions -__shmem_file_setup(struct vfsmount *mnt, const char *name, loff_t size, unsigned long flags, unsigned int i_flags) shmem_file_setup(const char *name, loff_t size, unsigned long flags) shmem_file_setup.原创 2021-09-09 20:18:39 · 154 阅读 · 0 评论 -
OK6410A 开发板 (八) 110 linux-5.11 OK6410A 从流程去熟悉文件系统1-挂载
挂载的时机有两种 1. 注册文件系统之后就挂载 2. 在用户空间挂载 2.1 fstab中挂载 2.2 用户手动用mount 命令挂载挂载流程变迁史在内核空间的挂载直接用 kern_mount挂载在用户空间的挂载 用 用户空间的 mount 函数 , mount 往下调用,陷入内核 ,SYSCALL_DEFINE5(mount这些接口都没变,变的是 内部实现老的文件系统中 仍然用 mount 成员 去 创建 super_block 成员当前(5.11)内核中file_system原创 2021-09-09 15:00:12 · 110 阅读 · 0 评论 -
OK6410A 开发板 (八) 109 linux-5.11 OK6410A tmpfs 文件系统 CONFIG_SHMEM=n & CONFIG_TMPFS=n
共同部分▼ variables -shm_mnt▼ functions -__shmem_file_setup(struct vfsmount *mnt, const char *name, loff_t size, unsigned long flags, unsigned int i_flags) shmem_file_setup(const char *name, loff_t size, unsigned long flags) shmem_file_setup.原创 2021-09-09 10:39:57 · 181 阅读 · 0 评论 -
OK6410A 开发板 (八) 108 linux-5.11 OK6410A ramfs 文件系统
fs/ramfs/inode.cstatic struct file_system_type ramfs_fs_type = { .name = "ramfs", .init_fs_context = ramfs_init_fs_context, .parameters = ramfs_fs_parameters, .kill_sb = ramfs_kill_sb, .fs_flags = FS_USERNS_MOUNT,原创 2021-09-07 19:14:35 · 110 阅读 · 0 评论 -
OK6410A 开发板 (八) 107 linux-5.11 OK6410A devtmpfs 文件系统
drivers/base/devtmpfs.cdevtmpfs 分为两种实现 1. 没有定义 CONFIG_TMPFS 2. 定义了 CONFIG_TMPFS两套实现没有定义 CONFIG_TMPFSstatic struct file_system_type internal_fs_type = { .name = "devtmpfs", .init_fs_context = ramfs_init_fs_context, .parameters = ramfs_fs_par原创 2021-09-07 19:12:28 · 162 阅读 · 0 评论 -
OK6410A 开发板 (八) 106 linux-5.11 OK6410A tmpfs 文件系统
tmpfs 是 内存文件系统(不对应磁盘文件),却有 page cache原创 2021-09-07 18:56:19 · 150 阅读 · 0 评论 -
OK6410A 开发板 (八) 105 linux-5.11 OK6410A 进程通信机制2 共享内存
共享内存 posix 提供一套 , XSI(systemv) 提供一套共享内存的实现 有很多种 1.posix mmap && open mmap 2.XSI(systemv) 3.memfd_create和fd跨进程共享 4.dma-buf共享内存实现方案有多种,posix共享内存是其中的一种posix共享内存是一种通信方式,其基于 mmap 和 (文件系统shmem)内存文件系统shmem 提供 fd 和 shmemfs 所有文件共享的 file_operati原创 2021-09-07 17:53:16 · 138 阅读 · 0 评论 -
OK6410A 开发板 (八) 104 linux-5.11 OK6410A mmap四种用途参数及扩展
mmap 的用途共享文件映射 一个应用场景就是两个进程共同读写一个文本文件,比如你用vim编辑保存后,再用cat命令查看私有文件映射 最典型的应用就是进程对动态链接库(比如libc.so)的使用共享匿名映射 一个典型应用是作为进程间通信机制的POSIX共享内存私有匿名映射 用来实现glibc中的mallocmmap 的函数及参数的排列组合 #include <sys/mman.h> void *mmap(void *addr, size_t length, i.原创 2021-09-07 17:46:44 · 146 阅读 · 0 评论 -
OK6410A 开发板 (八) 102 linux-5.11 OK6410A glibc提供的mmap的四种用途之一 共享匿名映射两种实例与共享文件映射dev-zero
共享匿名映射实例 mmap_negtivefd.c当使用参数 fd = -1 且 flags = MAP_ANONYMOUS | MAP_SHARED 时,创建的mmap 映射是共享匿名映射.共享匿名映射让相关进程共享一块内存区域,通常用于父子进程之间的通信.创建共享匿名映射有如下两种方式,这两种方法最终都调用shmem 模块来创建共享匿名映射 1. fd = -1,且 使用这个文件句柄来创建mmap(lags = MAP_ANONYMOUS | MAP_SHARED) . 在这种情况下,.原创 2021-09-04 17:16:21 · 254 阅读 · 3 评论 -
OK6410A 开发板 (八) 101 linux-5.11 OK6410A printf 在 glibc 和 linux 中的流程
glibcprintf ("hello World\n"); // 过程和 echo "hello World" > /dev/console 一致 ... write(1,"hello World\n",sizeof("hello World\n")); svc ... linuxSYSCALL_DEFINE3(write // fs/read_write.c ksys_write vfs_write file->f_op->write_iter/即原创 2021-08-31 14:05:04 · 121 阅读 · 0 评论 -
OK6410A 开发板 (八) 100 linux-5.11 OK6410A 内核空间虚拟内存布局
物理内存物理内存或大或小,(256M或512M或1G或2G或4G) , 这里取 PHY_MAX在这里 https://blog.csdn.net/u011011827/article/details/117413163 中的 "arm32 要不要配置 CONFIG_HIGHMEM" 讲述了arm物理内存的不同 情况下 需要的配置我们如果要配置 高端内存(虚拟内存概念) 则 我们会考虑 在 物理内存中 选择一个地址PHY_LINE(分界线) 往上 , 我们采取 一组 映射策略 往下原创 2021-08-18 13:09:04 · 211 阅读 · 0 评论 -
OK6410A 开发板 (八) 99 linux-5.11 OK6410A 文件访问实例mmap与read的比较
mmap 和 write 的实现他们两个的实现,其实重点都在 linux 中,所以要比较 他们的区别,要注意 以下流程 在 linux 内核中的区别 open - mmap - close open - write - close相同点都需要系统调用不同点数据拷贝次数 mmap 一次拷贝 mmap通过将磁盘文件映射到用户空间,当进程读文件时,发生缺页中断,给虚拟内存分配对应的物理内存,在通过磁盘调页操作将磁盘数据读到物理内存上,实现了用户空间数据的读取,整个过程只有一次内.原创 2021-08-14 17:24:40 · 239 阅读 · 0 评论 -
OK6410A 开发板 (八) 98 linux-5.11 OK6410A glibc提供的mmap与linux中的 sys_mmap的联动
按道理 用户空间通过 mmap 提出了需求,用户提出的需求分类 1.共享文件映射 2.私有文件映射 3.共享匿名映射 4.私有匿名映射 内核要满足需求,就要做事情 对于 需求 1 2 内核要做 A.虚拟地址的申请 B.物理地址的申请 C.映射关系的建立 D.磁盘文件内容加载到物理内存 对于 需求 3 4 内核要做 A.虚拟地址的申请 B.物理地址的申请 C.映射关系的建立 内核实际上是按照两个步骤做的这些内容 (不管是做ABCD还是ABC) 1. s原创 2021-08-14 17:17:19 · 87 阅读 · 0 评论 -
OK6410A 开发板 (八) 97 linux-5.11 OK6410A glibc提供的mmap的四种用途
glibc提供的mmap简介mmap 声明用户空间用的mmap函数,是glibc 提供的 声明通过 man mmap 查找 #include <sys/mman.h> void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);我们可以直接用mmap函数,也可以用封装mmap的函数mmap 的四个用途但总来的来说,mmap 有四个用途共享文件映射 一个应用场原创 2021-08-14 17:01:51 · 251 阅读 · 0 评论 -
OK6410A 开发板 (八) 96 linux-5.11 OK6410A文件的访问 open-mmap-close
用户空间用的mmap函数,是glibc 提供的 声明通过 man mmap 查找 #include <sys/mman.h> void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);mmap 其中的一个用途(共享文件映射/私有文件映射) 是 访问文件demo#include <sys/mman.h>#include <sys/stat.h>.原创 2021-08-14 16:40:11 · 110 阅读 · 0 评论 -
OK6410A 开发板 (八) 95 linux-5.11 OK6410A linux高速缓存
高速缓存是什么存储器在访问速度上有 金字塔等级架构高速缓存 其实就是缓存, 高速只是缓存的一个特性(高等级的内存相对于低等级的内存)缓存的理论分析源数据在哪个等级都有 在cache等级有 二进制指令 在物理内存等级有 二进制指令 在物理内存等级有 页表数据 在本地磁盘等级有 文件 在本地磁盘等级有 二进制指令 在网络磁盘等级有 文件而我们总是想把 源数据 放置到内存金字塔中更高一层(甚至两层的)位置 在cache等级有 二进制指令 , 想要将其缓存到 寄存器 在物理内存等级原创 2021-08-13 12:07:58 · 315 阅读 · 0 评论 -
OK6410A 开发板 (八) 94 linux-5.11 OK6410A 内存消费者角度 分析内存管理
内存管理单元面向消费者,做了以下事情 1. 物理内存的申请 2. 虚拟内存的申请 3. 物理内存与虚拟内存的映射内存管理单元向 消费者提供了以下接口 1. 内存申请 2. 内存释放内存申请 获取的句柄 有几种 1. 地址 2. struct page// 内核空间消费者一个交单的内存使用案例是 用户A直接在获取的地址上写数据 用户A不用了就直接调用api free一个复杂的内存使用案例是 用户A获取一个page,并将其挂载到链表上 其他用户B 相用,则 利用一些内核同步原创 2021-08-12 09:55:17 · 78 阅读 · 0 评论