自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(252)
  • 资源 (23)
  • 收藏
  • 关注

原创 0. linux-riscv内存管理120问大纲

内存管理之预备知识1.1 请简述内存架构中UMA和NUMA的区别1.2 CPU访问各级存储结构的速度是否一样?1.3 请绘制内存管理常用的数据结构的关系图,如mm_struct、VMA、vaddr、page、PFN、PTE、zone、paddr和pg_data等,并思考如下转换关系1.3.1 如何由mm_struct和vaddr找到对应的vma?1.3.2 如何由page和VMA找到vaddr?1.3.3 如何由page找到所有映射的VMA?1.3.4 如何由VMA和vaddr找出相应的p

2023-09-13 10:22:15 337

原创 5. Linux-riscv内存管理21-24问

MIN水位以下的内存,只能被紧急情况下的用户申请到,最著名的紧急用户莫过于PF_MEMALLOC用户,task_struct设置了这个标记表示忽略MIN水位。在__alloc_pages函数中如果进入慢速分配路径( __alloc_pages_slowpath()函数),在__alloc_pages_slowpath()函数中,会调用。在__zone_watermark_ok函数中,由于ATOMIC有表示ALLOC_HIGH,并且会设置ALLOC_HARDER, 则会触及到5/8*min的内存。

2023-09-12 09:57:37 400

原创 4. Linux-riscv内存管理17-20问

由于在prepare_alloc_pages()函数中会根据gfp-mask选取出合适的zone,在遍历zone时,会从刚选择的zone开始扫描zone,一般按照这个方向遍历ZONE_DEVICE->ZONE_MOVABLE->ZONE_HIGHMEM->ZONE_NORMAL->ZONE_DMA32->ZONE_DMA。zone有哪些类型:ZONE_DMA、ZONE_DMA32、ZONE_NORMAL、ZONE_HIGHMEM、ZONE_MOVABLE、ZONE_DEVICE。

2023-09-11 10:46:23 339

原创 2.5 opensbi: riscv: opensbi源码解析

从sbi_trap_handler()函数中,我们可以看到其中处理的中断只有IRQ_M_TIMER和IRQ_M_SOFT,处理函数分别为sbi_timer_process()和sbi_ipi_process()。函数作用:设置所有hart状态为SBI_HSM_STATE_STARTED。函数位置:lib/sbi/sbi_timer.c。函数位置:lib/sbi/sbi_hart.c。函数位置:lib/sbi/sbi_hsm.c。函数位置:lib/sbi/sbi_ipi.c。

2023-09-06 09:27:14 241

原创 riscv-linux中的多核启动流程

在注册sbi_ipi_event_create的时候ipi_ops_array[0]为ipi_smode_ops,ipi_ops_array[1]为ipi_halt_ops,异常处理函数sbi_trap_handler,判断为IRQ_M_SOFT,则调用软中断处理函数sbi_ipi_process,根据SBI_EXT_HSM和SBI_EXT_HSM_HART_START可以在opensbi找到对应的回调函数。找到cpu_ops_sbi结构体:sbi_cpu_start是我想找到的启动第二个核的函数。

2023-08-30 17:43:50 361

原创 2.4 opensbi: riscv: opensbi源码解析

当编程timer中断到来时,陷入m模式的异常,进入_trap_handler汇编函数,调用sbi_trap_handler()->sbi_timer_process(),在sbi_timer_process函数中触发一个s模式的timer中断,真正的timer中断处理函数是在s模式处理的。在aclint_mtimer_cold_init()函数中会初始化time_rd以及time_wr回调函数,64位系统为mtimer_time_rd64()函数和mtimer_time_wr64()函数。

2023-08-29 09:30:14 213

原创 2.3 opensbi: riscv: opensbi源码解析

设置hart 的状态,如果是冷启动hart设置为PENDING,其他的hart设置为STOPPED,状态信息放在hsm_data的state字段中。sbi_platform_early_init(plat, TRUE) 函数,调用对应平台设置的回调函数,一般都没有设置。冷启动的hart为每个hart的extra space空间分配一个struct sbi_hsm_data结构体。如果热启动的hart则开启ipi,并且判断字节的状态不是PENDING的话则进入wfi状态。

