Browsed by
Month: July 2016

提供给计算机,软件专业的资料

提供给计算机,软件专业的资料

入门篇 提问篇 提问前请看提问的艺术 这里是简体中文版, 下面有英文版 学习计算机专业, 自主能力非常重要, 学会多思考, 没有经过自己深思熟虑, 并且亲自尝试试验的问题不要提出来, 这样就算有人回答了你, 你也没有学到任何东西, 拒绝伸手党, 强烈建议大家阅读 提问的艺术 一文, 本博客内有该文章的转载, 链接在这里 如果你看不进去那么长的文章, 那么你基本不适合学习计算机, 如果你能按照提问的艺术中讲到的去做, 那么你的自学能力会有很大的提高 语言篇 入门必看: 强烈推荐所有的, 无论对计算机有了解还是没有了解的新生, 去看 哈佛大学的公开课: 哈佛大学CS50, 在网易公开课就有, 链接自己搜索一下 入门语言强烈建议为C语言, C语言是面向过程的语言, 没有类的概念, 入门C语言学会控制流(顺序, 分支, 循环 三大结构) 以及递归的思想, 还有初步了解指针的含义, 就算做C语言入门了 推荐大家去Online Judge 做做简单的题目, 锻炼自己的编程能力, 下面推荐一些书籍 首先要说明的是, 一定不要看谭浩强的C语言入门教材, 本教材的代码严重不符合规范, 且老套 推荐书籍: C语言入门经典 http://item.jd.com/11362614.html (大家以后购买计算机书籍, 认准黑色书皮的,  以及国外的经典作品) (华章教育的图书, 图灵丛书, 都是非常好的计算机资料的出版社) C Primer Plus http://item.jd.com/10062260.html  适合对编程有一点感觉的新生来看, 不然的话可能看不进去 C 和指针 http://item.jd.com/10062667.html 适合对C语言已经有一定了解, 并且能够熟练编写100行左右的C语言程序的同学看, 深入对C语言的指针进行了解 C 陷阱和缺陷 http://item.jd.com/10062654.html 适合已经写过5000行+的C语言代码的同学看, 本书介绍了很多C语言的特性和问题, 给大家指出了很多在写C语言的时候可能遇到的坑 看完这些书, 你对C语言基础(强调!!!! 是C语言基础, 不是C语言, C语言远比大家想象的复杂) 已经非常熟练了,…

Read More Read More

[不是科普向?] RE: 从零开始的操作系统开发 第二集

[不是科普向?] RE: 从零开始的操作系统开发 第二集

[本文概念性内容较多, 看图党慎入] 概要 Hmm, 第一集中我们已经学会了如何让计算机在启动的时候加载并运行我们写好的bootsector, 并且通过使用BIOS提供的中断控制显卡在屏幕上输出特定的字符串, 慢慢的我们已经熟悉了16bit下的底层程序的开发, 不过就如我们综述中所说, 16bit下我们能够访问的内存十分有限, 因此我们不得不离开这个我们熟悉但是却不好用(qwq)的16bit模式,切换到32bit下, 切换之后我们就可以在C语言内继续我们的操作系统的开发了, 我们的引导程序实际上做的事情就是, 将模式切换到32位,并且将操作系统所在的磁盘扇区装载到内存里, 然后call我们的操作系统的main函数所在的地址, 这样, 整个引导程序的使命就完成了, 下面的工作就是操作系统的事情了, 本文我们主要介绍如何切换到32bit下的具体操作, 以及在32bit下控制显卡输出特定的字符 本文最后实现的效果的具体代码在github上均可获得 代码仓库地址见第一集 全局描述符表(Global Descriptor Table GDT) 我们已经熟悉了16bit下的内存的分段结构以及逻辑地址转换为内存的物理地址的方式, 现在再来回顾一下, 16位下我们想访问内存需要提供两个信息, 段地址+偏移量,  这两个信息决定了物理内存的地址, 决定的方法是 Segment Addr * 16 + Segment Offset  这个可以在16进制上形象的表示为 Segaddr << 4 + Offset, 那么现在我们要切换到 32bit保护模式下, 之前的这个内存的段-偏移量模型已经不适用了, 取而代之使用的是个功能更加强大的模型, 支持对内存的某个部分进行保护, 权限控制, 以及提供虚拟地址访问的内存模型. 另外,在CPU由实模式(16bit, 下略)切换到保护模式(32bit, 下略)下后, 将逻辑地址映射到物地址的方式也发生了改变, 这个改变, 和我们这个小标题提到的GDT密切相关, 下面我们就来具体的介绍一下 GDT   什么是GDT GDT是由多个SD组成的一个数据结构, 每一个SD, 称作Segment Descriptor, 包含了一个段的各种元信息如下:  基地址(BaseAddress) 定义了这个段在内存中的物理的起始地址  段上限(Segment Limit)定义了段的大小 标志位数组, 这些标志位向CPU说明CPU应该如何处理这个段中的内容, 如本段只读, 或者本段可执行等, 相当于这个Segment的属性 每一个SD是一个8Byte长的数据结构, 通过64个bit存储了所有上述信息, SD的结构如下: 我们可以看出来比较反人类的地方是这个数据结构存储的不同类型的数据信息并不是连续的= =…

