好久不写文章了。今天抽空,把这几个月来的事儿终结下,也顺便写点这几个月学的东西。
和老师一起做的分区项目终于完成,现在终于知道FAT32,NTFS的复杂,linux下的ext分区已经无心去看了。曾几何时还梦想着自己写个系统呢,这次用汇编写了点实模式的磁盘访问,快吐血了。果然做系统不是那么简单的。
飞思卡尔智能车的比赛也在杭州电子科技大学比完了,三等奖。我是我队里的首席软件算法工程师(自封的)。还有两位是首席硬件工程师和首席空气动力学工程师。学计算机的搞自动化,碰到纯算法的还好搞点,要是遇到搭电路真是要死人了。真苦了另外两位了,在此表示崇高的敬意。至于软件的算法,说到底要让车子跑得快也就是一个“高内聚,低耦合”的问题。通过“启发引擎”,“控制引擎”和“规则引擎”三层结构,把固定的算法放入规则引擎,把预测到的信息放入启发引擎,最后利用控制引擎来控制车子,这样的结构就能大大降低维护和算法改变的成本。希望下一届的同学能够基于或者说看了我的代码后能给他们个好的思路,希望他们下次能拿二等奖。
比完赛就到了暑假,看些喜欢的书就必不可少,《Windows内核情景分析》,搞计算机安全是我一直以来的梦想,虽然现在离梦想越来越远,但是这并不影响他成为我的一个爱好发展。毛德操老师的这本书给了我很大的启迪。学《操作系统》课的时候我就有很多问题困扰我了,老师也没给我一个很好的回答。
“调用RING3下的Windows API会导致Windows自陷到内核态(RING 0),而Windows又有进程调度,如果一个进程在执行自陷后尚未完成内核调用,而进程调度却切换到另外一个进程,那另外一个进程会不会也是RING 0态?”。这个牛角尖问题困扰了我很久,今天终于得到了答案。原来进程调度有剥夺式和非剥夺式。不管是哪种都是要等到从RING 0切换回RING 3的时候才发生调度的。也就是说自陷过程的中内核操作不会被打断,直到所有操作全部完成才会发生下一次进程调度的切换。本人语文功底不强,不知道大家看懂了没,如果没有建议去看看《Windows内核情景分析》,不想买的可以去下电子书。
“CPU从RING 3到RING 0是怎么切换的,为什么自陷一下就到了RING 0了?”。这个问题很囧,估计老师也被我囧了。虽然老师在课上一直说自陷,可是自陷是怎么来的她也讲不清。只是说中断一下就进去了……=_=||,显然这不能满足我的好奇心。现在总算明白了,这其实是CPU的内部机制,从RING 3->RING 0可以有中断,异常和自陷等方式(x86系列CPU还有一种调用门方式)。这些方式并不是说由软件怎么怎么设计就能让CPU进RING 0的,这其实是由硬件决定的。在intel cpu上的某种进ring 0方法不一定能用在AMD CPU上。这些完全要靠芯片厂商提供的。这些就是为什么微软XP之前的系统都是用INT 2EH这个中断来进内核,而到了XP之后就增加了system enter的快速系统调用(快速进入RING 0),这些其实都是因为CPU的更新换代之后加入了更多功能才使得软件有了发挥的余地,而不是说软件上只要搞一个叫“自陷”的东东一定能进入内核态,说不得哪天INTEL决定放弃自陷以后只能通过异常和中断才能进呢。
“aspx?id=3这类网站为啥后面能跟这种查询的东西,是怎么设计出来的,为什么能在ASP.NET中用Request[]读出来?”。这个囧问题困了我很久,看了很多关于ASP.NET的数教程,网上搜也没找到个所以然来。后来心一横,老子看最底层的超文本传输协议(http)去。结果还真让我找到了,超文本传输协议规定,http的url必须符合以下形式
http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]
懂了吧……所以网站都是以hxxp://开头,然后是网址和端口(http规定不输入端口则默认为80),?后面跟的角Query,叫查询条件……明白了吧……这个其实就是超文本的传输协议规定的,根本不是ASP.NET的机制,你乐意了也可以是asp?id=3或是php?id=3,完全没关系。
好了,今天就写这么多。希望各位站在巨人肩膀上的开发员有闲暇时刻也能低头看看脚趾头。有时候底层的东西也是蛮有趣的。