首页
Python
Java
前端
数据库
Linux
Chatgpt专题
开发者工具箱
ok6410a专题
开发环境搭建 (二) OK6410A 开发环境 其他
网络 ifconfig eth0 10.10.11.117 netmask 255.255.255.0 uproute add default gw 10.10.11.254# cat /etc/resolv.conf nameserver 8.8.8.8 lcd // 驱动 , 无bootargs 增加 console=tty0busybox 启动的 /etc/inittab
阅读更多...
开发环境搭建 (一) OK6410A 开发环境 4 更改环境 OK
从sd卡中 的 u-boot(1.1.6) 启动u-boot load sd卡中 第1个分区(被格式化为fat16)的kernel(4.0),然后kernel 启动. // 如果要一个分区格式化为fat16,则这个分区的大小不能超过 2GB kernel 挂载 sd卡中的第2个分区(被格式化为ext3)为根文件系统,并执行 /linuxrc/linuxrc 作为 进程1 启动 u-boot 与
阅读更多...
开发环境搭建 (一) OK6410A 开发环境 3 更改环境 FAIL
从nand中 的 u-boot(1.1.6) 启动u-boot load sd卡中 第1个分区(被格式化为fat16)的kernel(4.0),然后kernel 启动.kernel 挂载 sd卡中的第2个分区(被格式化为ext3)为根文件系统,并执行 /linuxrc/linuxrc 作为 进程1 启动 u-boot 与 启动模式 uboot(1.1.6) 的配置 forlinx_nand_
阅读更多...
OK6410A 开发板 (三) 13 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 boot 详细解析2 relocate_vectors
从链接角度分析 u-boot.bin 的构成从运行的角度分析 u-boot.bin 前 64byte 的 relocate relocate_vectors 的实现 #ifdef CONFIG_HAS_VBAR// 虽然走的是这一套,但是找到的协处理器cp15的C12的实现(DDI0301H_arm1176jzfs_r0p7_trm.pdf)和下面的内容对不上// 那就分析 #else
阅读更多...
OK6410A 开发板 (三) 13 u-boot-2021.01 boot 解析 SPL 镜像运行部分 boot 详细解析
url : git@github.com:lisider/u-boot.gitbranch : ok6410acommit id : e63a4077ad3aea53107495b0b68b95e720fe6033config : ok6410a_mini_defconfig// 涉及的 .S .s .c 文件 有 67个 从入口出口来看 // 运行在 0x0c00 0
阅读更多...
OK6410A 开发板 (三) 12 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 boot 详细解析1
url : git@github.com:lisider/u-boot.gitbranch : ok6410acommit id : e63a4077ad3aea53107495b0b68b95e720fe6033config : ok6410a_mini_defconfig// 涉及的 .S .s .c 文件 有 223个 reset arch
阅读更多...
OK6410A 开发板 (三) 11 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 命令的执行
1.命令的注册2.命令的调用3.命令的执行4.命令的返回 1 命令的注册(以help为例) cmd/help.c10 static int do_help(struct cmd_tbl *cmdtp, int flag, int argc, 11 char *const argv[])
阅读更多...
OK6410A 开发板 (三) 10 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 cmdline
url : git@github.com:lisider/u-boot.gitbranch : ok6410acommit id : e63a4077ad3aea53107495b0b68b95e720fe6033config : ok6410a_mini_defconfig// 涉及的 .S .s .c 文件 有 223个 reset arch
阅读更多...
OK6410A 开发板 (六) 3 OK6410A linux-5.11 运行解析
url : git@github.com:lisider/linux.gitbranch : ok6410a-linux-5.11commit id : d64fe683e8d36e8fff882f1319de00f442fea1a8config : ok6410A_sdboot_mini_defconfig// 涉及的 .S .s .c 文件 有 824个 前提 uI
阅读更多...
OK6410A 开发板 (三) 9 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 bootcmd
url : git@github.com:lisider/u-boot.gitbranch : ok6410acommit id : e63a4077ad3aea53107495b0b68b95e720fe6033config : ok6410a_mini_defconfig// 涉及的 .S .s .c 文件 有 223个 reset arch
阅读更多...
OK6410A 开发板 (三) 8 u-boot-2021.01 boot 解析 SPL镜像运行部分
url : git@github.com:lisider/u-boot.gitbranch : ok6410acommit id : e63a4077ad3aea53107495b0b68b95e720fe6033config : ok6410a_mini_defconfig// 涉及的 .S .s .c 文件 有 67个 从入口出口来看 // 运行在 0x0c00 0
阅读更多...
OK6410A 开发板 (三) 7 u-boot-2021.01 boot 解析 u-boot 与linux配置部分
U-boot配置 make O=output ok6410a_mini_defconfig// 在配置的时候 不需要指定 ARCH(因为defconfig有写) 与 CROSS_COMPILE(因为现在并不需要,build的时候才需要)// 如果写了CROSS_COMPILE,会去检查CROSS_COMPILE , 然后build的时候还是需要写// 第一次用arm-gcc 的时刻, 编译
阅读更多...
OK6410A 开发板 (八) 38 linux-5.11 OK6410A 为什么需要这么多内存管理器
最后 用 memblock 不行吗?跳过 memblock 直接设置 buddy 不行吗memblock 和 buddy 的区别为什么 是 buddy 是 内存管理器 以及 其他管理器的基础为什么 buddy 建立了还要 建立 slab 和 vmalloc ?这几个内存管理器的特点是什么??? 第三阶段的消费者 第三阶段建立的是 buddyalloc_pages 申请到的都是 物理内存 连
阅读更多...
OK6410A 开发板 (八) 37 linux-5.11 OK6410A 内存管理第五阶段
vmallocvmalloc_initfor_each_possible_cpu(i) {// vfree_deferred 类型变量的 链表 和 工作任务 free_work// free_work用于vfree执行时延迟异步释放vmalloc内存struct vfree_deferred *p;...// vmap_block_queue 类型变量的链表和锁// vmap_block_que
阅读更多...
OK6410A 开发板 (八) 36 linux-5.11 OK6410A 内存管理第四阶段
D mm_init->mem_init返回 -> mm_init->kmem_cache_init返回----此时slab建立,开启了基于 buddy内存管理器时代 的 slab内存管理器时代 kmem_cache_init此过程以 slab 为基础,通过slab 的api kmem_cache_create , 创建 很多个 slab假设这么多个slab 为 一个集合A这么多slab 就是
阅读更多...
OK6410A 开发板 (八) 34 linux-5.11 OK6410A 内存管理第二阶段
B __turn_mmu_on符号 - setup_arch->paging_init->bootmem_init->memblock_allow_resize返回----此时memblock初始化完成,开启了基于虚拟内时代的 memblock内存管理器时代 流程 __turn_mmu_onmcr p15, 0, r0, c1, c0, 0 @ write control re
阅读更多...
OK6410A 开发板 (八) 33 linux-5.11 OK6410A 内存管理第一阶段
A arch/arm/kernel/head.S 中的 stext符号 - __turn_mmu_on 符号----此时开了MMU,开启了虚拟内存时代 流程 mrc p15, 0, r9, c0, c0// 将 cpuid 存储到 r9__lookup_processor_type// 根据 r9 中的值 ,获取 procinfo 并存储到 r5movs r10, r5// 获取
阅读更多...
OK6410A 开发板 (八) 32 linux-5.11 OK6410A 从内存角度简略分析整个启动过程
从 arch/arm/kernel/head.S 中的 stext 到 内核 rest_init 的 system_state = SYSTEM_SCHEDULING;分析 整个内存的启动过程至于 为什么不分析 arch/arm/boot/compressed/head.S 中的start 到 arch/arm/kernel/head.S 中的 stext因为 这个过程可以不跑的话, lin
阅读更多...
OK6410A 开发板 (八) 31 linux-5.11 OK6410A 感知linux的内存管理
linux 内存管理 , 我们感知三类内存管理系统内存管理 A内核线程内存管理 A用户进程内存管理内核态 A用户态 B这几种应该分为两类 , A BA 类共用一个内存(虚拟和物理)B 类每个进程有一个内存(虚拟和物理)另外,我们知道在硬件上 内存是 物理内存但在 linux 里面, 内存 除了物理内存 还包括 swap空间代表的空间(这里是将硬盘当作内存) // 可以从
阅读更多...
OK6410A 开发板 (八) 29 linux-5.11 OK6410A 主要内核线程解析
kthreadd这篇博客简述了 一下 系统内创建的 所有内核线程 // 进程 1 2 的 父进程为 0// 其他所有内核线程(被[]包括的) 父进程都是 kthreadd进程ID 所属用户 状态 COMMAND进程名 进程创建文件 进程创建函数// 1号用户进程1 root 1412 S {linuxrc} init //init/main.c kernel_t
阅读更多...
OK6410A 开发板 (八) 28 linux-5.11 OK6410A 进程之间的区别
进程是什么单核系统上同一时间内,只有一个进程(进程A)在跑,该进程占用了1.cpu的所有寄存器资源2.cp15协处理器的所有寄存器资源其他的进程都在内存中,也就是说 进程 B /进程 C 等 其实就是内存中的一组数据那么这组数据是什么这组数据 应该是 TCBTCB 从上到下包括什么1.pt_regs (18*4 B) // 用于 系统调用2.栈 8KB - 18*4 - (si
阅读更多...
OK6410A 开发板 (八) 28 linux-5.11 OK6410A 进程角度 fork的分析
fork 是 分叉的意思 , 一个进程分成两个进程之前实现了一个 多进程os,也必定实现了forkhttps://github.com/lisider/learn_os/tree/master/process看一下 fork 一个进程 XXX 的本质是什么1. 为 TCB 找一块空间2. 填充 sp 成员3. 在 sp 中压栈(压入入口地址,参数,cpsr)4. 将 TCB 插入 调度时 调
阅读更多...
OK6410A 开发板 (八) 99 linux-5.11 OK6410A 文件访问实例mmap与read的比较
mmap 和 write 的实现 他们两个的实现,其实重点都在 linux 中,所以要比较 他们的区别,要注意 以下流程 在 linux 内核中的区别open - addr=mmap(...); - addr[0] - closeopen - read - close 相同点 要将 "磁盘上的文件内容" 搞到 "用户能访问到的内存" 里面,需要关注以下数据及过程,mmap和read都做了这
阅读更多...
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.映射关系的建立内核实际上是按照两个步骤做的这些内容 (不管是
阅读更多...
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
阅读更多...
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/m
阅读更多...