企业网站php模板下载,搜狗网站制作,江苏中盛建设集团网站,河北网站建设收益在这之前#xff0c;我们一直用汇编语言直接与机器对话#xff0c;如果大家不知道这个世界上有高级语言的话#xff0c;我想大家也不会觉得写汇编代码的过程很辛苦#xff0c;哈哈#xff0c;幸福确实是比较出来的。相对于汇编语言#xff0c;用c 语言写内核是非常爽的事…在这之前我们一直用汇编语言直接与机器对话如果大家不知道这个世界上有高级语言的话我想大家也不会觉得写汇编代码的过程很辛苦哈哈幸福确实是比较出来的。相对于汇编语言用c 语言写内核是非常爽的事马上我们就要步入内核实践中啦所以现在和大伙儿聊聊c语言写内核的体会。
通常我们写的代码都是直接编译成可执行文件那是因为我们是在写用户程序操作系统为咱们提供了很多便利所以编译和链接一气呵成不需要咱们单独再指定什么编译器也和操作系统达成了诸多约定默默在后面为咱们做了大量的工作比如程序编译出来的虚拟起始地址通常是0x8048000左右。在有操作系统为咱们撑腰时我们确实不需要关注这些与业务逻辑无关的东西只要专注于自己的工作就好啦。可如今我们要用c语言写脱离操作系统的程序这回咱们就不能再这么省心了必须要自己指定程序的入口地址。
另外我们之前开发用户程序有大量的标准库可以用标准库一般是系统调用的封装所以表面上通过标准库访问系统资源本质上是用系统调用来实现的。当然如果大伙儿愿意在用户程序中也可以直接调用“系统调用”在功能上这是允许的因为中断描述符表中系统调用对应的中断描述符它的权限是用户程序可以访问的否则就无法实现系统调用啦。就拿linux来说它的系统调用是先往eax寄存器中写入系统调用号然后通过0x80中断来实现的。我们可以用汇编语言写一个系统调用的代码用c 语言去调用它或者干脆直接在c语言中内嵌汇编代码。无论是采用哪种形式汇编语言的部分都是诸如先用mov eax,xx的形式在eax寄存器中指定系统调用的功能号然后紧跟着使用中断指令int 0x80来引发0x80中断从而触发0x80对应的中断处理程序由该中断处理程序根据eax的内容去执行相应的系统调用。虽然可以直接调用“系统调用”的功能但不推荐这样做毕竟标准库中为咱们考虑了很多优化策略通过标准库访问系统资源比直接用系统调用效率更高。也许有同学不信这个邪非要整出个效率更高的库当然这是非常可能的可是标准库考虑的不仅是效率还有很多兼容规范在里面所以它可能会为了规范而牺牲效率。除非为了某些个性化的应用咱们才去写自己的库否则还是不要企图颠覆标准库啦。标准库可以说是由世界上成千上万的超级大脑完成的以咱们个人之力去和全世界的极客拼脑细胞这是不科学的不如把精力放在其它方面好啦我知道话又说多啦^_^。
对于系统调用这些平时我们认为理所当然的功能如今已经成为了咱们的奢望。首先咱们本身是在写操作系统而不是用户程序操作系统不应该再依赖于其它系统的功能所以不能在咱们的程序操作系统中再调用宿主操作系统的系统调用功能。其次同一时刻只能有一个操作系统在运行咱们即使调用了0x80中断中断描述符表里0x80对应的中断处理程序是咱们提供的再也不存在宿主系统的代码相当于咱们在调用自己的中断处理程序而此时我们可能尚未准备好相应的中断处理程序。如果系统调用不能用也更不能用c标准库啦所以只能用c语言原生支持的语法结构。不过以后我们会在实现内核的过程中建立咱们自己的库库中会通过咱们自己的系统调用实现某些功能。
以上多说了几句有关系统调用的实现其实我是怕无法满足好奇心强的同学很担心仅仅一句“在脱离操作系统下写程序不能使用系统调用”让更多的同学感到不解。如果我解释得还不够咱们以后会在实现系统调用的时候有所了解。