2023-08-21 11:01:40 176

原创 2.2 opensbi: riscv: opensbi源码解析

函数位置:firmware/fw_base.S函数作用:重置寄存器 除了ra, a0, a1 和a2关闭和清理所有中断设置每个hartid的栈地址设置mscratch指向sbi_scatch结构体设置异常处理函数_trap_handler(所有hart 都会去设置)设置参数为sbi_scatch结构体,调用sbi_init/*1. 重置寄存器 除了ra, a0, a1 和a2*/li ra, 0/*2. 关闭和清理所有中断*//*3. 设置每个hartid的栈地址*/

2023-07-25 20:45:36 329

原创 3. Linux-riscv内存管理17-24问

由于在prepare_alloc_pages()函数中会根据gfp-mask选取出合适的zone,在遍历zone时,会从刚选择的zone开始扫描zone,一般按照这个方向遍历ZONE_DEVICE->ZONE_MOVABLE->ZONE_HIGHMEM->ZONE_NORMAL->ZONE_DMA32->ZONE_DMA。在__alloc_pages函数中如果进入慢速分配路径( __alloc_pages_slowpath()函数),在__alloc_pages_slowpath()函数中,会调用。

2023-07-20 13:31:26 85

原创 2.1 opensbi: riscv: opensbi源码解析

在spl跳转到opensbi执行的时候,携带了三个参数,分别保存在a0,a1,a2,三个参数的含义:hartid、fdt地址(u-boot的dtb文件)和struct fw_dynamic_info结构体地址。在这里我们使用的是dynamic负载,所有fw_boot_hart汇编函数位于firmware/fw_dynamic.S。opensbi第一条执行的指令是从_start开始(firmware/fw_base.S).代码如下。在执行make的时候可以指定是否开启FW_PIC,,如果开启FW_PIC,

2023-07-19 18:26:51 1227

原创 2. Linux-riscv内存管理13-16问

从下表可以看出内核映像文件是被映射到了0xffffffff80000000-0xffffffffffffffff此区域范围内,因为内核映射,可以能随机映射到这个范围的任意地方。linux启动后回去扫描dts文件中的所有节点,其中也包括dts文件中定义的物理内存大小。0xffffffc000000000-0xffffffffffffffff为内核空间,0x0000000000000000- 0xffffffbfffffffff为用户空间。

2023-07-17 13:45:22 339 1

原创 1.2 SPL:riscv:uboot-spl源码解析

问题:如何根据struct spl_image_loader *drv找到对应的代码加载u-boot答:在common/spl/spl_mmc.c中,可以看到宏会将每个驱动函数定义的struct spl_image_loader结构体链接到__u_boot_list_2_spl_image_loader_1和__u_boot_list_2_spl_image_loader_3段中间。分析展开**SPL_LOAD_IMAGE_METHOD()**宏。

2023-07-16 09:29:27 849

原创 1.1 SPL: riscv: u-bool-spl源码解析

riscv spl分两部分,这是其中第一部分。

2023-07-15 13:26:38 450

原创 1. Linux-riscv内存管理1-11问

在匿名页面中:page->index表示在vma中的第几个物理页面(单位是PAGE_SIZE)。可能将vma->vm_pgoff 想成0的话,更好理解。

2023-07-11 09:41:47 298

原创 macbook m2 安装riscv-elf-gdb

macbook m2上远程单步调试linux内核。

2023-02-24 13:39:53 495 1

原创 进程基本概念

进程的运行状态程序计数器CPU寄存器,保存上下文内存管理信息统计信息文件相关的信息。

2022-09-25 20:09:54 1473

原创 Linux之进程管理

vfork()函数通过系统调用进入到linux内核,然后通过do_fork()函数来实现。clone()函数通过系统调用进入到Linux内核,然后通过do_fork()函数来实现。exit()系统调用吧退出码转换成内核要求的格式并且调用do_exit()函数来处理。vfork父进程会一直阻塞,知道子进程调用exit()或exec()为止。子函数会从复函数继承进程地址空间,包括。do_fork()函数有5个参数。fn就是线程的回调函数。clone()函数用来。常用的clone标志位。

2022-09-24 15:30:46 731

原创 yocto bsp-开发人员指南

