自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(55)
  • 资源 (23)
  • 收藏
  • 关注

原创 awk 与 python处理文件效率对比

awk代码简单已经秒杀python了,运行效率如下  python 日志文件大小  内容 统计后输出 awk 不愧为神器awk 代码:#!/usr/bin/awk -fBEGIN{ while (getline "/opt/logs/mobile/hotelorder/stastic.log"

2015-05-16 20:42:38 1958

原创 內核lru链表

struct zone  --->     struct zone_lru {         struct list_head list;           } lru[NR_LRU_LISTS];enum lru_list {LRU_INACTIVE_ANON = LRU_BASE,LRU_ACTIVE_ANON = LRU_BASE + LRU_ACTIVE,LRU

2013-07-23 09:02:13 173

linux情景分析之中断有感

之前一直被x86体系的各种门锁困扰,比如中断门,陷阱门等等。不知道这些和irq_desc的关系。 linux初始化过程中,会完成终端机制的初始化,中断向量表IDT的初始化尤为重要。主要是调用trap_init和init_IRQ两个函数。其中trap_init主要是对一些系统保留的中断向量的初始化,主要是中断向量表前20个陷阱门,都是保留给异常处理的。void __init trap

2013-03-06 22:30:51 247

原创 网口驱动有感

网口驱动架构如上图,很清晰。一直怀疑为什么,在dev目录下找不到网口节点。现在明白了,设备节点一般是给用户层访问的。而根据上图,可得知,网口驱动主要是被网络协议栈调用,而用户层不会直接操作网口驱动,而是一层层的协议栈。不同的网络控制器的驱动都是大致相同的,像dm9000的,static struct platform_driver dm9000_driver = {.driver

2013-01-16 16:12:56 210

原创 笔记

Linux platform driver 机制和传统的device driver机制(即:通过 driver_register 函数进行注册)相比,一个十分明显的优势在于platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序中用使用这些资源时,通过platform device提供的标准接口进行申请并使用。       platform 是一个虚拟的地址总线,相比 PCI

2013-01-07 10:10:29 94

原创 内核线程是怎么运行

pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)  通过这个函数可以创建内核线程,运行一个指定函数fn。但是这个fn是怎么运行的了?pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags){ struct

2013-01-06 11:38:33 1159

原创 kenel thread

再來就是本文主要談的kthreaddTask,這是在LinuxKernel 2.6所引入的機制,在這之前要產生KernelThread需直接使用函式kernel_thread,而所產生的KernelThread父行程會是當下產生KernelThread的行程(或該父行程結束後,改為initTask(PID=1)).在kthreadd的機制下,UserMode與KernelMode Task

2012-12-27 08:36:34 156

原创 编译内核

配置内核时,切忌只改。config或者是configs目录下的默认config,在它们中加了什么配置,一定要在相应的Kconfig文件中加入。这个是必须的,生成配置文件要读Kconfig,这个流程必须有。

2012-12-11 17:48:57 84

原创 linux驱动架构体会

刚开始学习ldd3时,驱动架构以为是围绕这device,device_driver,bus,等等建立起来的。确实是这样,通过这样在内核建立了一个驱动框架去管理它们。然而却错误的理解为实际的驱动硬件的工作也是在那几个结构上,大错特错。举个例子,像块设备驱动,操作硬件工作是在gendisk结构里面实现的,通过register_disk,则可以根据disk里面的设备号在内核建立起device,sysfs

2012-11-20 16:50:53 2348

原创 内核随笔

经常碰到一个函数或者是变量,定义的到处都是,尽管他们都被编译,要看清楚,很多都是static,往往只有一个非static。只是一种技巧。/sys/文件系统里面,/sys/devices里面包含内核里面的设备,但driver却没找到,后来在/sys/bus相应总线里面发现,这个设计诡异。/sys/class里面只是方便用户,里面有所有设备的链接信息。

2012-10-29 11:20:14 78

原创 arm嵌套中断

arm异发生时,硬件会自动保存pc到异常模式下的lr,以及保存cpsr到spsr,把cpsr设置为相应异常模式,把pc设置为相应异常处理程序的入口。这个问题就来了,如果发生嵌套中断,那么会覆盖之前中断的lr,无法返回。为了避免这个问题,在执行ISR之前,会进行模式切换,切换到SVC货系统模式。在相应的模式下构造一个帧,就像一般的函数调用栈帧,保存现场,保存lr,sp等等。接着调用ISR,如果发

2012-10-28 10:25:22 1000

转载 workqueue

1. 什么是workqueueLinux中的Workqueue机制就是为了简化内核线程的创建。通过调用workqueue的接口就能创建内核线程。并且可以根据当前系统CPU的个数创建线程的数量,使得线程处理的事务能够并行化。workqueue是内核中实现简单而有效的机制,他显然简化了内核daemon的创建,方便了用户的编程.工作队列(workqueue)是另外一种将工作推后执行的形式.工

2012-10-21 20:40:04 815

原创 文件系统 随笔

在打开一个文件时,最后往往到磁盘里面寻找inode读入,这个时候会调用相应文件系统的inode的i_ops里面的lookup方法,在ext3中则是ext3_lookup方法,ext3_lookup会调用struct inode *ext3_iget(struct super_block *sb, unsigned long ino),用超级块来获得指定的inode节点返回,并初始化vfs的inod

2012-10-15 19:48:24 142

转载 block层

sys_mount和sys_open-->blkdev_open中都要涉及block_device字段,今天分析sys_mount和块设备层 static int __init genhd_device_init(void) {          int err;          bdev_map = kobj_map_init(base_probe, &block_subsys

2012-10-11 11:09:46 140

原创 MMU设置问题

我是运行裸板程序中,设置mmu。首先运行start.s,刚开始搬运代码到0x50000000。然后将整个代码的虚拟地址映射到0x50000000上,再跳转到绝对地址上运行。结果在跳转后,出现reset复位。设置MMU后,考虑的东西很多啊还有个问题//cp15_set_vectaddr((unsigned long)(0x50000000)); 很奇怪这里设置

2012-10-07 21:34:25 747

转载 arm位置无关性设计

引言  基于位置无关代码PIC(PositionIndependent Code)的程序设计在嵌入式应用系统开发中具有重要的作用       尤其在裸机状态下开发Bootloader程序及进行内核初始化设计;利用位置无关的程序设计方法还可以在具体应用中用于构建高效率动态链接库,因而深入理解和熟练掌握位置无关的程序设计方法,有助于开发人员设计出结构简单、清晰的应用程序本文首先介绍位

2012-10-06 17:02:08 206

原创 linux内核链接脚本

linux内核链接脚本是vmlinux.lds.S而不是vmlinux.lds,后者是根据前者的输出,因为前者有很多的宏定义,后者则是完整版。make oldconfig的作用,首先可以备份.config,生成.config.old。其次如果刚从别的内核里面拷贝一个.config到该内核,针对原来版本内核的配置文件设置来配置新版本的内核。新版内核中和原来版本内核同时存在的配置项不变,但是新添加

2012-09-28 14:20:42 105

原创 linux内核链接脚本

linux内核链接脚本是vmlinux.lds.S而不是vmlinux.lds,后者是根据前者的输出,因为前者有很多的宏定义,后者则是完整版。make oldconfig的作用,首先可以备份.config,生成.config.old。其次如果刚从别的内核里面拷贝一个.config到该内核,针对原来版本内核的配置文件设置来配置新版本的内核。新版内核中和原来版本内核同时存在的配置项不变,但是新添加

2012-09-28 09:56:41 127

转载 gnu arm汇编

第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针、设置页表、操作 ARM的协处理器等。初始化完成后就可以跳转到C代码执行。需要注意的是,GNU的汇编器遵循AT&T的汇编语法,可以从GNU的站点(www.gnu.org)上下载有关规范。一. Linux汇编行结构任何汇编行都是如下结构:[:] [}

2012-09-05 21:35:41 96

转载 高端内存疑惑

高端内存是指物理地址大于 896M 的内存。高端内存含义为:线性地址空间 PAGE_OFFSET + 896M 至4G的最后128M线性地址对于这样的内存,无法在“内核直接映射空间”进行映射。为什么?因为“内核直接映射空间”最多只能从 3G 到 4G,只能直接映射 1G 物理内存,对于大于 1G 的物理内存,无能为力。实际上,“内核直接映射空间”也达不到 1

2012-09-01 15:10:26 1681

原创 linux内核页表

内核里面所有的页表项内容都是物理地址Linux使用段页表作为一级页表,粗页表作为二级页表的基址页表。段页表的标志位定义如下:页表创建函数调用图中给出了alloc_init_section在页表创建中所处的实现位置,本质上它是与alloc_init_pte并行的函数,alloc_init_section被用来创建段页表(

2012-08-30 16:32:18 177

转载 Linux用户空间与内核空间

Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。Linux内核地址映射模型x86 CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。

2012-08-30 15:39:57 51678 16

原创 快速启动

1 概述之所以称为UBOOT方式快速启动,是因为相对于内核方式快速启动,在快速启动的过程中只需经历UBOOT的启动便可进行系统状态的恢复,从而跳过内核的初始化过程。UBOOT方式快速启动的实现是在内核方式快速启动技术的基础上,修改系统映像格式和写入方式,并在UBOOT中添加bootss命令,调整UBOOT的启动流程。2 UBOOT方式快速启动原理2.1 系统启动流程的更改UBO

2012-08-23 10:39:11 515

原创 kobject分析

关于网上的kobject的分析,有意大堆,一下仅作为自己的感悟记录。一个kobject在/sys里面表现是一个目录,而它的属性则表示为该目录里面的文件,可以访问。struct kobject {const char *name;struct list_headentry;struct kobject*parent;struct kset *kset;st

2012-08-15 16:23:18 1401

原创 mtd层次分析

关于mtd的层次分析,网上一大堆,先看看网上怎么说的.MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱 动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。MTD的所有源代码在/drivers/mtd子目录下。我将CFI接口的MTD设备分为四层 (

2012-08-13 14:55:19 1465

原创 linux内核启动设备探测过程

前段时间研究nandflash驱动,很好奇,到底是怎么探测nandflash,以及驱动等等。好吧,现在开始不说了。首先在板级文件里面必须添加设备信息,static struct resource s5pv210_nand_resource[] = {[0] = {.start = 0xB0E00000,.end   = 0xB0E00000 + 0x00100000 - 1,

2012-08-12 11:54:26 1878

原创 块设备驱动程序笔记

register_blkdev(sbull_major, "sbull");//该函数只是根据设备号在内核块设备表major_names里面注册一下,没有其他。定义一个块设备  struct sbull_dev { 71         int size;                       /* Device size in sectors */ 72         u8

2012-08-10 09:31:19 85

原创 printk分析

本人一直好奇怎么通过printk输出信息到串口,于是分析源码。asmlinkage int printk(const char *fmt, ...){va_list args;int r;#ifdef CONFIG_KGDB_KDBif (unlikely(kdb_trap_printk)) {va_start(args, fmt);r = vkdb_pri

2012-08-03 10:04:00 1623

原创 设备模型问题

register_chrdev  没有创建设备节点吗?字符驱动模型似乎跟 device device_driver bus 等等完全没关系????

2012-07-08 20:42:49 73

原创 ok6410移植中碰到问题集锦

内核启动到  Starting kernel ...Uncompressing Linux... done, booting the kernel.  卡死。网上的原因有很多。一个个分析全都没用,最后换了块板子直接pass。想了很多,估计原因是由于我之前的开发箱比较非主流,它是采用onenand flash,在mach-smdk6410.c里面添加onenand分区以及初始化,

2012-07-01 20:03:23 2541

转载 makefile 中的 wildcard 与 patsubst 函数

makefile 里的函数跟它的变量很相似——使用的时候,你用一个 $ 符号跟开括号,函数名,空格后跟一列由逗号分隔的参数,最后用关括号结束。例如,在 GNU Make 里有一个叫 'wildcard' 的函 数,它有一个参数,功能是展开成一列所有符合由其参数描述的文件名,文件间以空格间隔。你可以像下面所示使用这个命令:          SOURCES = $(wildcard

2012-06-29 16:58:24 411

原创 RVDS ro基地址设置感悟

有个问题困扰了我一天,就是因为没设置ro基地址,我要读取一个全局变量,在数据段中。刚开始想没设置ro,就会有个默认的基地址,而且代码是地址无关的,所以应该没关系,可是始终读出来的值不是想要的值,很显然数据段地址出错,导致读内存指令得到的值不对。设置ro后,数据段地址也会有设置。但不设置ro,应该也会有默认地址,这个差别可能出现在生成bin文件后绝对是读内存的地址出现偏差,应该多看看RVDS的文档。

2012-06-08 10:31:08 248

原创 读arm体系有感

The ARMarchitecture is a RISC load/store architecture. In other words you must load values frommemory into registers before acting on them. There are no arithmetic or logical instructionsthat ma

2012-06-02 17:16:07 465

原创 arm 清除cache情况

reason::      Changing the memory configuration of a system may require cleaning or flushing acache. The need to clean or flush a cache results directly from actions like changing theaccess permiss

2012-05-31 21:25:48 1402

转载 arm-linux启动过程

本文针对arm linux, 从kernel的第一条指令开始分析,一直分析到进入 start_kernel()函数. 我们当前以linux-2.6.19内核版本作为范例来分析,本文中所有的代码,前面都会加上行号以便于和源码进行对照, 例: 在文件init/main.c中: 00478: asmlinkage void init start_kernel(void) 前面的"00478:" 表示47

2012-05-30 10:33:00 552

转载 arm 模式

2012-05-30 09:43:32 352

转载 ZTEXTADDR和ZRELADDR

例子:***30008000 zImage 是zImage内存中的地址 ==ZRELADDR 解压后的内核运行地址30800000 ramdisk 在内存中地址 ZTEXTADDR following symbol definitions rely on you knowing the translation that__virt_to_phys() does for

2012-05-29 15:37:01 2308

转载 arm-linux解压内核过程

linux-2.6.20.6/arch/arm/boot/compressed/head.S 开头有一段宏定义,我们只看其中一段,分析一下gnu arm汇编的宏定义#elif defined(CONFIG_ARCH_S3C2410).macro loadsp, rb mov \rb,#0x50000000 add \rb, \rb,#0x4000 * CONFIG_S3C2410_

2012-05-29 10:40:19 954

转载 arm-linux编译链接过程

目前只知道编译内核时先make menuconfig进行一些个性化的设置。然后执行make即可在内核源码根目录下得到ELF文件vmlinux,并且在相应体系结构arch/arm/boot目录下得到zImage可执行的压缩内核映像,进而烧写到开发板中。    只是这个过程到底是怎么样的,linux内核如何实现这一系列复杂的链接编译。网上看了点资料,总结一下。    内核编译首先要生成的是vm

2012-05-28 11:17:13 1082

转载 linux各种栈

在linux操作系统中,每次创建一个用户线程,就会创建一个用户态堆栈和一个内核态堆栈;每次创建一个内核线程,就只会创建一个内核态堆栈。用户线程的运行存在三种状态:用户态、基本内核态和中断态。内核线程的运行只存在两中状态:基本内核态和中断态。用户态通过系统调用才能进入基本内核态;当中断发生时,用户态或者基本内核态直接进入中断态。在用户态,使用用户态堆栈,主要负

2012-05-15 18:13:44 483

电子科大linux环境编程作业

电子科大linux环境编程作业,方便同学们学习哈。

2012-11-07

linux内存管理

很全面的内存管理分析,不看会后悔的。从linux内存布局,页表初始化,内存页面分配,slab,伙伴算法,磁盘缓存,swap等等一一分析

2012-08-31

realview 4.0完全开发指南

realview 4.0完全开发指南 包含编译器汇编器连接器以及arm各个体系结构等等的详细文档 包含10多个pdf文件。。。相当全面

2012-04-21

2440中断测试,启用定时器中断和UART中断

2440中断测试,启用定时器中断和UART中断来收发数据,不仅包括了中断的使用,而且包含点亮led,蜂鸣器测试等,适合于arm开发板初学者

2012-04-19

mini2440中断测试

mini2440中断测试,定时器中断和串口中断一起使用,对于初学arm中断的人有帮助作用。

2012-04-19

u-boot-2011.6

这里的uboot是完全没有修改过的 纯官方下载来的 想研究源码的就先看纯净版的吧

2012-03-30

linux系统移植

linux系统移植,从最基础的做起,各种工具的使用,交叉开发环境,linux编译配置,bootloadber介绍,busybox使用,glibc移植等等

2012-03-26

最新版busybox-1.19.4

用Busybox创建nfs文件系统 1、解压busybox-1.19.4.tar.bz2 修改Makefilez中的ARCH和CROSS_COMPILE与本机的路径一致: CROSS_COMPILE ?= /opt/crosstool/bin/arm-s3c2410-linux-gnu- ... ARCH ?= arm 2、编译busybox。先make menuconfig,修改以下: Busybox Settings ---> Build Options ---> Build BusyBox as a static binary (no shared libs) //直接编译成静态库,省事点 (/opt/crosstool/bin/arm-s3c2410-linux-gnu-) Cross Compiler prefix //这里和Makefile里保持一致,应该写一处就行了 Installation Options ---> Don't use /usr //不用本机的目录 Shells ---> Choose your default shell (ash) ---> //这里选择shell为ash,应该是默认选中的 --- ash //把ash这档的选项全部选上 保存退出,直接make,make install。 3、用shell脚本创建根文件系统的目录结构,并在想要建立根文件系统的地方运行此脚本。我是用root用户登陆的,直接创建了设备节点。 [root@Sure root-s3c2410]# vim makedir.sh #!/bin/sh echo "makeing rootdir" mkdir rootfs cd rootfs echo "makeing dir: bin dev etc lib proc sbin sys usr" mkdir bin dev etc lib proc sbin sys usr #8 dirs mkdir usr/bin usr/lib usr/sbin lib/modules #Don't use mknod, unless you run this Script as mknod -m 600 dev/console c 5 1 mknod -m 666 dev/null c 1 3 echo "making dir: mnt tmp var" mkdir mnt tmp var chmod 1777 tmp mkdir mnt/etc mnt/jiffs2 mnt/yaffs mnt/data mnt/temp mkdir var/lib var/lock var/log var/run var/tmp chmod 1777 var/tmp echo "making dir: home root boot" mkdir home root boot echo "done" 执行这个sh: [root@Sure root-s3c2410]# sh makedir.sh 创建出一个主文件夹rootfs,里面有一批文件: [root@Sure rootfs]# ls bin boot dev etc home lib mnt proc root sbin sys tmp usr var 4、把busybox源码目录下的etc的内容拷贝到这里的etc下 [root@Sure rootfs]# cd etc/ [root@Sure etc]# cp -a /home/jacky/busybox-1.11.1/examples/bootfloppy/etc/* ./ 5、修改拷贝过来的profile文件 [root@Sure etc]# vim profile # /etc/profile: system-wide .profile file for the Bourne shells echo "Processing /etc/profile" # no-op # Set search library path echo " Set search library path" export LD_LIBRARY_PATH=/lib:/usr/lib # Set user path echo " Set user path" PATH=/bin:/sbin:/usr/bin:/usr/sbin export PATH # Set PS1 echo " Set PS1" HOSTNAME=`/bin/hostname` # 此处让shell提示符显示host名称的。是`,不是’,要注意 # 会在进入根系统后显示Jacky export PS1="\\e[32m[$USER@$HOSTNAME \\w\\a]\\$\\e[00;37m " # 此处\\e[32m是让后面的“[$USER@$HOSTNAME \\w\\a]”显示为绿色 # \\e[00是关闭效果 # \\e[05是闪烁 # 37m是让后面的显示为白色 # 多个命令可以;号隔开 echo "All done!" echo 6、修改初始化文件inittab和fstab [root@Sure etc]# vim inittab ::sysinit:/etc/init.d/rcS ::respawn:-/bin/sh ::restart:/sbin/init tty2::askfirst:-/bin/sh ::ctrlaltdel:/bin/umount -a -r ::shutdown:/bin/umount -a -r ::shutdown:/sbin/swapoff –a [root@Sure etc]# vim fstab proc /proc proc defaults 0 0 none /tmp ramfs defaults 0 0 mdev /dev ramfs defaults 0 0 sysfs /sys sysfs defaults 0 0 7、修改初始化的脚本文件init.d/rcS [root@Sure etc]# vim init.d/rcS #! /bin/sh echo "Processing etc/init.d/rc.S" #hostname ${HOSTNAME} echo " Mount all" /bin/mount -a echo " Start mdev...." /bin/echo /sbin/mdev > proc/sys/kernel/hotplug mdev -s echo "****************************************************" echo " RootFS by NFS, s3c2410" echo " Created by Jacky Xu @ 2008.7.13" echo " Enjoy it!!!" echo "****************************************************" echo 8、创建一个空的mdev.conf文件,在挂载根文件系统时会用到的 [root@Sure etc]# touch mdev.conf 9、从本机拷贝passwd、shadow、group文件。 [root@Sure etc]# cp /etc/passwd . [root@Sure etc]# cp /etc/shadow . [root@Sure etc]# cp /etc/group . 修改passwd文件,把第一行和最后一行的bash修改成ash。 10、把busybox默认安装目录中的文件全部复制到这里的rootfs中。会发现多了linuxrc -> bin/busybox文件,这是挂载文件系统需要执行的。 [root@Sure etc]# cd .. [root@Sure rootfs]# cp -Rfv /home/jacky/busybox-1.11.1/_install/ ./ OK,以上用busybox创建了一个基本的文件系统。

2012-03-20

jdk-1_5_0_20-linux-i586.bin

jdk-1_5_0_20-linux-i586.bin,虽然是老版本,但是够稳定,很难找的。是1.5版本中的最新的了。 部署JDK 1.5。 解压缩JDK 以下命令均在root账户上执行,非root账户执行某些命令可能需要加sudo。 将jdk-1_5_0_22-linux-i586.bin放在root目录下。进入该目录: cd ~ 然后赋予该bin文件可执行属性: chmod +x jdk-1_5_0_22-linux-i586.bin 再执行安装(注意前面有./): ./jdk-1_5_0_22-linux-i586.bin 跳过协议阅读。 最后一行: Do

2012-03-20

SecureCrt绿色免安装版

SecureCrt绿色免安装,很强大,支持serial,ssh,telnet,ftp等等哦

2012-03-17

usb转串口万能驱动

usb转串口万能驱动,没用驱动的朋友不用老火了额

2012-03-15

搭建嵌入式开发环境

搭建嵌入式开发环境,初学者必备,学习嵌入式从搭建环境开始

2012-03-15

bochs2.5.1

bochs2.5.1,x86系统模拟工具,自己动手写操作系统的开发环境

2012-03-15

GCC中文手册

GCC中文手册,深入GCC原理必须的,对于整个linux编译环境的把握有好处的

2012-03-15

openjtag驱动

OpenJtag驱动,没有驱动的朋友是不能用的哦,试过完全可以,还带串口的驱动

2012-03-15

mini2440开发板工具手册

友善之臂的官方开发手册,入门必备,学习开发板的好资料

2012-03-15

tftpd32,给开发板传文件的利器

短小精悍的tftp工具,给开发板传文件的利器

2012-03-15

C/c++指针详解,晕针的注意哦

对初学者很有好处,尤其是晕针的初学者。!!!!!!

2011-04-12

linux 命令手册

linux常用命令,linux初学者很有用的,欢迎大家下载!!!

2011-04-12

mfc 类库详解

详细的mfc类库 vc编程的好东西 !!!!!!!!!!!!!!!!!!

2009-12-06

空空如也

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

TA关注的人

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