[ZLG-ARM] Linus谈如何写一个操作系统

[复制链接]
2372|1
 楼主| reeper 发表于 2009-4-6 17:32 | 显示全部楼层 |阅读模式
在下面的post中,Linus描述了自己开发OS的过程。。。<br />------------------------------------------------------<br />From:&nbsp;torvalds@klaava.Helsinki.FI&nbsp;(Linus&nbsp;Benedict&nbsp;Torvalds)<br />Newsgroups:&nbsp;comp.os.linux<br />Subject:&nbsp;Re:&nbsp;Writing&nbsp;an&nbsp;OS&nbsp;-&nbsp;questions&nbsp;!!<br />Message-ID:&nbsp;&lt1992May5.075817.15984@klaava.Helsinki.FI&gt<br />Date:&nbsp;5&nbsp;May&nbsp;92&nbsp;07:58:17&nbsp;GMT<br />References:&nbsp;&lt10685@inews.intel.com&gt<br />Organization:&nbsp;University&nbsp;of&nbsp;Helsinki<br />Lines:&nbsp;136<br /><br />In&nbsp;article&nbsp;&lt10685@inews.intel.com&gt&nbsp;nani@td2cad.intel.com&nbsp;(V.&nbsp;Narayanan)&nbsp;writes:<br />&gt<br />&gtHi&nbsp;folks,<br />&gt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For&nbsp;quite&nbsp;some&nbsp;time&nbsp;this&nbsp;'novice'&nbsp;has&nbsp;been&nbsp;wondering&nbsp;as&nbsp;to&nbsp;how&nbsp;one&nbsp;goes<br />&gtabout&nbsp;the&nbsp;task&nbsp;of&nbsp;writing&nbsp;an&nbsp;OS&nbsp;from&nbsp;'scratch'.&nbsp;&nbsp;So&nbsp;here&nbsp;are&nbsp;some&nbsp;questions,<br />&gtand&nbsp;I&nbsp;would&nbsp;appreciate&nbsp;if&nbsp;you&nbsp;could&nbsp;take&nbsp;time&nbsp;to&nbsp;answer&nbsp;'em.<br />Well,&nbsp;I&nbsp;see&nbsp;someone&nbsp;else&nbsp;already&nbsp;answered,&nbsp;but&nbsp;I&nbsp;thought&nbsp;I'd&nbsp;take&nbsp;on&nbsp;the<br />linux-specific&nbsp;parts.&nbsp;&nbsp;Just&nbsp;my&nbsp;personal&nbsp;experiences,&nbsp;and&nbsp;I&nbsp;don't&nbsp;know<br />how&nbsp;normal&nbsp;those&nbsp;are.<br />&gt1)&nbsp;How&nbsp;would&nbsp;you&nbsp;typically&nbsp;debug&nbsp;the&nbsp;kernel&nbsp;during&nbsp;the&nbsp;development&nbsp;phase?<br />Depends&nbsp;on&nbsp;both&nbsp;the&nbsp;machine&nbsp;and&nbsp;how&nbsp;far&nbsp;you&nbsp;have&nbsp;gotten&nbsp;on&nbsp;the&nbsp;kernel:<br />on&nbsp;more&nbsp;simple&nbsp;systems&nbsp;it's&nbsp;generally&nbsp;easier&nbsp;to&nbsp;set&nbsp;up.&nbsp;Here's&nbsp;what&nbsp;I<br />had&nbsp;to&nbsp;do&nbsp;on&nbsp;a&nbsp;386&nbsp;in&nbsp;protected&nbsp;mode.<br />The&nbsp;worst&nbsp;part&nbsp;is&nbsp;starting&nbsp;off:&nbsp;after&nbsp;you&nbsp;have&nbsp;even&nbsp;a&nbsp;minimal&nbsp;system&nbsp;you<br />can&nbsp;use&nbsp;printf&nbsp;etc,&nbsp;but&nbsp;moving&nbsp;to&nbsp;protected&nbsp;mode&nbsp;on&nbsp;a&nbsp;386&nbsp;isn't&nbsp;fun,<br />especially&nbsp;if&nbsp;you&nbsp;at&nbsp;first&nbsp;don't&nbsp;know&nbsp;the&nbsp;architecture&nbsp;very&nbsp;well.&nbsp;&nbsp;It's<br />distressingly&nbsp;easy&nbsp;to&nbsp;reboot&nbsp;the&nbsp;system&nbsp;at&nbsp;this&nbsp;stage:&nbsp;if&nbsp;the&nbsp;386<br />notices&nbsp;something&nbsp;is&nbsp;wrong,&nbsp;it&nbsp;shuts&nbsp;down&nbsp;and&nbsp;reboots&nbsp;-&nbsp;you&nbsp;don't&nbsp;even<br />get&nbsp;a&nbsp;chance&nbsp;to&nbsp;see&nbsp;what's&nbsp;wrong.<br />Printf()&nbsp;isn't&nbsp;very&nbsp;useful&nbsp;-&nbsp;a&nbsp;reboot&nbsp;also&nbsp;clears&nbsp;the&nbsp;screen,&nbsp;and<br />anyway,&nbsp;you&nbsp;have&nbsp;to&nbsp;have&nbsp;access&nbsp;to&nbsp;video-mem,&nbsp;which&nbsp;might&nbsp;fail&nbsp;if&nbsp;your<br />segments&nbsp;are&nbsp;incorrect&nbsp;etc.&nbsp;&nbsp;Don't&nbsp;even&nbsp;think&nbsp;about&nbsp;debuggers:&nbsp;no<br />debugger&nbsp;I&nbsp;know&nbsp;of&nbsp;can&nbsp;follow&nbsp;a&nbsp;386&nbsp;into&nbsp;protected&nbsp;mode.&nbsp;&nbsp;A&nbsp;386&nbsp;emulator<br />might&nbsp;do&nbsp;the&nbsp;job,&nbsp;or&nbsp;some&nbsp;heavy&nbsp;hardware,&nbsp;but&nbsp;that&nbsp;isn't&nbsp;usually<br />feasible.<br />What&nbsp;I&nbsp;used&nbsp;was&nbsp;a&nbsp;simple&nbsp;killing-loop:&nbsp;I&nbsp;put&nbsp;in&nbsp;statements&nbsp;like<br />die:<br />jmp&nbsp;die<br />at&nbsp;strategic&nbsp;places.&nbsp;&nbsp;If&nbsp;it&nbsp;locked&nbsp;up,&nbsp;you&nbsp;were&nbsp;ok,&nbsp;if&nbsp;it&nbsp;rebooted,&nbsp;you<br />knew&nbsp;at&nbsp;least&nbsp;it&nbsp;happened&nbsp;before&nbsp;the&nbsp;die-loop.&nbsp;&nbsp;Alternatively,&nbsp;you&nbsp;might<br />use&nbsp;the&nbsp;sound&nbsp;io&nbsp;ports&nbsp;for&nbsp;some&nbsp;sound-clues,&nbsp;but&nbsp;as&nbsp;I&nbsp;had&nbsp;no&nbsp;experience<br />with&nbsp;PC&nbsp;hardware,&nbsp;I&nbsp;didn't&nbsp;even&nbsp;use&nbsp;that.&nbsp;&nbsp;I'm&nbsp;not&nbsp;saying&nbsp;this&nbsp;is&nbsp;the<br />only&nbsp;way:&nbsp;I&nbsp;didn't&nbsp;start&nbsp;off&nbsp;to&nbsp;write&nbsp;a&nbsp;kernel,&nbsp;I&nbsp;just&nbsp;wanted&nbsp;to&nbsp;explore<br />the&nbsp;386&nbsp;task-switching&nbsp;primitives&nbsp;etc,&nbsp;and&nbsp;that's&nbsp;how&nbsp;I&nbsp;started&nbsp;off&nbsp;(in<br />about&nbsp;April-91).<br />After&nbsp;you&nbsp;have&nbsp;a&nbsp;minimal&nbsp;system&nbsp;up&nbsp;and&nbsp;can&nbsp;use&nbsp;the&nbsp;screen&nbsp;for&nbsp;output,&nbsp;it<br />gets&nbsp;a&nbsp;bit&nbsp;easier,&nbsp;but&nbsp;that's&nbsp;when&nbsp;you&nbsp;have&nbsp;to&nbsp;enable&nbsp;interrupts.&nbsp;Bang,<br />instant&nbsp;reboot,&nbsp;and&nbsp;back&nbsp;to&nbsp;the&nbsp;old&nbsp;way.&nbsp;All&nbsp;in&nbsp;all,&nbsp;it&nbsp;took&nbsp;about&nbsp;2<br />months&nbsp;for&nbsp;me&nbsp;to&nbsp;get&nbsp;all&nbsp;the&nbsp;386&nbsp;things&nbsp;pretty&nbsp;well&nbsp;sorted&nbsp;out&nbsp;so&nbsp;that&nbsp;I<br />no&nbsp;longer&nbsp;had&nbsp;to&nbsp;count&nbsp;on&nbsp;avoiding&nbsp;rebooting&nbsp;at&nbsp;once,&nbsp;and&nbsp;having&nbsp;the<br />basic&nbsp;things&nbsp;set&nbsp;up&nbsp;(paging,&nbsp;timer-interrupt&nbsp;and&nbsp;a&nbsp;simple&nbsp;task-switcher<br />to&nbsp;test&nbsp;out&nbsp;the&nbsp;segments&nbsp;etc).<br />&gt2)&nbsp;Can&nbsp;you&nbsp;test&nbsp;the&nbsp;kernel&nbsp;functionality&nbsp;by&nbsp;running&nbsp;it&nbsp;as&nbsp;a&nbsp;process&nbsp;on&nbsp;a<br />&gt&nbsp;&nbsp;&nbsp;different&nbsp;OS?&nbsp;&nbsp;Wouldn't&nbsp;the&nbsp;OS(the&nbsp;development&nbsp;environment)&nbsp;generate<br />&gt&nbsp;&nbsp;&nbsp;exceptions&nbsp;in&nbsp;cases&nbsp;when&nbsp;the&nbsp;kernel&nbsp;(of&nbsp;the&nbsp;new&nbsp;OS)&nbsp;tries&nbsp;to&nbsp;modify<br />&gt&nbsp;&nbsp;&nbsp;'priviledged'&nbsp;registers?<br />Yes,&nbsp;it's&nbsp;generally&nbsp;possible&nbsp;for&nbsp;some&nbsp;things,&nbsp;but&nbsp;eg&nbsp;device&nbsp;drivers<br />usually&nbsp;have&nbsp;to&nbsp;be&nbsp;tested&nbsp;out&nbsp;on&nbsp;the&nbsp;bare&nbsp;machine.&nbsp;&nbsp;I&nbsp;used&nbsp;minix&nbsp;to<br />develop&nbsp;linux,&nbsp;so&nbsp;I&nbsp;had&nbsp;no&nbsp;access&nbsp;to&nbsp;IO&nbsp;registers,&nbsp;interrupts&nbsp;etc.&nbsp;<br />Under&nbsp;DOS&nbsp;it&nbsp;would&nbsp;have&nbsp;been&nbsp;possible&nbsp;to&nbsp;get&nbsp;access&nbsp;to&nbsp;all&nbsp;these,&nbsp;but<br />then&nbsp;you&nbsp;don't&nbsp;have&nbsp;32-bit&nbsp;mode.&nbsp;&nbsp;Intel&nbsp;isn't&nbsp;that&nbsp;great&nbsp;-&nbsp;it&nbsp;would<br />probably&nbsp;have&nbsp;been&nbsp;much&nbsp;easier&nbsp;on&nbsp;a&nbsp;68040&nbsp;or&nbsp;similar.&nbsp;<br />So&nbsp;after&nbsp;getting&nbsp;a&nbsp;simple&nbsp;task-switcher&nbsp;(it&nbsp;switched&nbsp;between&nbsp;two<br />processes&nbsp;that&nbsp;printed&nbsp;AAAA...&nbsp;&nbsp;and&nbsp;BBBB...&nbsp;&nbsp;respectively&nbsp;by&nbsp;using&nbsp;the<br />timer-interrupt&nbsp;-&nbsp;Gods&nbsp;I&nbsp;was&nbsp;proud&nbsp;over&nbsp;that),&nbsp;I&nbsp;still&nbsp;had&nbsp;to&nbsp;continue<br />debugging&nbsp;basically&nbsp;by&nbsp;using&nbsp;printf.&nbsp;&nbsp;The&nbsp;first&nbsp;thing&nbsp;written&nbsp;was&nbsp;the<br />keyboard&nbsp;driver:&nbsp;that's&nbsp;the&nbsp;reason&nbsp;it's&nbsp;still&nbsp;written&nbsp;completely&nbsp;in<br />assembler&nbsp;(I&nbsp;didn't&nbsp;dare&nbsp;move&nbsp;to&nbsp;C&nbsp;yet&nbsp;-&nbsp;I&nbsp;was&nbsp;still&nbsp;debugging&nbsp;at<br />about&nbsp;instruction-level).&nbsp;<br />After&nbsp;that&nbsp;I&nbsp;wrote&nbsp;the&nbsp;serial&nbsp;drivers,&nbsp;and&nbsp;voila,&nbsp;I&nbsp;had&nbsp;a&nbsp;simple<br />terminal&nbsp;program&nbsp;running&nbsp;(well,&nbsp;not&nbsp;that&nbsp;simple&nbsp;actually).&nbsp;&nbsp;It&nbsp;was&nbsp;still<br />the&nbsp;same&nbsp;two&nbsp;processes&nbsp;(AAA..),&nbsp;but&nbsp;now&nbsp;they&nbsp;read&nbsp;and&nbsp;wrote&nbsp;to&nbsp;the<br />console/serial&nbsp;lines&nbsp;instead.&nbsp;&nbsp;I&nbsp;had&nbsp;to&nbsp;reboot&nbsp;to&nbsp;get&nbsp;out&nbsp;of&nbsp;it&nbsp;all,&nbsp;but<br />it&nbsp;was&nbsp;a&nbsp;simple&nbsp;kernel.<br />After&nbsp;that&nbsp;is&nbsp;was&nbsp;plain&nbsp;sailing:&nbsp;hairy&nbsp;coding&nbsp;still,&nbsp;but&nbsp;I&nbsp;had&nbsp;some<br />devices,&nbsp;and&nbsp;debugging&nbsp;was&nbsp;easier.&nbsp;&nbsp;I&nbsp;started&nbsp;using&nbsp;C&nbsp;at&nbsp;this&nbsp;stage,&nbsp;and<br />it&nbsp;certainly&nbsp;speeds&nbsp;up&nbsp;developement.&nbsp;&nbsp;This&nbsp;is&nbsp;also&nbsp;when&nbsp;I&nbsp;start&nbsp;to&nbsp;get<br />serious&nbsp;about&nbsp;my&nbsp;megalomaniac&nbsp;ideas&nbsp;to&nbsp;make&nbsp;'a&nbsp;better&nbsp;minix&nbsp;that&nbsp;minix'.&nbsp;<br />I&nbsp;was&nbsp;hoping&nbsp;I'd&nbsp;be&nbsp;able&nbsp;to&nbsp;recompile&nbsp;gcc&nbsp;under&nbsp;linux&nbsp;some&nbsp;day...&nbsp;<br />The&nbsp;harddisk&nbsp;driver&nbsp;was&nbsp;more&nbsp;of&nbsp;the&nbsp;same:&nbsp;this&nbsp;time&nbsp;the&nbsp;problems&nbsp;with<br />bad&nbsp;documentation&nbsp;started&nbsp;to&nbsp;crop&nbsp;up.&nbsp;&nbsp;The&nbsp;PC&nbsp;may&nbsp;be&nbsp;the&nbsp;most&nbsp;used<br />architecture&nbsp;in&nbsp;the&nbsp;world&nbsp;right&nbsp;now,&nbsp;but&nbsp;that&nbsp;doesn't&nbsp;mean&nbsp;the&nbsp;docs&nbsp;are<br />any&nbsp;better:&nbsp;in&nbsp;fact&nbsp;I&nbsp;haven't&nbsp;seen&nbsp;/any/&nbsp;book&nbsp;even&nbsp;mentioning&nbsp;the&nbsp;weird<br />386-387&nbsp;coupling&nbsp;in&nbsp;an&nbsp;AT&nbsp;etc&nbsp;(Thanks&nbsp;Bruce).&nbsp;<br />After&nbsp;that,&nbsp;a&nbsp;small&nbsp;filesystem,&nbsp;and&nbsp;voila,&nbsp;you&nbsp;have&nbsp;a&nbsp;minimal&nbsp;unix.&nbsp;&nbsp;Two<br />months&nbsp;for&nbsp;basic&nbsp;setups,&nbsp;but&nbsp;then&nbsp;only&nbsp;slightly&nbsp;longer&nbsp;until&nbsp;I&nbsp;had&nbsp;a<br />disk-driver&nbsp;(seriously&nbsp;buggy,&nbsp;but&nbsp;it&nbsp;happened&nbsp;to&nbsp;work&nbsp;on&nbsp;my&nbsp;machine)&nbsp;and<br />a&nbsp;small&nbsp;filesystem.&nbsp;&nbsp;That&nbsp;was&nbsp;about&nbsp;when&nbsp;I&nbsp;made&nbsp;0.01&nbsp;available&nbsp;(late<br />august-91?&nbsp;Something&nbsp;like&nbsp;that):&nbsp;it&nbsp;wasn't&nbsp;pretty,&nbsp;it&nbsp;had&nbsp;no&nbsp;floppy<br />driver,&nbsp;and&nbsp;it&nbsp;couldn't&nbsp;do&nbsp;much&nbsp;anything.&nbsp;&nbsp;I&nbsp;don't&nbsp;think&nbsp;anybody&nbsp;ever<br />compiled&nbsp;that&nbsp;version.&nbsp;&nbsp;But&nbsp;by&nbsp;then&nbsp;I&nbsp;was&nbsp;hooked,&nbsp;and&nbsp;didn't&nbsp;want&nbsp;to<br />stop&nbsp;until&nbsp;I&nbsp;could&nbsp;chuck&nbsp;out&nbsp;minix.<br />&gt3)&nbsp;Would&nbsp;new&nbsp;linkers&nbsp;and&nbsp;loaders&nbsp;have&nbsp;to&nbsp;be&nbsp;written&nbsp;before&nbsp;you&nbsp;get&nbsp;a&nbsp;basic<br />&gt&nbsp;&nbsp;&nbsp;kernel&nbsp;running?<br />All&nbsp;versions&nbsp;up&nbsp;to&nbsp;about&nbsp;0.11&nbsp;were&nbsp;crosscompiled&nbsp;under&nbsp;minix386&nbsp;-&nbsp;as<br />were&nbsp;the&nbsp;user&nbsp;programs.&nbsp;&nbsp;I&nbsp;got&nbsp;bash&nbsp;and&nbsp;gcc&nbsp;eventually&nbsp;working&nbsp;under<br />0.02,&nbsp;and&nbsp;while&nbsp;a&nbsp;race-condition&nbsp;in&nbsp;the&nbsp;buffer-cache&nbsp;code&nbsp;prevented&nbsp;me<br />from&nbsp;recompiling&nbsp;gcc&nbsp;with&nbsp;itself,&nbsp;I&nbsp;was&nbsp;able&nbsp;to&nbsp;tackle&nbsp;smaller&nbsp;compiles.&nbsp;<br />0.03&nbsp;(October?)&nbsp;was&nbsp;able&nbsp;to&nbsp;recompile&nbsp;gcc&nbsp;under&nbsp;itself,&nbsp;and&nbsp;I&nbsp;think<br />that's&nbsp;the&nbsp;first&nbsp;version&nbsp;that&nbsp;anybody&nbsp;else&nbsp;actually&nbsp;used.&nbsp;&nbsp;Still&nbsp;no<br />floppies,&nbsp;but&nbsp;most&nbsp;of&nbsp;the&nbsp;basic&nbsp;things&nbsp;worked.<br />Afetr&nbsp;0.03&nbsp;I&nbsp;decided&nbsp;that&nbsp;the&nbsp;next&nbsp;version&nbsp;was&nbsp;actually&nbsp;useable&nbsp;(it&nbsp;was,<br />kind&nbsp;of,&nbsp;but&nbsp;boy&nbsp;is&nbsp;X&nbsp;under&nbsp;0.96&nbsp;more&nbsp;impressive),&nbsp;and&nbsp;I&nbsp;called&nbsp;the&nbsp;next<br />version&nbsp;0.10&nbsp;(November?).&nbsp;&nbsp;It&nbsp;still&nbsp;had&nbsp;a&nbsp;rather&nbsp;serious&nbsp;bug&nbsp;in&nbsp;the<br />buffer-cache&nbsp;handling&nbsp;code,&nbsp;but&nbsp;after&nbsp;patching&nbsp;that,&nbsp;it&nbsp;was&nbsp;pretty&nbsp;ok.&nbsp;<br />0.11&nbsp;(December)&nbsp;had&nbsp;the&nbsp;first&nbsp;floppy&nbsp;driver,&nbsp;and&nbsp;was&nbsp;the&nbsp;point&nbsp;where&nbsp;I<br />started&nbsp;doing&nbsp;linux&nbsp;developement&nbsp;under&nbsp;itself.&nbsp;&nbsp;Quite&nbsp;as&nbsp;well,&nbsp;as&nbsp;I<br />trashed&nbsp;my&nbsp;minix386&nbsp;partition&nbsp;by&nbsp;mistake&nbsp;when&nbsp;trying&nbsp;to&nbsp;autodial<br />/dev/hd2.<br />By&nbsp;that&nbsp;time&nbsp;others&nbsp;were&nbsp;actually&nbsp;using&nbsp;linux,&nbsp;and&nbsp;running&nbsp;out&nbsp;of<br />memory.&nbsp;&nbsp;Especially&nbsp;sad&nbsp;was&nbsp;the&nbsp;fact&nbsp;that&nbsp;gcc&nbsp;wouldn't&nbsp;work&nbsp;on&nbsp;a&nbsp;2MB<br />machine,&nbsp;and&nbsp;although&nbsp;c386&nbsp;was&nbsp;ported,&nbsp;it&nbsp;didn't&nbsp;do&nbsp;everything&nbsp;gcc&nbsp;did,<br />and&nbsp;couldn't&nbsp;recompile&nbsp;the&nbsp;kernel.&nbsp;&nbsp;So&nbsp;I&nbsp;had&nbsp;to&nbsp;implement&nbsp;disk-paging:<br />0.12&nbsp;came&nbsp;out&nbsp;in&nbsp;January&nbsp;(?)&nbsp;and&nbsp;had&nbsp;paging&nbsp;by&nbsp;me&nbsp;as&nbsp;well&nbsp;as&nbsp;job&nbsp;control<br />by&nbsp;tytso&nbsp;(and&nbsp;other&nbsp;patches:&nbsp;pmacdona&nbsp;had&nbsp;started&nbsp;on&nbsp;VC's&nbsp;etc).&nbsp;&nbsp;It&nbsp;was<br />the&nbsp;first&nbsp;release&nbsp;that&nbsp;started&nbsp;to&nbsp;have&nbsp;'non-essential'&nbsp;features,&nbsp;and<br />being&nbsp;partly&nbsp;written&nbsp;by&nbsp;others.&nbsp;&nbsp;It&nbsp;was&nbsp;also&nbsp;the&nbsp;first&nbsp;release&nbsp;that<br />actually&nbsp;did&nbsp;many&nbsp;things&nbsp;better&nbsp;than&nbsp;minix,&nbsp;and&nbsp;by&nbsp;now&nbsp;people&nbsp;started&nbsp;to<br />really&nbsp;get&nbsp;interested.&nbsp;<br />Then&nbsp;it&nbsp;was&nbsp;0.95&nbsp;in&nbsp;March,&nbsp;bugfixes&nbsp;in&nbsp;April,&nbsp;and&nbsp;soon&nbsp;0.96.&nbsp;It's<br />certainly&nbsp;been&nbsp;fun&nbsp;(and&nbsp;I&nbsp;trust&nbsp;will&nbsp;continue&nbsp;to&nbsp;be&nbsp;so)&nbsp;-&nbsp;reactions&nbsp;have<br />been&nbsp;mostly&nbsp;very&nbsp;positive,&nbsp;and&nbsp;you&nbsp;do&nbsp;learn&nbsp;a&nbsp;lot&nbsp;doing&nbsp;this&nbsp;type&nbsp;of<br />thing&nbsp;(on&nbsp;the&nbsp;other&nbsp;hand,&nbsp;your&nbsp;studies&nbsp;suffer&nbsp;in&nbsp;other&nbsp;respects&nbsp;Linus<br />&nbsp;<br /> &nbsp;&nbsp;<br />
zcying 发表于 2009-4-7 09:35 | 显示全部楼层

Linux的创始人?可惜是英文的呀

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

139

主题

185

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部