对于每个配方,您可以在名为 LICENSE_FLAGS_ACCEPTED 的 local.conf 变量中指定匹配的许可证字符串。指定匹配的许可证字符串表示您同意该许可证。因此,构建系统可以构建相应的配方并将组件包含在映像中。如果您像往常一样构建,而不在 LICENSE_FLAGS_ACCEPTED 变量中指定任何配方,则构建将停止并为您提供您尝试包含在需要 LICENSE_FLAGS_ACCEPTED 变量中条目的映像中的配方列表。在其中输入适当的许可证标志后,重新启动构建以从中断处继续。

2022-09-02 17:41:11 1717

原创 risc-v 栈分析

下面查看该进程的内存映射(memory map),要查看GDB attach了的进程的内存映像,可以执行一下命令,执行该命令后,GDB就会显示与被调试的进程相对应的/proc//maps的信息。它表示栈空间,栈空间的顶端是0x3fff800000。然而,刚看到的栈指针的值却是0x3fff7ffff0,超出了栈的范围。访问地址超出了栈的范围,也就是说,发生了栈溢出。GDB等调试器的backtrace功能是通过搜索栈中保存的 信息来实现的。LR_c 指的是父函数调用子函数时,返回子函数的pc值。......

2022-08-26 12:40:21 1410

原创 riscv ELF bss段解析

在调试risc-v-bm的时候,实现malloc函数后,risc-v-bm出现错误。原因是在exec中,没有实现对bss段的初始化。怎么找到这个问题的呢?malloc代码_block_head变量是全局定义为0的。编译器将其放在了bss段。使用readelf可以读取每个段的信息。bss的type为NOBITS,flags为WA, WA意思是可写、需要分配内存,size为8,sh程序只定义了一个全局变量,变量值为0。注意:只有全局变量,且值为0才会放在bss段。读取bss的代码。......

2022-07-13 09:34:17 554

原创 riscv ASID疑问

最近几天调试自己写的risc-v的裸机操作系统,在写完malloc程序后,调用malloc程序分配内存时,最终调用到了sbrk,sbrk中分配vma或者扩大vma的容量。在程序真正是用内存时,触发缺页异常,映射真正的内存。free的时候,使用brk释放内存。在反复malloc/free的时候出现了程序跑飞了。经过不断的gdb和printk debug,发现释放的内存还可以被访问,而不是访问新映射的内存。经过测试,需要刷tlb。在每次map/unmap的时候刷新tlb。代码链接在risc-v-bm程序中

2022-07-13 09:17:15 436

原创 risc-v “access fault“和“page fault“区别

access fault简单的说access fault发生在PMP检测时。意味着处理器使用没有权限的内存。发生在至少有user模式的机器上,因为在machine模式下,处理器可以访问所有的内存。因此只有 M 模式的处理器可能无法通过 PMP 检查。此外,access fault可能是由于 PMA(物理内存属性)检查失败而导致的,这也适用于 M 模式。page fault当处理器试图使用它可能有权限使用的内存,但内存块尚未可用时,通常会产生page fault。page fault只能发生在具有

2022-05-26 17:39:27 1893

转载 RISCV WMO和TSO具体解决什么问题

本文给人解释RISCV的WMO和TSO模型具体解决什么问题。多核CPU的Cache问题很麻烦。多核不复杂,就是有多个执行体,各有各的动作而已。Cache也不复杂,就是访问内存的时候留一份下来,下次访问的时候直接从Cache(通常是SRAM之类更快的内存)中取而已。但把这两个简单的概念都放进来,这个问题就复杂了:在你的Cache中的数据,怎么能够让其他人知道呢?其他人按什么顺序知道呢?定义指令的时候这是个非常复杂的问题,规矩复杂了,代码没法写。规矩简单了,硬件做不出效率来。为此,我们先定义两个基本的概

2022-04-19 08:58:16 588

原创 12. 自制操作系统: risc-v ACLINT

ACLINT全称: Advanced Core LocalInterruptor1.介绍这个RISC-V ACLINT规范定义了一组内存映射设备,这些设备在一个多HART RISC-V平台上为每个HART提供处理器间中断(IPI)和定时器功能。这些hart级的IPI和定时器功能是在多hart RISC-V平台上运行的操作系统、引导加载程序和固件所必需的。SiFive核心本地中断器(CLINT)在RISC-V世界中被广泛采用,以提供机器级IPI和定时器功能。不幸的是,SiFive CLINT对于.

