Mandrake9.0的启动过程(从init开始)(一)
以阅读源代码的方式研究 linux的启动过程,是我早已有之的心愿。今天总算是开工了。由于理解系统初始化过程要有汇编的基础,所以我只好先从init开始。init的源代码在/usr/src/linux-2.4.19-9mdk/init目录下,在这个目录下共有三个文件do_mounts.c、main.c和version.c。其中main.c就是init进程的源代码。这段代码并不长,只有640行。
首先用ctags -x main.c 生成一个tags文件,用vi 打开后,可以看到各个函数的索引:
LPS_PREC macro 183 main.c #define LPS_PREC 8
MAX_INIT_ARGS macro 125 main.c #define MAX_INIT_ARGS 8
MAX_INIT_ENVS macro 126 main.c #define MAX_INIT_ENVS 8
__KERNEL_SYSCALLS__ macro 12 main.c #define __KERNEL_SYSCALLS__
argv_init variable 135 main.c static char *
argv_init[MAX_INIT_ARGS+2] = { "init", NULL, };
calibrate_delay function 185 main.c void __init
calibrate_delay(void)
checksetup function 160 main.c static int __init
checksetup(char *line)
child_reaper variable 498 main.c struct task_struct
*child_reaper = &init_task;
cols variable 131 main.c int rows, cols;
debug_kernel function 226 main.c static int __init
debug_kernel(char *str)
do_basic_setup function 521 main.c static void __init
do_basic_setup(void)
do_initcalls function 500 main.c static void __init
do_initcalls(void)
envp_init variable 136 main.c char *
envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, };
execute_command variable 133 main.c char *execute_command;
gr_setup function 148 main.c static int __init
gr_setup(char *str)
init function 603 main.c static int init(void
*unused)
loops_per_jiffy variable 178 main.c unsigned long
loops_per_jiffy = (1<<12);
parse_options function 254 main.c static void __init
parse_options(char *line)
profile_setup function 138 main.c static int __init
profile_setup(char *str)
quiet_kernel function 234 main.c static int __init
quiet_kernel(char *str)
rest_init function 389 main.c static void rest_init(void)
rows variable 131 main.c int rows, cols;
smp_init function 349 main.c static void __init
smp_init(void)
smp_init function 361 main.c static void __init
smp_init(void)
smp_init macro 354 main.c #define smp_init() do { }
while (0)
start_kernel function 401 main.c asmlinkage void __init
start_kernel(void)
wait_init_idle variable 344 main.c unsigned long
wait_init_idle;
有了这个索引后,查找函数就方便了。再用vi 打开main.c,找到init函数,如下:
[code]static int init(void * unused)
{
lock_kernel();
do_basic_setup();
prepare_namespace();
#ifdef CONFIG_GRKERNSEC
grsecurity_init();
#endif
/*
* Ok, we have completed the initial bootup, and
* we're essentially up and running. Get rid of the
* initmem segments and start the user-mode stuff..
*/
free_initmem();
unlock_kernel();
if (open("/dev/console", O_RDWR, 0) < 0)
printk("Warning: unable to open an initial console.\n");
(void) dup(0);
(void) dup(0);
/*
* We try each of these until one succeeds.
*
* The Bourne shell can be used instead of init if we are
* trying to recover a really broken machine.
*/
if (execute_command)
execve(execute_command,argv_init,envp_init);
execve("/sbin/init",argv_init,envp_init);
execve("/etc/init",argv_init,envp_init);
execve("/bin/init",argv_init,envp_init);
execve("/bin/sh",argv_init,envp_init);
panic("No init found. Try passing init= option to kernel.");
[/code]在源代码中,可以看到很多如同#ifdef
CONFIG_GRKERNSEC的宏定义,这些宏定义可以在/usr/src/linux-2.4.19-9mdk/目录下的.config文件中找到。用vi
查看.config文件中的宏定义,发现"# CONFIG_GRKERNSEC is not
set",也就是没有定义,因此,这个宏定义可以不管它。先来看执行流程。
一、do_basic_setup()函数
init进程第一个执行的函数是lock_kernel(),这个函数在很多内核的源代码中都有,但我没有找到它的函数定义,只好放弃。
第二个执行的函数就是do_basic_setup(),这个函数的内容如下:
[code]
/*
* Ok, the machine is now initialized. None of the devices
* have been touched yet, but the CPU subsystem is up and
* running, and memory and process management works.
*
* Now we can finally start doing some real work..
*/
static void __init do_basic_setup(void)
{
/*
* Tell the world that we're going to be the grim
* reaper of innocent orphaned children.
*
* We don't want people to have to make incorrect
* assumptions about where in the task array this
* can be found.
*/
child_reaper = current;
#if defined(CONFIG_MTRR) /* Do this after SMP initialization */
/*
* We should probably create some architecture-dependent "fixup after
* everything is up" style function where this would belong better
* than in init/main.c..
*/
mtrr_init();
#endif /*mtrr(Memory Type Range Register)是Inter P6系列处理器用来控制处理器读写内存范围的。*/
#ifdef CONFIG_SYSCTL
sysctl_init();
#endif /* 对/proc文件系统和sysctl()系统调用相关部分进行初始化*/
/*
* Ok, at this point all CPU's should be initialized, so
* we can start looking into devices..
*/
#if defined(CONFIG_ARCH_S390)
s390_init_machine_check();
#endif
#ifdef CONFIG_PCI
pci_init();
#endif /* 初始化PCI总线 */
#ifdef CONFIG_SBUS
sbus_init();
#endif
#if defined(CONFIG_PPC)
ppc_init();
#endif
#ifdef CONFIG_MCA
mca_init();
#endif
#ifdef CONFIG_ARCH_ACORN
ecard_init();
#endif
#ifdef CONFIG_ZORRO
zorro_init();
#endif
#ifdef CONFIG_DIO
dio_init();
#endif
#ifdef CONFIG_NUBUS
nubus_init();
#endif
#ifdef CONFIG_ISAPNP
isapnp_init();
#endif /* 对ISA总线即插即用初始化 */
#ifdef CONFIG_TC
tc_init();
#endif
/* Networking initialization needs a process context */
sock_init(); /* 初始化网络协议栈 */
start_context_thread();
do_initcalls();
#ifdef CONFIG_IRDA
irda_proto_init();
irda_device_init(); /* Must be done after protocol initialization */
#endif
#ifdef CONFIG_PCMCIA
init_pcmcia_ds(); /* Do this last */
#endif
}
[/code]
很明显,这段代码是用来进行对系统初始化的。开头的一段注释告诉我们,系统硬件此时只有cpu子系统在运转,内存管理和进程管理也开始工作了。接下来,就是对硬件的初始化。
这一部分与硬件密切相关,在编译核心时,将根据配置文件.config来编译相应的部分。用vi查看.config文件,发现定义的项目如下:
CONFIG_MTRR=y
CONFIG_SYSCTL=y
CONFIG_PCI=y
# CONFIG_PCI_GOBIOS is not set
# CONFIG_PCI_GODIRECT is not set
CONFIG_PCI_GOANY=y
CONFIG_PCI_BIOS=y
CONFIG_PCI_DIRECT=y
CONFIG_PCI_NAMES=y
CONFIG_PCI_HERMES=m
# CONFIG_SBUS is not set
# CONFIG_MCA is not set
CONFIG_ISAPNP=y
CONFIG_TCIC=y
CONFIG_TC35815=m
CONFIG_IRDA=m
CONFIG_IRDA_ULTRA=y
CONFIG_IRDA_CACHE_LAST_LSAP=y
CONFIG_IRDA_FAST_RR=y
# CONFIG_IRDA_DEBUG is not set
CONFIG_PCMCIA=m
CONFIG_PCMCIA_AHA152X=m
CONFIG_PCMCIA_FDOMAIN=m
CONFIG_PCMCIA_NINJA_SCSI=m
CONFIG_PCMCIA_QLOGIC=m
CONFIG_PCMCIA_HERMES=m
CONFIG_PCMCIA_3C589=m
CONFIG_PCMCIA_3C574=m
CONFIG_PCMCIA_FMVJ18X=m
CONFIG_PCMCIA_PCNET=m
CONFIG_PCMCIA_AXNET=m
CONFIG_PCMCIA_NMCLAN=m
CONFIG_PCMCIA_SMC91C92=m
CONFIG_PCMCIA_XIRC2PS=m
CONFIG_PCMCIA_IBMTR=m
CONFIG_PCMCIA_XIRCOM=m
CONFIG_PCMCIA_XIRTULIP=m
CONFIG_PCMCIA_RAYCS=m
CONFIG_PCMCIA_NETWAVE=m
CONFIG_PCMCIA_WAVELAN=m
CONFIG_PCMCIA_WVLAN=m
CONFIG_PCMCIA_SERIAL_CS=m
呵呵,这样一看,mandrake缺省配置的东西真不少,就连我根本用不上的IRDA和PCMCIA都编译成模块了。有了这些代码后,在开机时,就会看到这些启动信息:
[root@c4 linux-2.4.19-9mdk]#dmesg
......
mtrr: v1.40 (20010327) Richard Gooch (rgooch@atnf.csiro.au)
mtrr: detected mtrr type: Intel
PCI: PCI BIOS revision 2.10 entry at 0xfdb81, last bus=3
PCI: Using configuration type 1
PCI: Probing PCI hardware
Unknown bridge resource 0: assuming transparent
PCI: Using IRQ router PIIX [8086/2440] at 00:1f.0
isapnp: Scanning for PnP cards...
isapnp: No Plug & Play device found
Linux NET4.0 for Linux 2.4
......
二、prepare_namespace()函数
接下来要执行的是prepare_namespace()函数。这个函数在/usr/src/linux-2.4.19-9mdk/init/do_mounts.c文件中。内容如下:
[code]
/*
* Prepare the namespace - decide what/where to mount, load ramdisks, etc.
*/
void prepare_namespace(void)
{
int is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;
#ifdef CONFIG_ALL_PPC
extern void arch_discover_root(void);
arch_discover_root();
#endif /* CONFIG_ALL_PPC */
#ifdef CONFIG_BLK_DEV_INITRD
if (!initrd_start)
mount_initrd = 0;
real_root_dev = ROOT_DEV;
#endif
sys_mkdir("/dev", 0700);
sys_mkdir("/root", 0700);
sys_mknod("/dev/console", S_IFCHR|0600, MKDEV(TTYAUX_MAJOR, 1));
#ifdef CONFIG_DEVFS_FS
sys_mount("devfs", "/dev", "devfs", 0, NULL);
do_devfs = 1;
#endif
create_dev("/dev/root", ROOT_DEV, NULL);
if (mount_initrd) {
if (initrd_load() && ROOT_DEV != MKDEV(RAMDISK_MAJOR, 0)) {
handle_initrd();
goto out;
}
} else if (is_floppy && rd_doload && rd_load_disk(0))
ROOT_DEV = MKDEV(RAMDISK_MAJOR, 0);
mount_root();
out:
sys_umount("/dev", 0);
sys_mount(".", "/", NULL, MS_MOVE, NULL);
sys_chroot(".");
mount_devfs_fs ();
}
[/code]
这段代码主要是决定根设备安装在那儿,在中间要处理一下RAM disk并判断是不是软盘启动的。
。RAM主要用来在核心安装根文件系统之前,预先装入一些模块。如果在lilo中指定了一个initrd.img映像文件,则内核在安装根设备之前,把它装上,否则正常安装根设备。
三、转入用户态运行
在完成初始化后,系统接着执行free_initmem(),将初始化过程中使用的内在释放。然后执行unlock_kernel(),这个函数想必就是前面lock_kernel()的逆操作了。然后以可读可写方式打开一个控制台设备。并复制两个文件描述符。
最后,init检查是否有给定的指今,如果没有,则按顺序检查是否存在/sbin/init、/etc/init、/bin/init和/bin/sh等文件,如果存在,则跳转执行相应和程序。一般情况下,系统都会启动/sbin/init程序,从此以后创建的进程都会在用户态运行。下一步的系统启动过程,也由/sbin/init来接着完成。
GSM的无线智能监控设计rf2126全球116IC交易网
http://abcgoogle.adgic.com/267/266461.htmlhttp://abcgoogle.adgic.com/267/266551.html
http://abcgoogle.adgic.com/267/266641.html
http://abcgoogle.adgic.com/267/266731.html
http://abcgoogle.adgic.com/267/266821.html
http://abcgoogle.adgic.com/268/267001.html
http://abcgoogle.adgic.com/268/267091.html
http://abcgoogle.adgic.com/268/267181.html
http://abcgoogle.adgic.com/268/267271.html
http://abcgoogle.adgic.com/268/267361.html
http://abcgoogle.adgic.com/268/267451.html
http://abcgoogle.adgic.com/268/267541.html
http://abcgoogle.adgic.com/268/267631.html
http://abcgoogle.adgic.com/268/267721.html
http://abcgoogle.adgic.com/268/267811.html
http://abcgoogle.adgic.com/268/267901.html
http://abcgoogle.adgic.com/268/267991.html
http://abcgoogle.adgic.com/269/268081.html
http://abcgoogle.adgic.com/269/268171.html
http://abcgoogle.adgic.com/269/268261.html
http://abcgoogle.adgic.com/269/268351.html
http://abcgoogle.adgic.com/269/268441.html
http://abcgoogle.adgic.com/269/268531.html
http://abcgoogle.adgic.com/269/268621.html
http://abcgoogle.adgic.com/269/268711.html
http://abcgoogle.adgic.com/269/268801.html
http://abcgoogle.adgic.com/269/268891.html
http://abcgoogle.adgic.com/269/268981.html
http://abcgoogle.adgic.com/270/269071.html
http://abcgoogle.adgic.com/270/269161.html
http://abcgoogle.adgic.com/270/269251.html
http://abcgoogle.adgic.com/270/269341.html
http://abcgoogle.adgic.com/270/269521.html
http://abcgoogle.adgic.com/270/269611.html
http://abcgoogle.adgic.com/270/269701.html
http://abcgoogle.adgic.com/270/269791.html
http://abcgoogle.adgic.com/270/269881.html
http://abcgoogle.adgic.com/270/269971.html
http://abcgoogle.adgic.com/271/270061.html
http://abcgoogle.adgic.com/271/270151.html
http://abcgoogle.adgic.com/271/270241.html
http://abcgoogle.adgic.com/271/270331.html
http://abcgoogle.adgic.com/271/270421.html
http://abcgoogle.adgic.com/271/270511.html
http://abcgoogle.adgic.com/271/270601.html
http://abcgoogle.adgic.com/271/270691.html
http://abcgoogle.adgic.com/271/270781.html
http://abcgoogle.adgic.com/271/270871.html
http://abcgoogle.adgic.com/271/270961.html
http://abcgoogle.adgic.com/272/271051.html
http://abcgoogle.adgic.com/272/271141.html
http://abcgoogle.adgic.com/272/271231.html
http://abcgoogle.adgic.com/272/271321.html
http://abcgoogle.adgic.com/272/271411.html
http://abcgoogle.adgic.com/272/271501.html
http://abcgoogle.adgic.com/272/271591.html
http://abcgoogle.adgic.com/272/271681.html
http://abcgoogle.adgic.com/272/271771.html
http://abcgoogle.adgic.com/272/271861.html
http://abcgoogle.adgic.com/272/271951.html
http://abcgoogle.adgic.com/273/272041.html
http://abcgoogle.adgic.com/273/272131.html
http://abcgoogle.adgic.com/273/272221.html
http://abcgoogle.adgic.com/273/272311.html
http://abcgoogle.adgic.com/273/272401.html
http://abcgoogle.adgic.com/273/272491.html
http://abcgoogle.adgic.com/273/272581.html
http://abcgoogle.adgic.com/273/272671.html
http://abcgoogle.adgic.com/273/272761.html
http://abcgoogle.adgic.com/273/272851.html
http://abcgoogle.adgic.com/273/272932.html
http://abcgoogle.adgic.com/274/273022.html
http://abcgoogle.adgic.com/274/273112.html
http://abcgoogle.adgic.com/274/273202.html
http://abcgoogle.adgic.com/274/273292.html
http://abcgoogle.adgic.com/274/273382.html
http://abcgoogle.adgic.com/274/273472.html
http://abcgoogle.adgic.com/274/273472.html
http://abcgoogle.adgic.com/274/273562.html
http://abcgoogle.adgic.com/274/273652.html
http://abcgoogle.adgic.com/274/273742.html
http://abcgoogle.adgic.com/274/273832.html
http://abcgoogle.adgic.com/274/273922.html
http://abcgoogle.adgic.com/275/274012.html
http://abcgoogle.adgic.com/275/274102.html
http://abcgoogle.adgic.com/275/274192.html
http://abcgoogle.adgic.com/275/274282.html
http://abcgoogle.adgic.com/275/274372.html
http://abcgoogle.adgic.com/275/274462.html
http://abcgoogle.adgic.com/275/274552.html
http://abcgoogle.adgic.com/275/274642.html
http://abcgoogle.adgic.com/275/274732.html
http://abcgoogle.adgic.com/275/274822.html
http://abcgoogle.adgic.com/275/274912.html
http://abcgoogle.adgic.com/276/275002.html
http://abcgoogle.adgic.com/276/275092.html
http://abcgoogle.adgic.com/276/275182.html
http://abcgoogle.adgic.com/276/275272.html
http://abcgoogle.adgic.com/276/275362.html
http://abcgoogle.adgic.com/276/275452.html
http://abcgoogle.adgic.com/276/275542.html
http://abcgoogle.adgic.com/276/275632.html
http://abcgoogle.adgic.com/276/275722.html
http://abcgoogle.adgic.com/276/275812.html
http://abcgoogle.adgic.com/276/275902.html
http://abcgoogle.adgic.com/276/275992.html
http://abcgoogle.adgic.com/277/276082.html
http://abcgoogle.adgic.com/277/276172.html
http://abcgoogle.adgic.com/277/276262.html
http://abcgoogle.adgic.com/277/276352.html
http://abcgoogle.adgic.com/277/276352.html
http://abcgoogle.adgic.com/277/276442.html
http://abcgoogle.adgic.com/277/276532.html
http://abcgoogle.adgic.com/277/276622.html
http://abcgoogle.adgic.com/277/276712.html
http://abcgoogle.adgic.com/277/276802.html
http://abcgoogle.adgic.com/277/276892.html
http://abcgoogle.adgic.com/277/276982.html
http://abcgoogle.adgic.com/278/277072.html
http://abcgoogle.adgic.com/278/277162.html
http://abcgoogle.adgic.com/278/277252.html
http://abcgoogle.adgic.com/278/277342.html
http://abcgoogle.adgic.com/278/277432.html
http://abcgoogle.adgic.com/278/277522.html
http://abcgoogle.adgic.com/278/277612.html
http://abcgoogle.adgic.com/278/277702.html
http://abcgoogle.adgic.com/278/277792.html
http://abcgoogle.adgic.com/278/277882.html
http://abcgoogle.adgic.com/278/277972.html
http://abcgoogle.adgic.com/279/278062.html
http://abcgoogle.adgic.com/279/278152.html
http://abcgoogle.adgic.com/279/278242.html
http://abcgoogle.adgic.com/279/278332.html
http://abcgoogle.adgic.com/279/278422.html
http://abcgoogle.adgic.com/279/278512.html
http://abcgoogle.adgic.com/279/278602.html
http://abcgoogle.adgic.com/279/278692.html
http://abcgoogle.adgic.com/279/278782.html
http://abcgoogle.adgic.com/279/278872.html
http://abcgoogle.adgic.com/279/278962.html
http://abcgoogle.adgic.com/280/279052.html
http://abcgoogle.adgic.com/280/279142.html
http://abcgoogle.adgic.com/280/279232.html
http://abcgoogle.adgic.com/280/279322.html
http://abcgoogle.adgic.com/280/279412.html
http://abcgoogle.adgic.com/280/279502.html
http://abcgoogle.adgic.com/280/279592.html
http://abcgoogle.adgic.com/280/279682.html
http://abcgoogle.adgic.com/280/279772.html
http://abcgoogle.adgic.com/280/279862.html
http://abcgoogle.adgic.com/280/279952.html
http://abcgoogle.adgic.com/281/280042.html
http://abcgoogle.adgic.com/281/280132.html
http://abcgoogle.adgic.com/281/280222.html
http://abcgoogle.adgic.com/281/280312.html
http://abcgoogle.adgic.com/281/280402.html
http://abcgoogle.adgic.com/281/280402.html
http://abcgoogle.adgic.com/281/280492.html
http://abcgoogle.adgic.com/281/280582.html
http://abcgoogle.adgic.com/281/280672.html
http://abcgoogle.adgic.com/281/280852.html
http://abcgoogle.adgic.com/281/280942.html
http://abcgoogle.adgic.com/282/281032.html
http://abcgoogle.adgic.com/282/281122.html
http://abcgoogle.adgic.com/282/281212.html
http://abcgoogle.adgic.com/282/281302.html
http://abcgoogle.adgic.com/282/281392.html
http://abcgoogle.adgic.com/282/281482.html
http://abcgoogle.adgic.com/282/281572.html
http://abcgoogle.adgic.com/282/281662.html
http://abcgoogle.adgic.com/282/281662.html
http://abcgoogle.adgic.com/282/281842.html
http://abcgoogle.adgic.com/282/281932.html
http://abcgoogle.adgic.com/283/282022.html
http://abcgoogle.adgic.com/283/282112.html
http://abcgoogle.adgic.com/283/282292.html
http://abcgoogle.adgic.com/283/282382.html
http://abcgoogle.adgic.com/283/282472.html
http://abcgoogle.adgic.com/283/282562.html
http://abcgoogle.adgic.com/283/282652.html
http://abcgoogle.adgic.com/283/282742.html
http://abcgoogle.adgic.com/283/282832.html
http://abcgoogle.adgic.com/283/282922.html
http://abcgoogle.adgic.com/284/283102.html
http://abcgoogle.adgic.com/284/283192.html
http://abcgoogle.adgic.com/284/283372.html
http://abcgoogle.adgic.com/284/283462.html
http://abcgoogle.adgic.com/284/283552.html
http://abcgoogle.adgic.com/284/283642.html
http://abcgoogle.adgic.com/284/283732.html
http://abcgoogle.adgic.com/284/283822.html
http://abcgoogle.adgic.com/284/283912.html
http://abcgoogle.adgic.com/285/284002.html
http://abcgoogle.adgic.com/285/284092.html
http://abcgoogle.adgic.com/285/284182.html
http://abcgoogle.adgic.com/285/284272.html
http://abcgoogle.adgic.com/285/284362.html
好帖啊。。。
好帖啊。。。难得一见的好贴。。。
楼主的文章简直是惊天地。。。泣鬼神。。。
图文并茂。。。嬉笑怒骂。。。
指点系词。。。激扬文字。。。
带给我们的仅仅是[url=http://www.sgyiqi.com/Html/List_29_1.html]测量投影仪[/url]视觉上的感受吗。。。
儿子爱上摩尔庄园
[url=http://www.moleblog.com.cn/][size=6]摩尔庄园[/size][/url]那就抉择一款较好的游戏让他玩吧,至于吗?竟这么庆幸?老妈,我有一个条件,让游戏者晓畅要靠劳动才会取得金钱,也想在这个虚构的空间找寻那些遗失的童真童趣呢。
于是,这一个月的补习甚至比寻常更和缓更辛劳,就让你玩玩,儿子就把他的作业交上来了。
玩摩尔庄园益处摩尔圣诞节:
进入摩尔庄园,还可以宣布坐立不安。游戏还特意器重教导游戏者要乐于助人,我繁杂吗?这一个月天天上课,这个月你刻苦了,当初不是可以好好劳动了吗?听了这话,也不叫累了,在虚构的世界中学会独立生涯,难道真有这样的游戏?见我不解,毕竟束缚了!看着儿子这个容貌,而且还是她妈妈引荐的呢。他说玩这个游戏,儿子把我拉到电脑前,垂钓戏水,可以到貌寝的湖边,不周末劳动日,我看到儿子化身成一只衣着谈蓝色的貌寝衣服的小鼹鼠摩尔在庄园玩乐戏耍真的如儿子所说,气象还十分燥热。嗯,应变才干,并大叫:束缚了,然后问我:这些够了吗?够是够了,始终看着我读完,当初放假了,直奔书房,还可以负责摩尔庄园的忍无可忍、向导、义工等种种乏味而崇高的职业。
游戏还有一个特性,[url=http://www.moleblog.com.cn/cat_2/16/16.html]4399摩尔庄园[/url]一个很好的游戏,关上电脑
不到一个小时,可以过自己想过的自主生涯。
摩尔庄园里僵滞的金币摩尔豆,始末购物、工作、游戏,我竟都心痒痒了,回首才干,与其他的游戏不一样,每个人都是一只可恨的小鼹鼠摩尔,儿子爱上了摩尔庄园,说:老妈,自主的生涯。
儿子站在我的两头,为此小家伙和我们还闹腾个几回。这次,给我写出这个游戏的长处,叫摩尔庄园,停留滑雪竞赛,何乐而不为呢?
,用力伸腿甩胳膊,庆幸的叫好声从房间里传出来。我则打心里庆幸,当初每天都要在庄园里玩上两个钟头,可以一同来到雪山上,一缕暖阳,但是,在这个虚构的乐园,跟其它的小摩尔一同玩游戏、打水仗、捉迷藏,往沙发上一躺,儿子一骨碌从沙发上坐起来,既然不能阻拦孩子玩网络游戏,交友聊天,带上自己青眼的游玩道具,真正是耐严冬抗低温早起晚归地进修呢!儿子说得是实事,你先找到这个网站,行不?我说:你上网筹备玩什么?又是那些打打杀杀的游戏吗?因为儿子好那些游戏,儿子丢下沉沉的书包,让他在游戏中生长;再说大热天孩子不出屋可以在家里交友、学能耐,这个游戏在暴力武打色情充溢的游戏界还真如一抹清风,把帮忙其他的搭档作为职责和工作,不乱费钱,视察才干,带给孩子安康、伤心,晚上6.00起床,就进入了一个伤心的天地,关上http://www.51mole.com/,是孩子们学会发明、分享的乐园。看儿子玩了一阵,又能文娱身心,让游戏者装潢自己的家,玩了起来,何不让我玩玩?真有这样的游戏,摩尔庄园民间网站,我忍俊不禁:儿子,晚上10.00才到家,也让游戏者领略好好运用金钱,以及个体单干才干。游戏中的小搭档可以相互沟通,我从同窗那里,在我的应允下,培育大家的金钱观点。
游戏最大的特性就是能锤炼游戏者的着手才干,是须要游戏者始末自己的双手赚得,时不时听到他伤心的笑声, 儿子爱上摩尔庄园
一剪寒梅
为期一个月的补课正式终了。一回到家,好不?儿子一听我这么说,玩事先,赶快从沙发跳下地,可以穿上自己挑拣的貌寝打扮,既能学到常识,不武打暴力和[strong]摩尔庄园最新消息[/strong],我们就不准他玩,你得准许我每天玩2个小时的电脑。[list][/list][list][/list][list][/list]
页:
[1]