# arm_study **Repository Path**: yfuxzpskbr/arm_study ## Basic Information - **Project Name**: arm_study - **Description**: 学习ARM做的笔记和代码 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2021-11-17 - **Last Updated**: 2022-11-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 设备驱动程序 `proc`目录中包含系统运行时的动态信息,可以使用`write/read`进行访问 ## 该目录下的数字文件夹是对应一个进程 书写源程序 ```cpp #include #include #include #include int main() { //打印进程id printf("pid = %d\n", getpid()); //死循环让进程不结束 while (1) ; return 0; } ``` 然后编译执行:指令 ```cpp gcc my.c -o my ./my ``` 运行结果: ```cpp yfux@yfux-Lenovo:01$ gcc my.c -o my yfux@yfux-Lenovo:01$ ./my pid = 11595 ``` 此时查看`proc`目录下是否存在以`11595`为名的文件夹: ```shell ls /proc|grep 11595 ``` 结果如下: ```shell yfux@yfux-Lenovo:~$ ls /proc | grep 11595 11595 yfux@yfux-Lenovo:~$ ``` 说明在proc目录下存在这样一个以进程号为名的文件夹,我们进入这个文件夹查看该文件夹下的文件: ```shell cd /proc/10256 ls -a ``` 结果如下: ```shell yfux@yfux-Lenovo:~$ cd /proc/10256 yfux@yfux-Lenovo:~$ ls -a . coredump_filter limits numa_maps schedstat task .. cpu_resctrl_groups loginuid oom_adj sessionid timens_offsets arch_status cpuset map_files oom_score setgroups timers attr cwd maps oom_score_adj smaps timerslack_ns autogroup environ mem pagemap smaps_rollup uid_map auxv exe mountinfo patch_state stack wchan cgroup fd mounts personality stat clear_refs fdinfo mountstats projid_map statm cmdline gid_map net root status comm io ns sched syscall ``` 其中 - `cwd`:是程序的进程映像信息 ```shell yfux@yfux-Lenovo:10256$ cd cwd yfux@yfux-Lenovo:cwd$ ls -a . .. my my.c yfux@yfux-Lenovo:cwd$ cat my.c #include #include #include #include int main() { //打印进程id printf("pid = %d\n", getpid()); //死循环让进程不结束 while (1) ; return 0; }yfux@yfux-Lenovo:cwd$ ``` - `fdinfo`:是程序打开的文件,默认一定打开0(标准输入),1(标准输出),2(标准错误) ```shell yfux@yfux-Lenovo:fd$ cd .. yfux@yfux-Lenovo:10256$ cd fd yfux@yfux-Lenovo:fd$ ls 0 1 103 2 20 29 30 31 32 33 38 39 40 41 42 43 44 45 47 50 ``` ## `ioports`文件 该目录下的`ioports`文件,存放的是端口号信息,第一列显示的端口范围,第二列显示了哪些端口 **指令:**`cat /proc/ioports` **结果:** ```shell 0000-0000 : PCI Bus 0000:00 0000-0000 : dma1 0000-0000 : pic1 0000-0000 : timer0 0000-0000 : timer1 0000-0000 : keyboard 0000-0000 : PNP0C09:00 0000-0000 : EC data 0000-0000 : keyboard 0000-0000 : PNP0C09:00 0000-0000 : EC cmd 0000-0000 : rtc_cmos 0000-0000 : rtc0 0000-0000 : dma page reg 0000-0000 : pic2 0000-0000 : dma2 0000-0000 : fpu 0000-0000 : PNP0C04:00 0000-0000 : PNP0C09:00 0000-0000 : iTCO_wdt 0000-0000 : pnp 00:00 0000-0000 : PCI conf1 0000-0000 : PCI Bus 0000:00 0000-0000 : pnp 00:00 0000-0000 : ACPI PM1a_EVT_BLK 0000-0000 : ACPI PM1a_CNT_BLK 0000-0000 : ACPI PM_TMR 0000-0000 : ACPI CPU throttle 0000-0000 : ACPI PM2_CNT_BLK 0000-0000 : pnp 00:01 0000-0000 : ACPI GPE0_BLK 0000-0000 : pnp 00:05 0000-0000 : PCI Bus 0000:5c 0000-0000 : 0000:5c:00.0 0000-0000 : PCI Bus 0000:57 0000-0000 : PCI Bus 0000:01 0000-0000 : 0000:01:00.0 0000-0000 : 0000:00:17.0 0000-0000 : ahci 0000-0000 : 0000:00:17.0 0000-0000 : ahci 0000-0000 : 0000:00:17.0 0000-0000 : ahci 0000-0000 : PCI Bus 0000:03 0000-0000 : PCI Bus 0000:2d 0000-0000 : 0000:00:1f.4 0000-0000 : i801_smbus ``` ## `cpuinfo`文件 该目录下的`cpuinfo`文件,存放的是`CPU`的信息 **指令:**`cat /proc/cpuinfo` **结果:** ```shell processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 141 model name : 11th Gen Intel(R) Core(TM) i5-11400H @ 2.70GHz stepping : 1 microcode : 0x32 cpu MHz : 2700.000 cache size : 12288 KB physical id : 0 siblings : 12 core id : 0 cpu cores : 6 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 27 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l2 invpcid_single cdp_l2 ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves split_lock_detect dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg avx512_vpopcntdq rdpid movdiri movdir64b fsrm avx512_vp2intersect md_clear flush_l1d arch_capabilities vmx flags : vnmi preemption_timer posted_intr invvpid ept_x_only ept_ad ept_1gb flexpriority apicv tsc_offset vtpr mtf vapic ept vpid unrestricted_guest vapic_reg vid ple pml ept_mode_based_exec tsc_scaling bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs bogomips : 5376.00 clflush size : 64 cache_alignment : 64 address sizes : 39 bits physical, 48 bits virtual power management: ``` ## `meminfo`文件 该目录下的`meminfo`文件,存放的是内存的信息 设备驱动是一个函数集合:包含了许多调用入口,比如`read`、`write`、`open`、`close`等 `kill -9 pid`强制杀死进程 # `BootLoader`系统加载程序 ## 嵌入式系统的分层结构 `BootLoader-->Kernel-->File System-->Application` ## `BootLoader`的作用 ## `BootLoader`的基本结构——以`vivi`为例,每个目录的大致作用 ## `BootLoader`的运行顺序 从`head.s-->main.c`,也就是从CPU芯片初始化(从看门狗开始)-->运行内存的初始化-->通用程序输入输出结构接口芯片-->初始化MDT(相当于硬盘的NANDFLASH)-->运行`head.s`-->建立页表-->运行`main.c`-->装入内核-->操作系统开始运行 # `Shell`命令解释器 是操作系统内核与用户程序之间的接口之一(系统调用) 内核构成(文件子系统,进程管理子系统,驱动程序等等) shell用户命令执行的程序实现 在Linux中,默认的命令解释器是bash shell脚本程序中所包含的元素=可执行的命令/程序+语法结构(控制命令运行的先后逻辑),虽然,shell脚本程序是文本文件,但是其中的文本是可执行的。 `&`可以使一个进程在后台运行 # Shell编程 模式匹配: - `${#var}`:求出var的长度 - `${var#pattern}`:移除var最小的前缀 - `${var##pattern}`:移除var最大的前缀 - `${var%pattern}`:移除var最小的后缀 - `${var%%pattern}`:移除var最大的后缀 # 考试大纲 题型:名词解释、简答、程序设计 8、11、12、13、15讲不考 ## 第一章 ### 什么是嵌入式系统 ### 嵌入式系统分类:中端、高端 ## 第二章 ### 哈佛结构和冯诺依曼结构的差别 ### `ARM7TDMI`内核特点 ### `ARMCOrtex`内核特点 ### ARM流水线 - ARM7三级流水线 - ARM9五级流水 - ARM10六级流水 ### ARM的工作模式和工作状态 - ARM5种异常工作模式 - ABT - UND - IRQ - FIQ - ARM处理器支持的7种模式 - 两种工作状态:Thumb和ARM:[十分] ## 第三章 ### ARM的存储体系:金字塔图 ### 片上存储器的用法 ### 存储管理单元MMU ### 保护单元 ### ARM异常中断 ### 三种总线规范 - AHB - ASB - APB ## 第四章 ### 嵌入式硬件调试结构 ### 嵌入式系统调试技术概貌:目标机-宿主机,目标机是开发板,宿主机是PC ### JTAG调试 ### JLINK调试 ### 软件断点和硬件断点 ## 第五章 ### ARM指令与X86指令的区别:不同类 ### ARM和Thumb的相同和不同:同类 ### ARM处理器寻址方式:8种 - 寄存器寻址 - 立即寻址 - 寄存器偏移寻址 - 寄存器间接寻址 - 基址寻址 - 多寄存器寻址 - 堆栈寻址 - 相对寻址 ## 第六章 考程序设计 ## 第七章:20分 ### ELF文件格式:三种格式 - .o文件 - 可执行文件 - .so文件 ### ELF文件格式的两种视图 - 链接视图 - 执行视图 ### ELF格式双重特性 ### 程序节区头表 ### ARMELF文件格式的段结构 ### 映像文件加载视图和执行视图 ## 第九章 ### 闪存 - Nor Flash - Nand Flash ### I2C总线结构