2022-04-15 15:15:47 1447

原创 11. 自制操作系统: risc-v Svnapot/Svpbmt标准扩展

Svnapot“Svnapot” Standard Extension forNAPOT Translation Contiguity,Version 1.0在Sv39、Sv48和Sv57中,当PTE的N位等于1时,此时的PTE表示一个区域内的连续虚拟地址到物理地址的转换,并且这个区域的PTE[5:0]比特位均相同,说明这个需要连续转换的页面的属性相同。此类范围必须是自然对齐的 2的N次方 (NAPOT) 粒度,大于基本页面大小。Svnapot扩展依赖于Sv39在地址转换...

2022-04-13 11:18:29 2569

原创 10.4 自制操作系统: risc-v 虚拟内存系统

Sv32全称: Page-Based 32-bit Virtual-Memory Systems当Sv32是被写入到satp.MODE时,s-mode是在一个32-bit的虚拟内存系统。在这种模式下,supervisor和user虚拟地址通过遍历基树页表转换为supervisor物理地址。当 SXLEN=32 时支持 Sv32,并且旨在包含足以支持现代基于 Unix 的操作系统的机制。Addressing and Memory Protection(寻址和内存保护)Sv32 实现支持

2022-04-12 10:35:35 2905 2

原创 10.3 自制操作系统: risc-v Supervisor寄存器satp

satp全称 Supervisor Address Translation and Protection Registersupervisor模式下的地址翻译和保护寄存器satp是一个SXLEN-bit 读写寄存器,控制s-mode下地址转换和地址保护。格式如下:此寄存器保存root page table的物理地址编号(PPN),例如supervisor物理地址被分割为4KiB;地址空间标识符(ASID),方便在每个地址空间的基础上进行地址转换。MODE字段,选择当前的地址.

2022-04-11 14:28:38 3395 1

原创 10.2 自制操作系统: risc-v Supervisor寄存器sscratch/sepc/scause/stval/senvcfg

Supervisor Scratch Register (sscratch)sscratch是一个SXLEN-bit 读写寄存器,在supervisor下使用。通常,在hart执行user代码时,sscratch是用于保存一个指向本地 supervisor上下文的地址。在trap处理开始时,sscratch与user 寄存器交换,提供一个初始的working寄存器。Supervisor Exception Program Counter (sepc)管理者异常程序计数器sepc是一个SXLEN-bi

2022-04-10 19:14:53 4332

原创 10.1 自制操作系统: risc-v Supervisor寄存器 timers/performace counters/scounteren

Supervisor Timers and Performance Counters管理器软件使用与用户模式软件相同的硬件性能监视工具,包括time、cycle和instret CSRs。具体实现中会提供修改counter值的机制。在实现中,必须依据real-time counter, time提供调度timer中断。Counter-Enable Register (scounteren)counter-enable寄存器scounteren是一个32位寄存器,它控制u模式下硬件性能监控计数器的可

2022-04-08 20:35:11 766

原创 10. 自制操作系统: risc-v Supervisor寄存器sstatus/stvec/sip/sie

sstatus 全称:Supervisor Status Registersstatus寄存器是一个SXLEN-bit读写寄存器,跟踪处理器当前运行状态。 字段名称 bit 含义 功能 SSP 8 0:表示之前的mode为U-mode 记录hart在进入s-mode前的执行模式。 当执行 SRET 指令从trap...

2022-04-05 13:17:30 4610 3

原创 9. 自制操作系统: risc-v内存相关介绍

Memory Ordering RVWMO内存一致性模型 RISC-V使用一种名为“RVWMO”(RISC-V弱内存排序, RISC-V Weak Memory Ordering)的内存模型,旨在为架构师提供灵活性,以构建高性能可伸缩的设计,同时支持易于处理的编程模型.在RVWMO下,从同一hart上的其他内存指令的角度来看,运行在单个hart上的代码似乎是按照顺序执行的,但来自另一个hart的内存指令可能会观察到第一个hart上的内存指令以不同的顺序执行。因此,多线程代码可能需要显式的同步.

