Linux中国论坛's Archiver

caohejing 发表于 2007-7-3 14:03

ARM Linux进程创建源代码分析

[font=宋体][size=12pt][color=#000000]这是本人在上海漕河泾软件园的学习记录,欢迎大家交流。这是他们的网址,有兴趣的坛友可以去看看。[/color][url=http://www.caohejing-training.com/][color=#0000ff]www.caohejing-training.com[/color][/url][/size][/font]
[font=宋体][size=12pt][color=#000000][/color][/size][/font][b][font=宋体][size=12pt][color=#000000][/color][/size][/font][/b]
[align=center][color=#000000][b][font=宋体][size=12pt]ARM Linux[/size][/font][/b][b][font=宋体][size=12pt]进程创建源代码分析[/size][/font][/b][/color][/align]
[align=center][font=宋体][size=12pt][/size][/font][/align]
[align=left][font=Wingdings][size=12pt]w[/size][/font][font=宋体][size=12pt]创建进程需要使用系统调用,一共有三个,分别是:sys_fork,sys_vfork,sys_clone[/size][/font][font=宋体][size=12pt][/size][/font][/align]
[font=Wingdings][size=12pt]w[/size][/font][font=宋体][size=12pt]所有的这三个系统调用都要使用[/size][/font][size=12pt][font=Times New Roman]do_fork[/font][/size][font=宋体][size=12pt]函数,它是创建进程的主体,我们将在下面重点介绍[/size][/font]
[size=12pt][/size]
[align=left][font=Wingdings][size=12pt]w[/size][/font][font=宋体][size=12pt]原型分别如下:[/size][/font][font=宋体][size=12pt][/size][/font][/align]
[font=宋体][size=12pt]
/* Fork a new task - this creates a new program thread.[/size][/font]
[font=宋体][size=12pt]
* This is called indirectly via a small wrapper[/size][/font]
[font=宋体][size=12pt]
*/[/size][/font]
[font=宋体][size=12pt]asmlinkage int sys_fork(struct pt_regs *regs)[/size][/font]
[font=宋体][size=12pt]{[/size][/font]
[font=宋体][size=12pt]
return do_fork(SIGCHLD, regs->ARM_sp, regs, 0);[/size][/font]
[font=宋体][size=12pt]}[/size][/font]
[size=12pt][/size]
[align=left][font=宋体][size=12pt]/* Clone a task - this clones the calling program thread.[/size][/font][font=宋体][size=12pt][/size][/font][/align]
[font=宋体][size=12pt]
* This is called indirectly via a small wrapper[/size][/font]
[font=宋体][size=12pt]
*/[/size][/font]
[font=宋体][size=12pt]asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, struct pt_regs *regs)[/size][/font]
[font=宋体][size=12pt]{[/size][/font]
[font=宋体][size=12pt]
if (!newsp)[/size][/font]
[font=宋体][size=12pt]
newsp = regs->ARM_sp;[/size][/font]
[font=宋体][size=12pt]
return do_fork(clone_flags, newsp, regs, 0);[/size][/font]
[font=宋体][size=12pt]}[/size][/font]
[font=宋体][size=12pt][/size][/font]
[font=宋体][size=12pt]asmlinkage int sys_vfork(struct pt_regs *regs)[/size][/font]
[font=宋体][size=12pt]{[/size][/font]
[font=宋体][size=12pt]
return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->ARM_sp, regs, 0);[/size][/font]
[font=宋体][size=12pt]}[/size][/font]
[size=12pt][/size]
[align=left][font=Wingdings][size=12pt]w[/size][/font][font=宋体][size=12pt]这三个系统调用的区别是:[/size][/font][font=宋体][size=12pt][/size][/font][/align]
[size=12pt][font=Times New Roman]
sys_fork[/font][/size][font=宋体][size=12pt]是完整的从父进程派生出一个子进程;[/size][/font][size=12pt][font=Times New Roman]sys_clone[/font][/size][font=宋体][size=12pt]可以通过参数[/size][/font][size=12pt][font=Times New Roman]clone_flags[/font][/size][font=宋体][size=12pt]决定需要复制给子进程的资源;而[/size][/font][size=12pt][font=Times New Roman]sys_vfork[/font][/size][font=宋体][size=12pt]则只是产生了一个新的[/size][/font][size=12pt][font=Times New Roman]task_struct[/font][/size][font=宋体][size=12pt],它还是和父进程共享其余的所有的资源,所以它不是真正的进程,只能算是线程,他将组塞父进程的运行直到自己运行结束为止。[/size][/font]
[font=Wingdings][size=12pt]w[/size][/font][font=宋体][size=12pt]有一个信号叫做[/size][/font][font=宋体][size=12pt]SIGCHLD[/size][/font][font=宋体][size=12pt],当子进程停止或结束,父进程将收到一个[/size][/font][font=宋体][size=12pt]SIGCHLD[/size][/font][font=宋体][size=12pt]信号,默认动作是忽略。 [/size][/font]
[font=Wingdings][size=12pt]w[/size][/font][font=宋体][size=12pt]也就是说[/size][/font][size=12pt][font=Times New Roman]fork[/font][/size][font=宋体][size=12pt]才是真正的[/size][/font][size=12pt][font=Times New Roman]clone[/font][/size][font=宋体][size=12pt]。[/size][/font][size=12pt][/size]
[align=left][font=Wingdings][size=12pt]w[/size][/font][font=宋体][size=12pt]背景知识:进程和进程的状态[/size][/font][font=宋体][size=12pt][/size][/font][/align]
[font=Times New Roman][size=12pt]
#define TASK_RUNNING
0[/size][size=12pt][/size][/font]
[size=12pt][font=Times New Roman]
#define TASK_INTERRUPTIBLE
1[/font][/size]
[size=12pt][font=Times New Roman]
#define TASK_UNINTERRUPTIBLE
2[/font][/size]
[size=12pt][font=Times New Roman]
#define TASK_ZOMBIE
4[/font][/size]
[font=Times New Roman][size=12pt]
#define TASK_STOPPED
8[/size][size=12pt][/size][/font]
[align=left][font=Wingdings][size=12pt]w[/size][/font][size=12pt][font=Times New Roman]1) TASK_RUNNING[/font][/size][font=宋体][size=12pt]:含义是假定任务已经处于运行队列中。至于不是已经处于运行状态的原因是由于将一个任务标识为[/size][/font][size=12pt][font=Times New Roman]TASK_RUNNING[/font][/size][font=宋体][size=12pt]和将该任务移动到运行队列不是一个原子操作。[/size][/font][size=12pt][/size][/align]
[font=Wingdings][size=12pt]w[/size][/font][size=12pt][font=Times New Roman]2) TASK_INTERRUPTIBLE[/font][/size][font=宋体][size=12pt]:含义是任务处于休眠状态但可以通过一个信号或者休眠中止时钟唤醒。[/size][/font][size=12pt][font=Times New Roman] [/font][/size]
[font=Wingdings][size=12pt]w[/size][/font][size=12pt][font=Times New Roman]3) TASK_UNINTERRUPTIBLE[/font][/size][font=宋体][size=12pt]:含义类似于[/size][/font][size=12pt][font=Times New Roman]TASK_INTERRUPTIBLE[/font][/size][font=宋体][size=12pt],但任务不能被唤醒。[/size][/font][size=12pt][/size]
[font=Wingdings][size=12pt]w[/size][/font][size=12pt][font=Times New Roman]4) TASK_ZOMBIE[/font][/size][font=宋体][size=12pt]:含义是任务已经被中止但它的状态还没被父进程获取。[/size][/font][size=12pt][/size]
[font=Wingdings][size=12pt]w[/size][/font][size=12pt][font=Times New Roman]5) TASK_STOPPED[/font][/size][font=宋体][size=12pt]:含义是由于任务控制信号或者[/size][/font][size=12pt][font=Times New Roman]ptrace[/font][/size][font=宋体][size=12pt]系统调用,任务已经被停止。[/size][/font][font=Times New Roman]
[size=12pt][/size][/font]
[align=left][font=Wingdings][size=12pt]w[/size][/font][font=Times New Roman][size=12pt]int do_fork(unsigned long clone_flags, unsigned long stack_start,[/size][size=12pt][/size][/font][/align]
[font=Wingdings][size=12pt]w[/size][/font][size=12pt][font=Times New Roman]

struct pt_regs *regs, unsigned long stack_size)[/font][/size]
[font=Wingdings][size=12pt]w[/size][/font][size=12pt][font=Times New Roman]{[/font][/size]
[font=Wingdings][size=12pt]w[/size][/font][size=12pt][font=Times New Roman]
int retval;[/font][/size]
[font=Wingdings][size=12pt]w[/size][/font][size=12pt][font=Times New Roman]
struct task_struct *p;[/font][/size]
[font=Wingdings][size=12pt]w[/size][/font][size=12pt][font=Times New Roman]
struct completion vfork;[/font][/size]
[font=Wingdings][size=12pt]w[/size][/font][size=12pt][/size]
[font=Wingdings][size=12pt]w[/size][/font][font=Times New Roman][size=12pt]
retval = -EPERM;[/size][size=12pt][/size][/font]
[font=Times New Roman][size=12pt]
[/size][size=12pt]if (clone_flags & CLONE_PID) {[/size][/font]
[font=Wingdings][size=12pt]w[/size][/font][size=12pt][font=Times New Roman]
if (current->pid)[/font][/size]
[font=Wingdings][size=12pt]w[/size][/font][size=12pt][font=Times New Roman]
goto fork_out;[/font][/size]
[font=Wingdings][size=12pt]w[/size][/font][size=12pt][font=Times New Roman]
}[/font][/size]
[font=Wingdings][size=12pt]w[/size][/font][size=12pt][/size]
[font=Wingdings][size=12pt]w[/size][/font][font=Times New Roman][size=12pt]
retval = -ENOMEM;[/size][size=12pt][/size][/font]
[size=12pt][font=Times New Roman][/font][/size]
[align=left][font=Wingdings][size=12pt]w[/size][/font][font=Times New Roman][size=12pt]上面这段代码的意思是[/size][size=12pt]: [/size][size=12pt]如果[/size][size=12pt]clone_flags[/size][size=12pt]的[/size][size=12pt]CLONE_PID[/size][size=12pt]置位[/size][size=12pt],[/size][size=12pt]则除非是[/size][size=12pt]0[/size][/font][size=12pt][font=Times New Roman]号进程[/font]
[font=Times New Roman]否则将返回错误信息[/font][/size][font=Times New Roman][size=12pt]EPERM. clone_flags[/size][size=12pt]的定义将在后面介绍[/size][size=12pt],0[/size][/font][size=12pt][font=Times New Roman]号进程就是操作[/font]
[font=Times New Roman]系统启动时创建的第一个进程[/font][/size][font=Times New Roman][size=12pt].[/size][size=12pt]上面的代码中[/size][size=12pt]if(current->pid)[/size][size=12pt]要成立[/size][size=12pt],[/size][size=12pt]除非是[/size][size=12pt]0[/size][/font][size=12pt][font=Times New Roman]号[/font]
[font=Times New Roman]进程[/font][/size][font=Times New Roman][size=12pt].[/size][size=12pt]其中[/size][size=12pt]pid[/size][size=12pt]是进程标志符[/size][size=12pt][/size][/font][/align]
[size=12pt][/size]
[align=left][font=Wingdings][size=12pt]w[/size][/font][font=Times New Roman][size=12pt]p = alloc_task_struct();
/* franc: we will alloc one page space as task_struct */[/size][size=12pt][/size][/font][/align]
[font=Wingdings][size=12pt]w[/size][/font][size=12pt][font=Times New Roman]
if (!p)[/font][/size]
[font=Wingdings][size=12pt]w[/size][/font][size=12pt][font=Times New Roman]
goto fork_out;[/font][/size]
[font=Wingdings][size=12pt]w[/size][/font][font=宋体][size=12pt][/size][/font]
[font=Wingdings][size=12pt]w[/size][/font][font=Times New Roman][size=12pt]
*p = *current;
/* franc: just copy all the info of its parent to this new process */[/size][size=12pt][/size][/font]
[font=Wingdings][size=12pt]w[/size][/font][font=宋体][size=12pt][/size][/font]
[font=Wingdings][size=12pt]w[/size][/font][font=Times New Roman][size=12pt]
retval = -EAGAIN;[/size][size=12pt][/size][/font]
[size=12pt][font=Times New Roman][/font][/size]
[align=left][font=Wingdings][size=12pt]w[/size][/font][font=Times New Roman][size=12pt]上面代码的意思是[/size][size=12pt]: [/size][size=12pt]申请一个新的内存控制块[/size][size=12pt],[/size][size=12pt]其中[/size][size=12pt]alloc_task_struct[/size][size=12pt]是在[/size][size=12pt]/[/size][size=12pt]arch[/size][/font]
[font=Times New Roman][size=12pt]/[/size][size=12pt]arm[/size][size=12pt]/[/size][size=12pt]kernel/process.c[/size][size=12pt]中定义[/size][/font][font=Times New Roman][size=12pt]:
struct task_struct *alloc_task_struct(void)[/size][size=12pt]其中[/size][size=12pt]:[/size][size=12pt][/size][/font][/align]
[size=12pt][font=Times New Roman]

ll_alloc_task_struct() [/font][/size][font=宋体][size=12pt]在[/size][/font][size=12pt][font=Times New Roman]/include/asm-arm/proc-armv/processor.h[/font][/size][font=宋体][size=12pt]中定义:[/size][/font]
[font=Times New Roman][size=12pt]
[/size][size=12pt]#define ll_alloc_task_struct() ((struct task_struct *) __get_free_pages(GFP_KERNEL,1))[/size][/font]
[align=left][align=left][font=Wingdings][size=12pt]w[/size][/font][font=Times New Roman][size=12pt]_get_free_pages[/size][size=12pt]是要申请两个页面[/size][size=12pt],[/size][size=12pt]页面是内存管理的有关内容[/size][size=12pt],[/size][size=12pt]这儿大家只要一个页面占[/size][size=12pt]4[/size][size=12pt]K[/size][size=12pt]个字节就可以了[/size][size=12pt].[/size][size=12pt]两个页面就是[/size][size=12pt]8[/size][size=12pt]K[/size][size=12pt]个字节[/size][size=12pt],[/size][size=12pt]而大家查一下进程控制块的大小就可以知道它只有[/size][size=12pt]1600B[/size][size=12pt]左右[/size][size=12pt],[/size][/font][font=宋体][size=12pt]也就是[/size][/font][font=Times New Roman][size=12pt]说它只有[/size][size=12pt]1[/size][size=12pt].5K[/size][size=12pt]左右[/size][size=12pt],[/size][size=12pt]那么还剩下将近[/size][size=12pt]6.5[/size][size=12pt]K[/size][size=12pt]的空间去有什么用呢[/size][size=12pt]?[/size][size=12pt]其实剩余的空间是作为内核栈空间[/size][size=12pt].[/size][size=12pt]如果申请内存空间失败则直接栈道[/size][size=12pt]fork_out[/size][size=12pt]处执行[/size][size=12pt],fork_out[/size][size=12pt]在后面有定义[/size][size=12pt][/size][/font][/align][/align][font=Wingdings][size=12pt]w[/size][/font][font=宋体][size=12pt]然后就将父进程的所有信息直接拷贝给它。[/size][/font][font=Times New Roman]
[size=12pt][/size][/font]
[align=left][align=left][font=Wingdings][size=12pt]w[/size][/font][font=Times New Roman][size=12pt]if (atomic_read(&p->user->processes) >= p->rlim[RLIMIT_NPROC].rlim_cur[/size][size=12pt][/size][/font][/align][/align][font=Wingdings][size=12pt]w[/size][/font][size=12pt][font=Times New Roman]

&& !capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE))
/* franc: check if we have spawned too many processes */[/font][/size]
[font=Wingdings][size=12pt]w[/size][/font][size=12pt][font=Times New Roman]
goto bad_fork_free;[/font][/size]
[font=Wingdings][size=12pt]w[/size][/font][size=12pt][/size]
[font=Wingdings][size=12pt]w[/size][/font][font=Times New Roman][size=12pt]
atomic_inc(&p->user->__count);
/* make the process number tracable */[/size][size=12pt][/size][/font]
[font=Wingdings][size=12pt]w[/size][/font][size=12pt][font=Times New Roman]
atomic_inc(&p->user->processes);[/font][/size]
[size=12pt][font=Times New Roman] [/font][/size]
[align=left][align=left][font=Wingdings][size=12pt]w[/size][/font][font=Times New Roman][size=12pt]上面代码的意思[/size][size=12pt]: [/size][size=12pt]如果父进程已经用了用户进程[/size][size=12pt],[/size][size=12pt]则修改[/size][size=12pt]p->user->_count[/size][/font][size=12pt][font=Times New Roman]和[/font]
[/size][font=Times New Roman][size=12pt]p->user->processes,[/size][size=12pt]将其数目加[/size][size=12pt]1,[/size][size=12pt]当然除非用户进程的[/size][/font][font=Times New Roman][size=12pt] RLIMIT_NPROC
[/size][size=12pt]已经超过额定数目[/size][/font][font=宋体][size=12pt]。[/size][/font][size=12pt][/size][/align][/align][size=12pt][/size]