Read More Read More

[科普向?] Re: 从零开始的操作系统开发 第一集

[科普向?] Re: 从零开始的操作系统开发 第一集

Hmm, 果然还是开坑了~! 在学校智障的操作系统课设的发起下, 再加上每个程序员都有一个写一个自己的操作系统的公主梦(雾), 我们愉(作)快(死)地开坑啦~ 以前曾经跟着 “30天自制操作系统” 玩过DIY操作系统, 不过那个书更像面向小白, 讲的东西也不够系统, 而且使用的是自己改过的nas汇编器, 因而不能算写过, 这一次则是真正的开坑啦~ (虽然课设时间很短写出一个完整的根本不可能不过慢慢写总会写完的你说对不喵~) 我们的开发过程在Bearychat上直播 neugeek.bearychat.com 的Toy-OS频道, 我们的git-repo 为 https://github.com/VOID001/toy-os 菊苣们不要喷, 既然挖了坑窝就不会不填(….你都已经挖了多少个坑了啊喂! (逃)) 这个系列的文章将会记录在开发操作系统的整个过程中的一些经验&心得&吐槽 不知道会有多少集(   参考资料们: MIT 的 XV6 源代码 & handbook University of Birmingham 的 Writing an simple operating system from scratch Quora, StackOverflow Jiong Zhao Linux 0.11内核完全注释   我们使用的工具链: GNU Assembler & GNU C Compiler Qemu Gdb objcopy, objdump, binutils, elfutils GNU Makefile   操作系统编写总览 什么是BIOS 参考阅读: http://whatis.techtarget.com/definition/BIOS-basic-input-output-system 我们的定位是写一个操作系统,那么首先我们应该了解,整个操作系统都应该由哪些模块构成, 那么就让我们从操作系统的启动说起, 说到这里就不得不说一下BIOS, BIOS是Basic Input and Output System, 是你的计算机加电运行后加载的第一个程序, 它是固化在你的EPROM内的一个程序片段…

Read More Read More

用C语言操作lua

用C语言操作lua

lua提供了一套C语言的API供用户使用C语言与lua进行交互, 本文通过解读lua C Application Program Interface并且提供具体的实例来表明如何使用C操作lua, 本文以lua5.1为例, lua5.3支持了一部分新的特性不过都大同小异 Lua Stack 对于C, Lua之间的交互, 很自然的会想到如何获得lua的数据,如何将处理的结果返回给lua, lua使用一个Virtual Stack将其函数调用的参数传递给C 如下所示 加入我们有一个lua的调用 fun(a, b, c) 这个调用会将 a, b, c三个参数依次压栈, 在Virtual Stack中形成这样的结构: | c | |——-| | b | |——-| | a | +——-+ 为了方便用户取用函数的任意参数, lua的 Virtual Stack不仅允许你访问栈顶元素, 同时允许访问栈内任何位置的元素,  lua的API均有一个参数为index, 用于指定对栈上的哪一个参数进行操作, 最后, C语言处理之后的结果要返回给lua, 也是通过压栈的形式, 将结果压栈, 因为lua支持多个返回值, C语言通过返回一个int, 表明将自栈顶算起的多少参数作为调用该lua函数的返回值, 其他的参数均被丢弃掉. 下面通过几个小的demo来说明一下如何通过C语言对lua进行操作. 我们使用lua_sandbox来演示如何用C语言实现lua的函数. 获取用户的每一个传递的参数 首先介绍一下如何实现一个C语言函数并且可以导出到lua_sandbox中, 我们需要做两个工作, 第一个是实现这个函数, 函数的实现标准如下: int my_function_name(lua_State* lua) 然后使用 lsb_add_function(lsb, &your_fun_name, “the_name_to_export”) 将该函数添加到你要运行的lua_sandbox实例中, 即可在lua代码内调用你写的函数啦   下面我们实现这个函数: int get_args(lua_State* lua) { int n = lua_gettop(lua); for(int…

Read More Read More