精华内容
下载资源
问答
  • MIT

    2006-08-24 11:30:00
    一位学监说:“太多的麻省理工学院毕业生在给太多的哈佛或普林斯顿的学生们打 工。”因此麻省理工学院的教纲有意识地给学生培养社会意识,强调的是“关心人生价 值和社会目标的”科技与工程。... MIT著名
    一位学监说:“太多的麻省理工学院毕业生在给太多的哈佛或普林斯顿的学生们打  
    工。”因此麻省理工学院的教纲有意识地给学生培养社会意识,强调的是“关心人生价 
    值和社会目标的”科技与工程。 
      学生手册中的漫画:左边山头上标着“秋天”,右边山头上标着“春天”——每个 
    学期都是用各种密密麻麻的课程堆积成的山头,望之令人兴叹。这幅画大概是中国古话 
    所说的“书山有路勤为径”的图解吧。 
      MIT著名的建筑巴尔克科学图书馆,是校园中为数不多的不以编号称呼的建筑。学生 
    们对这座楼情有独钟,它那拱顶曾被恶作剧的学生装饰成乳房、南瓜、人脸等等模样。 

      MIT的学生读起书来不管时间,睡起觉来也不管空间。 
      千万别以为麻省理工学院(Massachusetts Institute of Tech-nology,在美国人们 
    通常称它为“MIT”)的学生是只会读书的书呆子——这所一八六一年建校,原名“波士 
    顿理工”的学府中,有全美国最会调笑胡闹的学生们。全美国只有两所大学的校方公开 
    承认:他们容忍学生们的恶作剧——加州理工学院和麻省理工学院。两所美国较为年轻 
    的科技学院,不约而同地欣赏学生们在娱乐中体现出来的想像力,这绝非偶然。 
      样方公开宣称容忍学生恶作剧 
      年轻人当然都爱给教授、给朋友或者是对手开个玩笑。而最受欢迎的恶作剧对象, 
    还是与自己在学术或是体育上竞争的其它大学们。级找个机会灭一灭竞争者的威风,自 
    然也就意味着给自己学校长了志气。在这方面,MIT的学生们的点子之刁钻古怪,显然远 
    高于同龄人一筹。 
      MIT坐落在麻萨诸塞州美丽的剑桥小镇。剑桥紧挨波士顿,这一带是著名大学城,弹 
    丸之地集中了五所百年以上历史的名校,MIT则被公认为全美最好的理工类大学,高居《 
    美国新闻与世界报导》1998年全美最大学排行榜的第六名。 
      而哈佛却是第一,更堪称全球顶尖名校。“一山岂容二虎”?MIT学生们最津津乐道 
    的是他们怎么让哈佛的学生大惊失色。一九八二年的哈佛/耶鲁年度橄榄球比赛第二节刚 
    刚开始,突然一只巨大的气象气球从画着46码线的地底下像蘑菇云一样冉冉升起,握上 
    显赫地写着大字——“MIT”! 
      一山难容二虎 专和哈佛作对 
      又有某一年,MIT的学生在中场休息时穿着耶鲁学生行进乐队的服装混进了赛场,在 
    球场上列队拼出“MIT”三个大写字母,令观众们哭笑不得。还有一次,穿着印有“哈佛 
    大学”的运动衫的学生们,分头给观众席上的哈佛学生们每人派发一张卡片,通知他们 
    说每人都将卡片向空中翻开的话,就会组成“打败叭喇狗”这句话(叭喇狗是耶鲁球队 
    的象征)。结果呢?信以为真的哈佛学生们组成的自然是“MIT”三个大字。MIT学生们 
    又一次“阴谋得逞”。 
      还有更精彩的事例呢,只是其真实性有待证明。据说某年的整个秋季都有一个学生 
    在哈佛的橄榄球赛场上吹着声音尖利的哨子,喂栖息在赛场周围的鸟儿。当被问起他在 
    做什么,他总是说自己是哈佛学生,在为生物课作研究。感恩节时,一年一度的哈佛橄 
    榄球赛隆重开场,裁判神气活现地吹了一声口哨,没想到立刻有数百只鸟儿铺天盖地向 
    他扑来!原来那喂鸟人是MIT生物系的学生,整个秋季煞费苦心地把鸟儿训练得条件反射 
    ,一听到口哨,就以为有人给它们送吃的来了。哈佛人又一次落下了笑柄。 
      校博物馆收藏恶作剧道具 
      MIT学生在自己学校搞的鬼名堂也不少。一九七九年一天,MIT最著名的建筑巴尔克 
    工程图书馆一百四十八英尺高的巨大圆形拱顶,被工程系学生们装饰成一只巨大的乳房 
    。在装粉红色的乳头时,由于风向不顺和运气不好,头三次试装都告失败,直到第四次 
    费了九牛二虎之力才成功。在这之前,那拱顶党政军被装饰成一只蜡烛、一个人脸和一 
    只南瓜等等,不过恐怕哪 
    一次都没有这些给人留下的印象深刻。 
      MIT的校方,对自己学生的恶作剧一直保持着宽容,甚至是默许的态度。MIT有专门 
    的博物馆收藏学生们这些恶作剧的道具,党政军出了精美的画册。在“气象气球”事件 
    发生之后,启动握的装置落到了哈佛的手中,MIT当时地的校长保罗·格雷颇费了一番口 
    舌才把装置要回来——他特地给哈佛的校长德进而克·波克写了一封信: 
      亲爱的德里克: 
      我得到口信儿说你们的校园警方手中扣着一些本该是在MIT博物馆里的陈列品。这会 
    是真的吗?你们应该用不着这个用吸尘器零件、一九六七年汽车废件和几个弹球拼凑成 
    的代用装置吧?我们呢,因为比较多愁善感,将会小心地保护——是的,我们将会珍藏 
    ——这个一九八二年橄榄球季度高潮的象征。请把它还回来。你的诚挚的,保罗·E·格 
    雷 
      哈佛把气球装置还给了MIT,而MIT果然把它陈列在博物馆里,并且为这项成功的恶 
    作剧而骄傲。用校长格雷的话来说:“MIT的精神,它的创造力和细心,不仅在学术性的 
    ,也在轻松的项目中得到体现。幽默……是这个独特的社团中不可缺少的一部分。” 
      “学习”,“睡眠”和“朋友”三者必舍其一 
      当然,娱乐的时候只是少数,只是繁忙而艰苦的学习生活中的小花絮。MIT的学生们 
    在学习上下的苦功也是著名的。“他们把我们赶得像驴子一样。”有学生抱怨说。另一 
    个说MIT的学习气氛简直“能把人逼得精神分裂”。一位华裔著名专家曾告诉过我父亲, 
    他的儿子实在受不了那种压力,上了两年后决定放弃,转到了其它学校。 
      教授留的作业以多和难著称,有些课“难名昭著”,令学生们望而生畏——比如“ 
    电脑程序”的结构与理解,“线路与电器”和“热力学与动力学”,就是能让学生们为 
    了过关只得彻夜不眠的“杀人课”。新生们在MIT第一年上的课都不打字母表示的成绩, 
    只分等级:“通过”“D”或“不通过”(校方近两年来把及格的成绩由D变成了C)。校 
    方这样规定,主要是为了放学生们一马,让他们能有足够时间来适应MIT紧张的节奏。 
      尽管如此,学生们仍然叫苦连天。有人说,在MIT,一个政党人在“学习”,“睡眠 
    ”和“朋友”三者中只能得到两个,而必须舍去一个——大多数学生们聪明地选择了放 
    弃睡眠。 
      “红地毯”与苦行僧 
      MIT坐落在查尔斯河边。这条河并不算长,河水却湛蓝清澈,波光,安详平静地流淌 
    ,两岸林木掩映,让人心旷神怡。 
      历史书告诉我们,当英格兰首批移民乘坐“五月花号”来到新大陆安营扎寨,站稳 
    脚跟后,就在查尔斯河口处选址建立了三座城市,各有分工:波士顿是政治、经济中心 
    ,查尔斯是港口城市、交通枢纽,而剑桥,则是文化教育中心。可能正因为这各盼工, 
    剑桥镇没有浮华喧嚣,到处古风犹存,红砖尖顶的房屋,古堡式钟楼,百年老树几步一 
    株。尤其有特点的是其红砖铺地的人行道,我读到过一篇文章,颇有诗意地将它比作“ 
    通往知识之宫的红地毯”。 
      然而MIT的校园却以实用而并不美观著称,尽管有一批校舍是华裔建筑大师贝聿铭设 
    计的,还是有不少人抱怨它“像个工厂”,校舍就像车间厂房。校园里的大楼不像美国 
    其它大学的惯例,冠以著名人物的姓名,而是只用冷冰冰、死板板的编号。 
      在美国东北部漫长的冬天里,在杜燥的校园中,在繁重的学业压力下,一些学生情 
    绪陷入低潮自是不难想见,他们对自己的学校也是爱恨交加。“我恨这个该死的地方” 
    据说是MIT学生们最常说的一句话。校内男生们抱怨的另一件事就是女生太少。尽管校方 
    每年都努力地针对女生宣传,吸引她们跨进本校,但MIT的男女比例仍是始终浮动在2比 
    1左右。有的男生抱怨说,“一千一百多人的年级里只有六七个漂亮女生。”幸好,不远 
    就是女校卫斯理学院,恐怕对自己学校也有类似的抱怨,于是与MIT“互通有无”。 
      最强项是科技 
      MIT毫不讳言地称自己为一所“科技学校”。“尽管这里人文和社会科学科目也不错 
    ,但我们的强荐确实是科学。”学生们到这里来是因为他们对科学感兴趣。这里所有的 
    科学系都出类拔萃,走在全国大学科技的前端。电子工程和电脑科学是全美国公认的第 
    一。生物医学工程、化学工程、机械工程、物理,以及规模不大的航空系和天文系都是 
    声誉极高的专业,医学科技、生物工程都是该领域的领袖。不过,总的来说,纯科学的 
    领域所受欢迎的程度比不上工程和电脑科学领域。 
      MIT强调的是“关心人生价值和社会目标的”科技与工程,因此,在人文方面尽管选 
    择相对较少,却也很下功夫,吸引到不少经济、政治、管理、程式设计规划、现代艺术 
    等等“非科技的”和“跟电脑沾得上边的”人文系教授。MIT最有名的教授,大概是语言 
    学的权威诺姆·乔姆斯基(Norm 
    Chomsky)。而且选这些科目的学生们因为人数极少,得到的个人关注也令别的大学的学 
    生们艳羡不已。 
      校方认为未来的工程师们不仅得拥有一流的专业技术,还得具有对社会系统的深刻 
    了解。一位学监说:“太多的MIT毕业生在给太多的哈佛或普林斯顿的学生们打工。”因 
    此,MIT的教纲有意识地给学生们培养社会意识。学生们必须在毕业前上八门诸如文学传 
    统或是政治制度的起源之类的人文课程。也许是为了让他们在以后把所做出的重大科技 
    发现公布于世时,能够引人入胜,学生们还得上两学期的写作课。主攻科技的学生们还 
    可以选择一门非科技的副科,比如哲学,甚至妇女研究。另外,学生们得上四门体育课 
    ,还得在一年级的结束之际通过游泳考试,不然不能升级。 
      在学习中研究 在研究中学习 
      不甘于光是学习,也想同时搞些研究的学生绝不少见,而校方也尽量给他们机会和 
    方便,MIT这个专门培养发明家的学府,在教育上最成功的一项发明正是它的“本科研究 
    机会项目”(UROP):让学生与教授搭档来同搞研究,学生可以得到额外的学分或是挣 
    得一些资助——当然,更大的收获是学到了本事。UROP是全国同类项目中最好的,也是 
    使许多学生们选择MIT的主要原因。 
      “试验学习组”则让一年级或是二年级学生用个别指导的方式和“自己的速度”来 
    学习,而不用去跟一两百人挤在大礼堂里听课。学校里各种科技设备应有尽有,如果校 
    园里没有的,在波士顿也一定有。学院图书馆里有二百五十万册藏书,学校著名的电脑 
    网络“雅典娜”只是它庞大的电脑系统的一小部分。 
      聪明的学生也会干蠢事 
      什么样的学生是MIT的典型学生?——在高中是不可一世的数学、科技奇才,全美考 
    试SAT中的数学部分拿满分(当然,语文部分也名列前茅),是学校数学和物理队的头一 
    把交椅,市城、郡里、州里科学竞赛的冠军。在别的方面,他也绝不比人差。他很可能 
    是辩论比赛的冠军,是够专业水平的小提琴手或是钢琴手,更有可能是体育健将。MIT对 
    体育极为注重,它有全国第二多的校体育队——三十九个,仅次于哈佛大学的四十二个 
    。男子长跑、网球、女子曲棍球、击剑和划船都在全美国高等学府中排得上名次。更为 
    丰富多彩的是校内非竞争性的体育活动,从打乒乓球到篮球、排球,每个人都可以从MI 
    T的体育设施中得到乐趣。MIT校内的各种各样的组织、俱乐部,据说也是全美国大学中 
    最多的,从“热带鱼社团”到“摇铃者集会”,学生们的选择应有尽有。 
      MIT的学生学得努力,玩得也一样努力。这一点也体现在校园里兄弟会、姊妹会的泛 
    滥。多达百分之五十的男生,和百分之三十的女生都参加了兄弟会姊妹会,每到周末大 
    开派对,引得附近学校的学生们都来参加。MIT的学生自吹自擂地说他们的派对“是东北 
    部最好的”。 
      派对里必会有酒,而不够年龄的学生在兄弟会里的酗酒情况十分普遍。去年十月, 
    一名新生在兄弟会入会仪式中猛劲灌酒,结果乐极生悲,酒精中毒而死,引起全美国震 
    惊,报刊大幅报道,又连带揭露许多兄弟会、姊妹会入会仪式中的酗酒现象。 
      MIT校方这下算是现了眼,为了挽救校纪、挽救校风、更挽救校誉,当即下令暂停所 
    有兄弟会姊妹会的活动,并且制订更严格的规定来控制低龄喝酒现象。美国其它大学也 
    纷纷自我检讨,风波过了好一段时间才渐渐平息。  
     
    展开全文
  • ./grade-lab-syscall trace
  • Mit6.S081-实验9-file system

    万次阅读 2021-04-14 18:42:57
    Mit6.S081-实验9-file system一、实验准备二、Large files1,准备工作2,要看什么3,你的工作4,提示5,具体实现 一、实验准备 在本实验中,你将添加大量文件和符号链接到xv6文件系统。 在写代码前,你该从xv6 book...

    一、实验准备

    在本实验中,你将添加大量文件和符号链接到xv6文件系统。
    在写代码前,你该从xv6 book中读章节8:File system,并学习相关代码。
    获取本实验xv6源代码,并检出fs分支:
    get fetch、git checkout fs、make clean
    

    二、Large files

    1,准备工作

    mkfs程序创建xv6文件系统磁盘镜像,并决定文件系统总共有多少blocks;尺寸由kernel/param.h的FSSIZE控制。
    那你将看到本实验仓库中的FSSIZE设置为了200000个blocks。
    你应该可以在make输出中,看到来自mkfs/mkfs的输出:
    nmeta 70(boot, super, log blocks 30 inode blocks 13, bitmap 25)blocks 1999930 total 200000	
    这行描述了mkfs/mkfs构建的文件系统:它有70个meta-data blocks(blocks用于描述文件系统),并且199930个数据blocks,总共200000blocks。
    实验中任何时候,如果你发现你不得不从scratch重构文件系统,你可以执行make clean,强制make来重构fs.img。
    

    2,要看什么

    一个磁盘inode的格式定义在fs.h的struct dinode。
    你要特别注意NDIRECT、NINDIRECT、MAXFILE以及struct dinode的addrs[]元素。
    xv6 text中的图8.3,看标准xv6 inode图解。
    查看磁盘上文件数据的代码在fs.c的bmap()。查看它,并确认你理解它做了什么。
    bmap()在读写文件时被调用。
    当写时,bmap()按需分配新blocks来持有文件内容,而且如果需要持有block地址,分配一个indirect block。
    bmap()处理两种block编号。
    bn参数是一个逻辑block编号,文件中的block编号,与文件起始位置有关。
    ip->addrs[]中的block编号,bread()中的参数,是磁盘block编号。
    你可以将bmap()视作:将一个文件内的逻辑block编号映射为磁盘block编号。
    

    3,你的工作

    修改bmap(),以便于除了direct blocks和singly-indirect block之外,实现一个doubly-indirect block。
    你将只有11个direct blocks,而不是12个,为你的新doubly-indirect block制作空间;
    你不被允许改变磁盘inode的尺寸。
    ip->addrs[]的前11个元素应该是direct blocks;第12个应该是singly-indirect block(就想当前这个);
    第13个应该是你的新doubly-indirect block。
    当bigfile写65803 blocks,且usertests执行成功时,你完成了此练习。
    
    $ bigfile
    .......................................................................................
    wrote 65803 blocks
    done; ok
    $ usertests
    ...
    ALL TESTS PASSED
    
    bigfile将花费至少1分半来执行。
    

    4,提示

    确保你理解bmap()。写出ip->addrs[]的关系图,indirect block,doubly-indirect block、singly-indirect block、data blocks。 
    确保你理解为什么添加一个doubly-indirect block,可以提升文件最大尺寸256*256blocks(实际还要-1,因为你不得不减少一个direct blocks编号)。
    考虑如何用逻辑block编号,来索引doubly-indirect block以及它指向的indirect block。
    如果你改变NDIRECT的定义,你将可能不得不改变file.h struct inode addrs[]的声明。确保struct inode和struct dinode在它们的addrs[]数组中有同样的元素编号。
    如果你修改NDIRECT的定义,确保创建一个新的fs.img,因为mkfs使用NDIRECT来构建文件系统。
    如果你的文件系统陷入错误状态,可能由于崩溃,删除fs.img(在unix中做,并非xv6)。make将构建一个新的、干净的文件系统镜像给你。
    不要忘记brelse()每个你bread()的block。
    你该仅在需要时分配indirect blocks和doubly-indirect blocks,像原始的bmap()。
    确认itrunc()释放掉文件所有blocks,包括double-indirect blocks。
    

    5,具体实现

    1)修改kernel/fs.h。
    在这里插入图片描述
    2)修改kernel/file.h。
    在这里插入图片描述
    3)修改kernel/fs.c的bmap函数。
    在这里插入图片描述

    6,测试结果

    在这里插入图片描述
    在这里插入图片描述

    三、Symbolic links

    1,实验要求

    在本练习中,你将添加符号链接到xv6。
    符号链接(或软链接)指的是一个通过路径名称进行链接的文件;
    当一个符号链接是打开时,kernel通过link找到指向的文件。
    符号链接与hard links相似,但hard links被限制为指向同一磁盘上的文件,然而符号链接可以跨磁盘设备。
    尽管xv6不支持多设备,实现这个system call是一个好的练习,用于理解路径名称查询机制。
    

    2,你的工作

    你将实现symlink(char *target, char *path) system call,它在path创建一个新符号链接,指向名为target的文件。
    更多信息,看symlink操作手册页。
    为了测试,添加symlinktest到Makefile并执行它。
    当测试产生下面输出(包括usertests succeeding)你的方案就完成了。
    
    $ symlinktest
    Start: test symlinks
    test symlinks: ok
    Start: test concurrent symlinks
    test concurrent symlinks: ok
    $ usertests
    ...
    ALL TESTS PASSED
    

    3,提示

    首先,为symlink创建一个system call编号,在user/usys.pl、user/user.h添加一个入口,并在kernel/sysfile.c实现空sys_symlink。
    添加新文件类型(T_SYMLINK)到kernel/stat.h来代表一个符号链接。
    添加一个新标志位到kernel/fcntl.h,(O_NOFOLLOW),可以用在open system call中。注意传到open的标志位,用位运算OR操作符结合,因此你的新标志位,不应该遮盖任何已存在标志位。一旦你把它加到Makefile,这将让你编译user/symlinktest.c。
    实现symlink(target, path)system call,在path(指向target)创建一个新符号链接。注意,对于system call成功,target无需存在。你将需要选择某处来存储符号链接的target path,例如,在inode的data blocks中。symlink应该返回一个整数,0代表成功,-1代表失败,与link和unlink相似。
    更改open system call来处理这种情况:path指的是一个符号链接。如果文件不存在,open必须失败。当进程在传到open的标志位中明确O_NOFOLLOW,open应该打开symlink(且不follow符号链接)。
    如果被链接的文件也是一个符号链接,你必须递归查询,直到抵达一个非链接文件。如果链接构成一个循环,你必须返回一个错误码。你可以近似判断,如果链接深度达到阈值(比如10)返回错误码。
    其他system call(比如link和unlink)必须不follow符号链接;这些system calls操作符号链表本身。
    本实验中,你无需处理目录符号链表。
    

    4,具体实现

    1)修改kernel/syscall.h。
    在这里插入图片描述
    2)修改kernel/usys.pl。
    在这里插入图片描述
    3)修改kernel/user.h。
    在这里插入图片描述
    4)修改kernel/syscall.c。
    在这里插入图片描述
    5)修改kernel/stat.h。
    在这里插入图片描述
    6)修改kernel/fcntl.h。
    在这里插入图片描述
    7)修改kernel/sysfile.c。实现sys_symlink函数。
    在这里插入图片描述
    8)修改kernel/sysfile.c。修改sys_open函数。
    在这里插入图片描述
    在这里插入图片描述
    9)修改kernel/Makefile。
    在这里插入图片描述

    5,测试结果

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • MIT算法导论MIT

    2011-06-02 20:46:52
    MIT算法导论 MIT算法导论 MIT算法导论 MIT算法导论 MIT算法导论
  • Mit6.S081-实验10-mmap

    万次阅读 2021-04-21 23:48:04
    Mit6.S081-实验10-mmap一、实验准备二、mmap1,mmap函数说明2,实验要求3,一些提示4,具体实现5,测试结果 一、实验准备 mmap和munmap system call允许UNIX程序详细使用它们的地址空间。 它们可以被用来在进程间...

    一、实验准备

    mmap和munmap system call允许UNIX程序详细使用它们的地址空间。
    它们可以被用来在进程间共享内存,映射文件到进程地址空间,作为用户级page fault方案的一部分,例如课堂上讨论的GC算法。在本实验中,你将添加mmap和munmap到xv6,聚焦于内存映射文件。
    获取本实验xv6源码,并检出mmap分支:
    git fetch、git checkout mmap、make clean
    

    二、mmap

    1,mmap函数说明

    操作手册页(执行man 2 mmap)展示mmap的声明:
    void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
    mmap可以用多种方式调用,但本实验仅需要特性(与内存映射文件相关)的子集。
    你可以假设addr将总是为0,意味着kernel应该决定映射文件的虚拟地址。
    mmap返回该地址,或失败时返回0xffffffffffffffff。length是map的字节数;它可以与文件长度不同。
    prot表明内存是否应该被映射为可读、可写、可执行;你可以假设prot是PROT_READ、PROT_WRITE或两者都有。
    flags将要么是MAP_SHARED,意味对映射内存的修改应该被写回文件,或为MAP_PRIVATE,意味着它们不会写回到文件。你无需实现flags中的任何其他位。
    fd是打开的、要映射文件的文件描述符。
    你可以假设offset为0(文件中要映射的起始点)。
    

    2,实验要求

    映射相同MAP_SHARED文件的进程没有共享物理内存是可以的。
    munmap(addr, length)应该移除已知地址范围的mmap映射。
    如果进程已经更改了内存,且映射为MAP_SHARED,更改应该首先被写到文件。
    munmap调用可能只覆盖mmap-ed区域的一部分,但你可以假设:要么unmap起始,要么unmap结束、要么整个区域(而不是在region中打孔)。
    你可以实现足够的map和munmap功能来通过mmaptest测试程序。
    如果是mmaptest不用的mmap特性,你无需实现。
    

    当你完成时,你可以看到如下输出:

    $ mmaptest
    mmap_test starting
    test mmap f
    test mmap f: OK
    test mmap private
    test mmap private: OK
    test mmap read-only
    test mmap read-only: OK
    test mmap read/write
    test mmap read/write: OK
    test mmap dirty
    test mmap dirty: OK
    test not-mapped unmap
    test not-mapped unmap: OK
    test mmap two files
    test mmap two files: OK
    mmap_test: ALL OK
    fork_test starting
    fork_test OK
    mmaptest: all tests succeeded
    $ usertests
    usertests starting
    ...
    ALL TESTS PASSED
    

    3,一些提示

    (1)
    添加_mmaptest到UPROGS,添加mmap、munmap system calls,为了让user/mmaptest.c可以编译。
    现在,仅从mmap和munmap返回错误。我们在kernel/fcntl.h定义PROT_READ等等。
    执行mmaptest,首次mmap调用失败。
    (2)
    懒填充页表,对page faults做出响应。
    mmap应该不分配物理内存或读取文件。
    而是,在usertrap page fault处理代码中,正如lazy page allocation实验中那样。
    lazy的原因是:保证mmap大文件较快,以及让mmap一个比物理内存大的文件成为可能。
    (3)
    跟踪每个进程mmap已经map的东西。
    定义一个结构对应VMA(virtual memory area),第15节课描述过,记录地址、长度、权限、文件等待。用于mmap创建的虚拟内存。
    因为xv6内核在内核中没有内存分配器,声明一个固定尺寸的VMA数组,按需从数组分配是可行的。16应该就足够了。
    (4)
    实现mmap:找一个进程地址空间中未使用区域来映射文件,添加一个VMA到进程映射区域表。
    VMA应该包含一个映射文件的struct file的指针;
    mmap应该提升文件引用数量,以便于当文件关闭时结构不会消失(提示:看filedup)。
    执行mmaptest:第一个mmap应该成功,但首次访问mmap-ed内存将导致page fault并杀掉mmaptest。
    (5)
    添加代码让mmap-ed区域的page-fault分配一页物理内存,读取相关文件的4096字节到该page,并映射它到用户地址空间。
    用readi读取文件,可以接收一个偏移参数(在文件中从此处读取),但你不得不lock/unlock传到readi中的inode。
    不要忘记设置page正确的权限。
    执行mmaptest;它应该可以获取第一个munmap。
    (6)
    实现munmap:找VMA对应地址范围,取消明确页的映射(提示:使用uvmunmap)。
    如果munmap移除之前mmap的所有页,它应该减少对应file的引用计数。
    如果一个未映射页更改了,且文件映射为MAP_SHARED,把页写回文件,看filewrite找灵感。
    (7)
    你的实现应该只写回程序真正修改过、且为MAP_SHARED的页。
    RISC-V PTE的dirty位表明这个页是否已经写过。
    然而mmaptest不会检查:非dirty页不会写回;因此你可以不看dirty标志位把数据写回去。
    (8)
    更改exit来unmap进程的已映射区域,就像调用了munmap一样。
    执行mmaptest;mmap_test应该通过,但fork_test可能不通过。
    (9)
    更改fork确保:child有和parent一样的映射区域。
    不要忘记提升VMA struct file的引用数量。
    在child的page fault handler,可以分配一个新的物理页,而不是共享parent的页。
    后者是更好的,但它需要更多实现工作。
    执行mmaptest;它应该通过mmap_test和fork_test。
    

    4,具体实现

    1)修改user/user.h,新增mmap和munmap函数声明。
    在这里插入图片描述
    2)修改kernel/syscall.h,新增SYS_mmap和SYS_munmap定义。
    在这里插入图片描述
    3)修改user/usys.pl,新增mmap和munmap函数入口。
    在这里插入图片描述
    4)修改kernel/syscall.c。
    在这里插入图片描述
    5)修改kernel/proc.c,新增lazy_grow_proc函数,用于增长进程空间。
    在这里插入图片描述
    6)修改kernel/defs.h,新增lazy_grow_proc函数声明。
    在这里插入图片描述
    7)新增kernel/vma.h,新增一个结构体vm_area_struct,用于表示VMA。
    在这里插入图片描述
    8)新增kernel/vma.c,用于初始化、分配、释放VMA。在这里插入图片描述
    9)修改kernel/defs.h,新增vma_init、vma_alloc、vma_free函数声明。
    在这里插入图片描述
    在这里插入图片描述
    10)修改kernel/main.c,用于初始化VMA。在这里插入图片描述
    11)修改kernel/proc.h,在结构体proc中,新增结构体vm_area_struct的指针数组areaps。
    在这里插入图片描述
    12)修改kernel/sysfile.c,新增函数sys_mmap。
    在这里插入图片描述
    在这里插入图片描述
    13)修改kernel/sysfile.c,新增函数sys_munmap。
    在这里插入图片描述14)修改kernel/trap.c,新增函数usertrap,实现page lazy allocation。
    在这里插入图片描述
    在这里插入图片描述
    15)修改kernel/vm.c,实现page lazy allocation。
    在这里插入图片描述
    在这里插入图片描述
    16)修改kernel/proc.c,修改函数exit。
    在这里插入图片描述
    在这里插入图片描述
    17)修改kernel/proc.c,修改函数fork。
    在这里插入图片描述
    18)修改Makefile。
    在这里插入图片描述
    在这里插入图片描述

    5,测试结果

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • Mit6.S081-实验11-networking

    万次阅读 2021-04-22 16:32:05
    Mit6.S081-实验11-networking一、实验准备二、networking1,背景2,你的工作3,提示 一、实验准备 在本实验中你将为网络接口卡(network interface card)写一个xv6设备驱动。 获取本实验xv6源码,并检出net分支: ...

    一、实验准备

    在本实验中你将为网络接口卡(network interface card)写一个xv6设备驱动。
    获取本实验xv6源码,并检出net分支:
    git fetch、git checkout net、make clean
    

    二、networking

    1,背景

    在写代码前,你会发现:重温xv6 book的“第五章:中断和设备驱动”是有帮助的。
    你将用一个被称作E1000的网络设备来处理网络通信。
    对xv6以及你写的驱动来说,E1000就像一个真正的硬件(连接到真实以太网本地局域网Ethernet Local Area Net)。
    事实上,你的驱动将要通讯的E1000是由qemu仿真的,它连接到LAN上也是qemu仿真的。
    在这个仿真的LAN上,xv6(the guest)有一个IP地址10.0.2.15。
    qemu也安排一个IP为10.0.2.2、运行qemu的计算机出现在LAN中。
    当xv6使用E1000发送一个包到10.0.2.2,qemu将包传递到对应计算机(正在运行qemu,the host)应用上。
    你将使用qemu的“用户模式网络栈”(user-mode network stack)。
    

    qemu的文档有更多有关用户模式栈的细节。地址

    我们已经更新Makefile来启用qemu的用户模式网络栈,以及E1000网卡。
    Makefile配置qemu记录所有输入、输出包到文件packets.cap到你的实验目录。
    翻看这些记录,对于确认xv6正在传递、接收的包是你期望的,有帮助。展示记录的包:
    tcpdump -XXnr packets.pcap
    我们已经添加许多文件到这个实验的xv6仓库。
    文件kernel/e1000.c包含E1000的初始化代码,以及传递、接收包的空函数(你需要填充)。
    

    kernel/e1000_dev.h包含寄存器定义、E1000定义的标志位(在因特尔E1000软件开发手册)。

    kernel/net.c和kernel/net.h包含一个简单的网络栈(实现了IP/UDP/ARP协议)。
    这些文件也包含灵活数据结构代码(承载有包),称作mbuf。
    最终,kernel/pci.c包含代码:当xv6启动时,在PCI总线上查找E1000卡。
    

    2,你的工作

    你的工作是完成e1000_transmit()和e1000_recv(),都在kernel/e1000.c,以便于驱动可以传递、接收包。
    当make grade提示你的方案通过所有测试时,就做对了。
    

    当写代码时,你会参考E1000软件开发手册。下面章节可能会有帮助。

    段2是特别重要的,给你整个设备的概览。
    段3.2给出一个包接收的概览。
    段3.3给出一个包传递的概览。
    段13给出E1000使用寄存器的概览。
    段14可以帮你理解我们提供的初始代码。
    

    浏览E1000软件开发手册

    这个手册包含几个与以太网十分相关的控制器。
    qemu模拟82540EM。
    浏览第二章了解设备。
    写驱动,你将需要熟悉第3、14章,以及4.1(并非4.1的子小节)。
    你将也需要使用章节13作为参考。
    其他章节包含了你的驱动无需交互的E1000组件。
    开始不用担心细节;只是了解文档结构,以便于之后可以找到。
    E1000有一些高级特性,绝大多数可以忽略。仅小部分基础特性需要用来完成本实验。
    e1000.c中提供给你的e1000_init()函数,配置E1000从RAM读取将要被传递的包,写接收到的包到RAM。
    这个技术称为DMA,直接内存访问,参考事实:E1000硬件直接从RAM写、读包。
    因为bursts of packets可能会比驱动处理速度快,e1000_init()给E1000提供多个buffers,E1000可以把包写到buffers。
    E1000需要的这些buffers被描述为RAM中的一组描述符;
    每个描述符包含一个RAM中的地址,E1000可以把接收到的包写到其中。
    struct rx_desc描述 描述符 格式。
    描述符数组被称为接收环或接受队列。这是一个环形:卡或驱动到达数组底部时,它转到起始处。
    e1000_init()用mbufalloc()为E1000分配mbuf包buffers,用于DMA。
    也有一个传递环,驱动把需要E1000发送的包放到里面。
    e1000_init()配置两个环的尺寸为RX_RING_SIZE和TX_RING_SIZE。
    当net.c中的网络栈需要发送一个包时,调用e1000_transmit(),用一个mbuf(持有要发送的包)。
    你的传递代码必须放置一个指针(指向包数据)到TX(transmit)环。
    struct tx_desc描述 描述符格式。
    你将需要确保每个mbuf最终被释放,仅在E1000结束传递包之后(E1000在描述符中设置E1000_TXD_STAT_DD位表示)。
    当E1000接收来自以太网的每个包时,它首先DMA包到mbuf(被下个RX ring 描述符指向),然后生成一个中断。
    你的e1000_recv()代码必须扫描RX ring,并调用net_rx()传递每个新包的mbuf到网络栈(in net.c)。
    你将需要分配一个新mbuf,并放置它到描述符,因此当E1000再次到达RX环中该点时,它就会找到一个新的buffer,DMA一个新的包到该buffer。
    除了读写RAM中的描述符环之外,你的驱动将需要与E1000内存映射控制寄存器交互,来检测何时接收到的数据包可用,并通知E1000:驱动已经用要发送的包填充到一些TX描述符。
    全局变量regs持有一个指针(指向E1000的第一个控制寄存器);你的驱动可以通过像数组一样索引regs获取其他寄存器。
    你将需要特别使用索引E1000_RDT和E1000_TDT。
    为了测试你的驱动,在一个窗口中执行make server,另外一个窗口执行make qemu,然后在xv6执行nettests。
    nettests的首个测试尝试发送一个UDP包到host操作系统,发送到make server执行的程序。
    如果你没有完成实验,E1000驱动将不会真正发送包,且什么也不会发生。
    当你完成本实验之后,E1000驱动将发送包,qemu将传递它到你的host电脑,make server将看到它,它将发送一个响应包,然后到E1000驱动,然后nettests将看到响应包。
    在host发送回复前,它发送一个ARP请求包给xv6来找到它的48位以太网地址,期望xv6对ARP做出响应。
    一旦你已经完成E1000驱动的工作,kernel/net.c将处理这。
    如果一切正常,nettests将打印testing ping: OK,make server将打印 a message from xv6!。
    tcpdump -XXnr packets.pcap应该产生起始如下的输出:
    
    reading from file packets.pcap, link-type EN10MB (Ethernet)
    15:27:40.861988 IP 10.0.2.15.2000 > 10.0.2.2.25603: UDP, length 19
            0x0000:  ffff ffff ffff 5254 0012 3456 0800 4500  ......RT..4V..E.
            0x0010:  002f 0000 0000 6411 3eae 0a00 020f 0a00  ./....d.>.......
            0x0020:  0202 07d0 6403 001b 0000 6120 6d65 7373  ....d.....a.mess
            0x0030:  6167 6520 6672 6f6d 2078 7636 21         age.from.xv6!
    15:27:40.862370 ARP, Request who-has 10.0.2.15 tell 10.0.2.2, length 28
            0x0000:  ffff ffff ffff 5255 0a00 0202 0806 0001  ......RU........
            0x0010:  0800 0604 0001 5255 0a00 0202 0a00 0202  ......RU........
            0x0020:  0000 0000 0000 0a00 020f                 ..........
    15:27:40.862844 ARP, Reply 10.0.2.15 is-at 52:54:00:12:34:56, length 28
            0x0000:  ffff ffff ffff 5254 0012 3456 0806 0001  ......RT..4V....
            0x0010:  0800 0604 0002 5254 0012 3456 0a00 020f  ......RT..4V....
            0x0020:  5255 0a00 0202 0a00 0202                 RU........
    15:27:40.863036 IP 10.0.2.2.25603 > 10.0.2.15.2000: UDP, length 17
            0x0000:  5254 0012 3456 5255 0a00 0202 0800 4500  RT..4VRU......E.
            0x0010:  002d 0000 0000 4011 62b0 0a00 0202 0a00  .-....@.b.......
            0x0020:  020f 6403 07d0 0019 3406 7468 6973 2069  ..d.....4.this.i
            0x0030:  7320 7468 6520 686f 7374 21              s.the.host!
    
    你的输出将看起来有点不同,但它应该包含字符串“ARP,Request”,“ARP,Reply”,“UDP”,“a.message.from.xv6”和“this.is.the.host”。
    nettests执行一些其他测试,最终是一个DNS请求(通过真正的互联网发送到谷歌的一个名称服务器)。
    你应该确认你的代码通过所有这些测试,之后你将看到这个输出:
    
    $ nettests
    nettests running on port 25603
    testing ping: OK
    testing single-process pings: OK
    testing multi-process pings: OK
    testing DNS
    DNS arecord for pdos.csail.mit.edu. is 128.52.129.126
    DNS OK
    all tests passed.
    
    你该确保make grade让你的方案通过。
    

    3,提示

    开始时,添加打印语句到e1000_transmit()和e1000_recv(),执行make server和nettests。
    你该从你的打印语句中看到:nettests生成一个对e1000_transmit的调用。
    一些实现e1000_transmit的提示:
    (1)首先向E1000索要TX环索引,在该索引上期待下个包,通过读E1000_TDT控制寄存器。
    (2)检测环是否溢出。如果E1000_TXD_STAT_DD没有设置在由E1000_TDT索引的描述符上,那么E1000没有结束之前的传递请求,因此返回一个错误。
    (3)另外,使用mbuffree()来释放最后的mbuf(从那个描述符被传递)。
    (4)填充描述符。m->head指向内存中包的内容,m->len为包的长度。设置必要的cmd标志位(看E1000手册中的section 3.3),暂存一个指针指向mbuf为了之后释放。
    (5)最终,通过加1到E1000_TDT,对TX_RING_SIZE取模运算,更新环位置。
    (6)如果e1000_transmit()成功地添加mbuf到环,返回0。失败(没有描述符可用于传递mbuf),返回-1,因此调用者知道释放该mbuf。
    一些实现e1000_recv的提示:
    (1)首先向E1000索要环索引,下个等待接收的包位于该索引,通过获取E1000_RDT控制寄存器的值,加1对RX_RING_SIZE取模。
    (2)通过检查描述符中status部分的E1000_RXD_STAT_DD位,检查是否新包可用。如果不可用,停止。
    (3)更新mbuf的m->len到描述符中的length。使用net_rx()传递mbuf到网络栈。
    (4)使用mbufalloc()分配一个新mbuf来取代刚刚分配过的,分配给net_rx()。让它的数据指针(m->head)放到描述符。清除描述符的状态位为0。
    (5)最终,更新E1000_RDT寄存器为环描述符最后处理的索引。
    (6)e1000_init()用mbufs初始化RX环,你将需要了解他是如何做到这一点的,也许还需要借用代码。
    (7)在一些点,已到达的包总数将超出环尺寸(16);确保你的代码可用处理。
    你将需要锁来处理这种可能:xv6可能不止一个进程使用E1000,也可能是:中断发生时正在内核线程中使用E1000。
    

    4,具体实现

    1)修改kernel/e1000.c,实现e1000_transmit和e1000_recv。
    在这里插入图片描述
    在这里插入图片描述

    5,测试效果

    在这里插入图片描述

    展开全文
  • mit-module2 MIT模块2
  • 算法导论MIT算法导论MIT算法导论MIT算法导论MIT算法导论MIT算法导论MIT算法导论MIT算法导论MIT算法导论MIT算法导论MIT算法导论MIT算法导论MIT算法导论MIT算法导论MIT算法导论MIT算法导论MIT算法导论MIT
  • MIT-OCW:MIT开放课件-Python
  • MIT雷达讲义

    2018-04-14 01:31:42
    MIT雷达讲义MIT雷达讲义MIT雷达讲义MIT雷达讲义MIT雷达讲义MIT雷达讲义MIT雷达讲义MIT雷达讲义
  • 18mit-源码

    2021-02-11 23:04:00
    18mit
  • MIT LICENSE

    2016-05-18 16:58:09
    这个是MIT LICENSE的模板文件,一般用在开源代码中可以传到GitHub或者CSDN Code的项目里边。 下载之后把文件里面的“sam”改成自己的名字就好了。 MIT协议是最宽松的开源协议,只要说明一下是开源的OK了。
  • MIT协议

    2020-04-21 14:13:15
    MIT协议要点
  • MIT课件资料

    2019-02-25 09:48:12
    mit自动驾驶课件资料,mit6.s94课程,全面阐释自动驾驶理论和实践
  • MIT-6.006:MIT 6.006:算法简介
  • MIT行人数据库

    2018-05-16 09:32:15
    MIT行人数据库给的网址已经登录不上了 可以从这边下载MIT的公开数据集
  • The MIT License". The first is the MIT Expat license, and the second is the X11 License. The most common is the MIT Expat, but to prevent confusion they should be distinguished from one another. ...
  • MIT电子电路2MIT电子电路2MIT电子电路2MIT电子电路2MIT电子电路2
  • mit_stalker是一个Ruby gem,用于解析有关MIT的公开信息学生们。 设置 gem install mit_stalker 用法 在irb中尝试一下: MitStalker.from_user_name 'costan' 会费 该代码已从6.006网站中剔除,并且其中包含了我该...
  • MIT DL intro

    2019-01-25 05:19:42
    MIT 6.S094 2019: Introduction to Deep Reinforcement Learning
  • Deep Learning MIT

    2016-08-22 13:37:09
    Deep Learning MIT
  • 哈克·麻省理工学院 我们针对Hack MIT 2015的项目
  • MIT Cheetah 论文大礼包

    2020-12-11 17:02:18
    MIT Cheetah 论文大礼包 MIT Cheetah 论文大礼包 MIT Cheetah 论文大礼包 MIT Cheetah 论文大礼包
  • MIT Deep Learning

    2019-01-25 05:11:40
    MIT 6.S094 2019 course: Deep Learning state of the art slides
  • MIT CLRS NOTES 苑炜弢整理 Lecture 1 Analysis of algorithms theoretical study of computer programming performance making things run fast. speed is fun. Problem: sorting input: sequence ,a2, an> of ...
  • MIT-6.828 xv6操作系统课程 中文指南: : xv6全文翻译成书: : MIT 6.828的实验室: :
  • mit6001-6002 该存储库包含MIT入门计算机科学课程问题集的解决方案。
  • MIT电子电路1MIT电子电路—1MIT电子电路1MIT电子电路1MIT电子电路—1MIT电子电路1MIT电子电路1
  • MIT 6.006 算法导论 麻省理工学院算法导论课程的问题集 作业 目的是为每个分配进行 3 次提交。 只需保存初始文件 尝试的解决方案 使用 MIT 网站上发布的答案修订解决方案 但是,如果我完全卡住了,我可以参考之前的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 56,111
精华内容 22,444
关键字:

mit