yaj114777175 发表于 2008-4-20 02:04

!!!

完全看不懂

wenyanping 发表于 2008-5-26 09:35

国内代孕网站一览表:

国内代孕网站一览表: 东方[url=http://www.dfdaiyun.com]代孕[/url]网宝贝[url=http://www.abjbaobao.com.cn]代孕[/url]网诚信[url=http://www.daiyun315.cn]代孕[/url]网天天[url=http://www.daiyun365.cn]代孕[/url]网月嫂[url=http://www.yuesao365.cn]代孕[/url]网宝宝[url=http://www.daiy315.cn]代孕[/url]网真诚[url=http://www.baby315.cn]代孕[/url]网专职[url=http://www.dy-mm.com]代孕[/url]网香港[url=http://www.zzlive.com.cn]代孕[/url]网中国宝贝[url=http://www.dy-bb.com]代孕[/url]网 [url=http://www.chinayzyz.cn]野猪[/url] [url=http://www.chinayzyz.cn]特种野猪[/url] [url=http://www.cnshau.com"]上海音响[/url] [url=http://www.bdqnht.com]电脑培训[/url] [url=http://www.bdqnht.com]计算机培训[/url] [url=http://www.bdqnht.com]北京北大青鸟[/url] [url=http://www.bdqnht.com]北大青鸟培训中心[/url] [url=http://www.bdqnht.com]北大青鸟[/url] [url=http://www.bdqnht.com]网络工程师[/url] [url=http://www.bdqnht.com]北大青鸟培训[/url]

wenyanping 发表于 2008-5-28 09:40

EE

[url=http://www.zctyjx.cn]造纸机械[/url]
[url=http://www.ytsanfa.com]过滤机[/url]
[url=http://www.ytsanfa.com]铁屑粉碎机[/url]
[url=http://www.ytsanfa.com]排屑器[/url]
[url=http://www.ytsanfa.com]排屑机[/url]
[url=http://www.ytsanfa.com]过滤纸[/url]
[url=http://www.lzgyzs.com]工艺纸绳[/url]
[url=http://www.lzgyzs.com]工艺纸布[/url]
[url=http://www.bjitm.com]模拟高尔夫[/url]
[url=http://www.netnic.com.cn]服务器租用[/url]
[url=http://www.huarsheng.com]反光膜[/url]
[url=http://www.yd-js.com]饲料机械[/url]
[url=http://www.yd-js.com]饲料粉碎机[/url]
[url=http://www.yd-js.com]制粒机[/url]
[url=http://www.yd-js.com]饲料混合机[/url]
[url=http://www.zkcj.com]无菌室[/url]
[url=http://www.cnshau.com]上海音响[/url]
[url=http://www.guardit.cn/product_soft1.htm]条码软件[/url]
[url=http://www.cnnose.cn]隆鼻[/url]
[url=http://www.cnnose.cn]鼻整形[/url]
[url=http://www.cnnose.cn]鼻延长[/url]
[url=http://www.cnnosecn]隆鼻照片[/url]
[url=http://www.nxjkw.net]生殖器疱疹[/url]
[url=http://www.sosano.com]传真解决方案[/url]
[url=http://www.sosano.com]传真软件[/url]
[url=http://www.sosano.com]电子传真[/url]
[url=http://www.sosano.com]传真服务器[/url]
[url=http://www.sosano.com]传真运营[/url]
[url=http://www.cnsdhd.com/taji.htm]塔机[/url]
[url=http://www.guardait.com]条码[/url]
[url=http://www.guardait.com]条码机[/url]
[url=http://www.guardait.com]移动计算[/url]
[url=http://www.ytlifeng.com]过滤机[/url]
[url=http://www.china7.com.cn]水性漆[/url]
[url=http://www.china7.com.cn]水性防锈漆[/url]
[url=http://www.china7.com.cn]水性金属漆[/url]
[url=http://www.laizhousanwei.com]反应釜[/url]
[url=http://www.guardit.cn/solu/solu_hy_gdzc_anli_ga.htm]固定资产管理[/url]
[url=http://www.guardit.cn/solu/solu_hy_gdzc_anli_ga.htm]固定资产管理系统[/url]
[url=http://www.guardit.cn/solu/solu_hy_gdzc_anli_ga.htm]固定资产[/url]
[url=http://www.guardit.cn/product_soft1.htm]资产管理软件[/url]
[url=http://www.guardit.cn/product_lable.htm]不干胶标签[/url]
[url=http://www.guardit.cn/product_printer_jj.htm]条形码打印机[/url]
[url=http://www.guardit.cn/product_scanner_scgy.htm]扫描器[/url]
[url=http://www.guardait.com/support_question1.htm]扫描枪[/url]
[url=http://www.tianfengcompany.com]淀粉设备[/url]
[url=http://www.cnsdhd.com/hunningtujiaobanzhan.htm]混凝土搅拌站[/url]
[url=http://www.ganbing110.net]肝癌治疗[/url]
[url=http://www.ganbing110.net]治疗肝癌[/url]
[url=http://www.ganbing110.net]肝癌晚期[/url]
[url=http://www.ganbing110.net]肝癌晚期治疗[/url]
[url=http://www.53ok.cn]车库门[/url]
[url=http://www.53ok.cn]卷帘门[/url]  
[url=http://www.53ok.cn]伸缩门[/url]
[url=http://www.tianfengcompany.com]淀粉设备[/url]
[url=http://www.bjlxtx.com]北京旅游[/url]
[url=http://www.sanzhixiaoxiong.com]儿童摄影[/url]
[url=http://www.jinghesh.com]燃烧设备[/url]
[url=http://www.autokey.cn]芯片钥匙[/url]
[url=http://www.allotec.com]kvm系统[/url]
[url=http://www.okaep.cn]缠绕机[/url]
[url=http://www.zzhzt.cn]偏头痛[/url]
[url=http://www.chinayxb.com]牛皮癣[/url]
[url=http://www.daiy315.cn]代孕[/url]
      [url=http://www.3mf.cn]三面翻[/url]
      [url=http://www.beijing-zuche.com]北京租车[/url]
      [url=http://www.nmglxs.com]内蒙古旅游[/url]
      [url=http://www.ultra-gear.com]gear pump[/url]
      [url=http://www.tongdeli.com/cloth.htm]吸音板[/url]
      [url=http://www.pfkf999.com]牛皮癣[/url]
[url=http://www.cdjiansuji.com]减速机[/url]
[url=http://www.zg-ganxi.com]干洗店加盟[/url]
[url=http://www.aerka.net]地暖[/url]
[url=http://www.xckz.com]数据采集卡[/url]
[url=http://www.xckz.com]PCI采集卡[/url]
[url=http://www.xckz.com]调理模块[/url]
[url=http://www.xckz.com]远程IO模块[/url]
[url=http://www.51yn.com]云南旅游[/url]
[url=http://www.bdqnht.com]网络培训[/url]
[url=http://www.bdqnht.com]网络工程师[/url]
[url=http://www.bdqnht.com]北大青鸟培训[/url]
[url=http://www.bdqnht.com]网络工程师培训[/url]
[url=http://www.bdqnht.com]北大青鸟培训中心[/url]
[url=http://www.mnlsv2.com]摄影工作室[/url]
[url=http://www.bdqnht.com]北大青鸟[/url]
[url=http://www.bdqnht.com]北大青鸟网络工程师[/url]
[url=http://www.bdqnht.com]电脑培训[/url]
[url=http://www.ytthyb.cn]蒸汽流量计[/url]
[url=http://www.ytthyb.cn]涡街流量计[/url]
[url=http://www.bjjyzh.com]北京灯箱广告[/url]
[url=http://www.bjjyzh.com]led电子屏工程[/url]
[url=http://www.jiangheyeya.com]液压机[/url]
[url=http://www.hrdzf.com]T恤[/url]

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.