2022-04-02 17:25:05 4787

原创 8.7 自制操作系统: risc-v Machine寄存器mscratch/mepc/mcause/mtval

mscratch 全称: Machine Scratch Register,不晓得这里scratch该如何翻译,姑且就翻译成机器模式临时存储寄存器。mscratch寄存器是专用于机器模式的mxlen位读/写寄存器。通常,它用于保存指向机器模式hart-本地上下文空间的指针,并在进入m模式trap处理程序时与用户寄存器进行交换。 mepc 全称:机器模式异常程序计数器( Machine Exception Program Counter)mepc是一个MAXLEN-bit的...

2022-04-01 17:45:32 5748

原创 8.6 自制操作系统: risc-v Machine寄存器mcounteren/mcountinhibit

mcounteren 全称:机器计数器使能寄存器( Machine Counter-Enable Register)counter-enable寄存器mcounteren是一个32-bit的寄存器,控制硬件性能监视器couters作用域下一个最低特权模式。此寄存器仅控制可访问性。读取或写入这个寄存器的行为不会影响底层计数器,即使在不可访问时,这些计数器也会继续增加。当清除mcounteren寄存器中的CY、TM、IR或HPMn位时,当以s模式或u模式执行时,试图读取周期、时间、in...

2022-03-31 15:46:59 1030

原创 8.5 自制操作系统: risc-v Machine Hardware Performance Monitor

Hardware Performance MonitorM-mode包括一个基本的硬件性能监控设施。mcycle CSR计算hart运行的处理器内核所执行的时钟周期数。minstret CSR计数器统计已经执行的指令数量(The minstret CSR counts the number of instructions the hart has retired "参考:Instructions Retired Event")。在所有的RV32和RV64系统上,mcycle和minstret都是64..

2022-03-29 14:48:40 1255

原创 OpenSBI atomic_xchg函数分析

