首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解构/黑客攻击节点

解构/黑客攻击节点
EN

Stack Overflow用户
提问于 2014-06-03 06:51:26
回答 2查看 1.5K关注 0票数 3

我试图理解Node内部的工作原理,并且无法将用js编写的Node连接/绑定到用C/C++编写的低级系统调用中。

当我写这段代码时-

代码语言:javascript
复制
var http = require('http');
var server = http.createServer(function(req,res) { res.end('Hacking Node'); });
server.listen(8081);

server.listen如何侦听只有操作系统才能访问的特定端口?其他各种特性也是如此。

到目前为止的旅程就是这样。

我检查了net.js和os.js文件。但看不出多少。

此外,我还深入研究了用C- unix和视窗版本编写的进程文件。

最后,经过进一步的调查,点击了Node.js文件

代码语言:javascript
复制
// https://github.com/joyent/node/tree/6cbfcdad46d733bb04332063727e304e449dc86b/src/node.js

其中有以下评论-

代码语言:javascript
复制
// This file is invoked by node::Load in src/node.cc, and responsible for
// bootstrapping the node.js core. Special caution is given to the performance
// of the startup process, so many dependencies are invoked lazily.

Node.cc在第2708行中加载这个Node.js文件。

代码语言:javascript
复制
// https://github.com/joyent/node/blob/6cbfcdad46d733bb04332063727e304e449dc86b/src/node.cc - line 2708

这就是我所得到的。谁能告诉我接下来会发生什么,并帮我填上这个谜题的碎片。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-03 12:14:52

我很惊讶没人提到利布夫。这是一个示意图。(这并不是百分之百准确)。

代码语言:javascript
复制
              2 V8 compiler
             /             \
            /               \
   1 Your code              3 node.js core system libraries(net,fs,events)
                                       JavaScript
                                      ------------    
                                     V8 bindings(C++)
                                         / | \
                                        /  |  \
                              4 node.js platform code C/C++
                                  events   fs  net
                                        \  |  /
                                         \ | / 
                                          \|/
                                        runs on
                                     5 libuv C/C++
                               High Performance Event Loop
                                           |
                                        syscalls
                                           |
                                        6 Kernel

记住如何执行.toString()并显示JS函数。这不适用于V8绑定(显示本机代码)。node.js平台(C++)函数具有V8绑定。因为节点提供事件执行和异步执行,所以您在事件循环上所做的一切都运行在libuv上。显示libuv用法的旧博客

libuv为您处理系统调用的调度,V8处理您的JS代码。节点将JS扩展到系统。

票数 5
EN

Stack Overflow用户

发布于 2014-06-05 11:47:54

谢谢你user568109。这真的帮助我了解到,这不是单一的事情,而是js、V8、libuv、内核的组合。它也使我能够潜入更深的地方,直到一个已知的抽象点。

我想分享我在路上收集到的一些知识。(如果太琐碎的话,请原谅我的无知)

  1. 首先,作为一个在浏览器上使用js的人,坐在已经在浏览器上实现的DOM之上,我没有想到可以在V8之上创建一个新的API。code 568109在本机代码上的位导致了我的这里这里。节点绑定是这个难题中最重要的部分。

虽然对于普通的人来说,下面的js代码线可能以js的形式出现,但实际上它们是不同的。一个是纯js->js调用,第二个是通过底层绑定实现的。

代码语言:javascript
复制
//normal js
var x = require('http');
var s = x.createServer();

//native binding
var tty = process.binding('tty_wrap');
tty.guessHandleType();
  1. 使用C++中绑定的本机实现,表面javascript只不过是语法糖或底层C++片段的抽象。尼基尔·马拉特( Nikhil Marathe )的这篇谈话 --幻灯片这里 --帮助更好地理解了事情。
  2. 既然js和V8胶水已经被拆解,很明显,一旦我们进入了C/C++级别,它就可以直接(如果需要的话)或通过libuv与其他本地内核库对话。伯特·贝尔德的这篇谈话帮助更详细地理解了利布夫。

在理解了这张图片之后,现在我可以理解当我看到以下几行时会发生什么。

代码语言:javascript
复制
var http = require('http');
var server = http.createServer(function(req,res) { res.end('Hacking Node'); });
server.listen(8081);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24008770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档