atomic_xchg函数原型long atomic_xchg(atomic_t *atom, long newval){ /* Atomically set new value and return old value. */#ifdef __riscv_atomic return axchg(&atom->counter, newval);#else return xchg(&atom->counter, newval);#endif}

2022-03-24 08:59:13 1273

原创 OpenSBI 汇编启动流程

OpenSBI启动时,第一条执行的指令是_start函数,在fw_start.S文件中,下图为此文件的执行流程:在调用sbi_init前,会设置好scratch寄存器和scratchspace中的数据,scratchspace填充的部分数据是由结构体struct sbi_scratch描述的。每个hart都由一个sbi_scratch结构体来描述。结构体如下:/** Representation of per-HART scratch space */struct sbi_scra...

2022-03-22 14:43:54 2524

原创 OpenSBI ELF rela.dyn和.dynsym动态链接过程

在OpenSBI中重定位分成了两种,根据是否配置了FW_PIC宏来区分,配置了FW_PIC,即本文描述的rela.dyn和.dynsym的动态链接。未配置FW_PIC是加载地址和链接地址不相等情况下的代码拷贝重定位。rela.dyn.rela.dyn节是什么节呢?该节保存的是重定位信息,数据内容是包含带有显式加数的重定位条目,每个条目固定大小(24个字节)。话又说回来,什么是重定位?这里引用oracle网站的解答:重定位是连接符号引用与符号定义的过程。例如,程序调用函数时,关联的调用

2022-03-21 11:12:10 2437

原创 OpenSBI payload

uboot U-Boot作为OpenSBI的有效负载 U-Boot是一个开源的主引导加载程序。在嵌入式环境中,它可以用作第一和/或第二阶段引导加载程序。在OpenSBI环境中,U-Boot可以被指定为OpenSBI固件的负载,成为OpenSBI固件执行之后的启动阶段。 构建和生成U-Boot映像 关于如何从U-Boot提示符构建U-Boot映像和引导高级操作系统的详细说明,请参阅U-Boot构建文档。Linux Linux作为OpenSBI的直接有效负载 OpenSBI

2022-03-16 21:54:16 1763

原创 OpenSBI qemu risc-v virt machine平台

QEMU RISC-V Virt Machine PlatformQEMU RISC-V Virt Machine 是为 RISC-V 软件开发和测试而创建的虚拟平台。它也被称为 QEMU RISC-V VirtIO 机器,因为它使用 VirtIO 设备进行网络、存储和其他类型的 IO。要构建特定于平台的库和固件映像,在顶层的make命令使用PLATFORM=generic参数.Platform OptionsQEMU RISC-V Virt Machine平台没有任何平台特定的选项。编

2022-03-16 21:46:42 2952

原创 OpenSBI平台固件的区别

OpenSBI平台固件 OpenSBI提供了针对特定平台的固件构建。支持不同类型的固件来处理不同平台早期启动阶段的差异。所有的固件都会根据平台特定的代码以及OpenSBI通用库代码执行平台硬件的相同的初始化过程。所支持的固件类型将因平台早期引导阶段传递的参数的处理方式以及固件之后的引导阶段的处理和执行方式而有所不同。早期的启动阶段将通过RISC-V CPU的以下寄存器传递信息: hardid通过a0寄存器传递。 通过a1寄存器在内存中的设备树blob地址。地址必须对齐到8个字节。..

2022-03-16 13:35:25 1323 1

ARM64架构面试20题目答案.pdf

ARMv8/ARM64架构20道面试题以及答案

2021-08-03

tcp_header_state.pdf

一图看懂TCP协议头和TCP各种状态

2021-07-29

sd卡驱动框架.pdf

高清sd卡驱动框架思维导图pdf

2021-07-29

TCP拥塞算法reno_bic_cubic概述与对比.pdf

TCP拥塞算法reno/bic/cubic概述与对比

2021-07-28

rtp2jpegAndjpeg-9a

rtp2jpegAndjpeg-9a.rtp传输jpeg图片到vlc实时播放

2015-01-08

tcp/ip详解卷1卷2卷3高清pdf

tcp/ip详解卷1卷2卷3高清pdf

2014-10-15

基于P2P网络应用的NAT穿越方案的分析与设计

需要安装caj程序才能看。基于P2P网络应用的NAT穿越方案的分析与设计

2014-09-27

基于H_264的嵌入式无线视频传输系统的设计(硕士论文 )

需要安装caj程序才能看。基于H_264的嵌入式无线视频传输系统的设计(硕士论文 )

2014-09-27

linux下tcp穿透NAT源代码(git提交信息)

运行服务器程序./server 然后运行client 输入server Ip 输入client名字(不能超过10字符) 然后输入hole [另一个client的名字,名字后面必须加一个空格,不然程序崩溃]。

2014-09-16

Linux_init进程详解

免费好资料 不用说 看了就知道

2013-09-20

编译好的mini2440-uboot

编译好的mini2440-u-boot

2013-01-19

mini2440无盘启动(服务器NFS配置-支持NFS内核编译-根文件构建-u-boot烧写)

mini2440无盘启动,配置NFS服务器,编译支持NFS内核,u-boot烧写,全部讲解

2012-12-04

linux内核驱动笔记-尚观

由浅入深 了解驱动 内核 是个好东西 给大家分享哈

2012-12-02

mini2440无盘启动(服务器配置-内核编译-文件系统制作-u-boot烧写)

mini2440无盘启动,包含了服务器NFS配置,支持NFS内核编译,根文件系统制作,u-boot参数设置,u-boot烧写,一气呵成。

2012-11-30

busybox-1.13.3-mini2440

busybox-1.13.3 mini2440

2012-11-30

Linux+新手最全10本培训书籍集-到高手必备

Linux+新手最全10本培训书籍集-到高手必备,看了就知道

2012-11-18

寄存器位查看小工具

寄存器位查看小工具,二进制十进制,十六进制转换必备工具

2012-11-18

SSH Secure Shell Client 3.2.9

不需要注册码,安全的secureCRT+cutefpt,一次安装就可以用两个软件。

2012-11-18

索尼LCD_X35时序图手册

索尼LCD_X35时序图手册

2012-11-18

索尼LCD_X35电路图

索尼——LCD_3.5寸屏幕电路图。。。。。。。。。。

2012-11-18

LCD_x35电路图

LCD—x35 索尼3.5寸屏幕电路图,好资源共享

2012-11-18

module_param

module_param内核函数的意思

2012-11-06

空空如也

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

TA关注的人

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