构建入口脚本
Ⅰ vue项目的标准结构
Vue项目创建完成后,使用WebStorm打开项目,项目目录如下:
config中存放项目的一些基本配置信息,最常用的就是端口转发
node_moles这个目录存放的是项目的所有依赖,即npminstall命令下载下来的文件
src这个目录下存放项目的源码,即开发者写的代码放在这里
static用来存放静态资源
index.html则是项目的首页,入口页,也是整个项目唯一的HTML页面
package.json中定义了项目的所有依赖,包括开发时依赖和发布时依赖
对于开发者来说,以后99.99%的工作都是在src中完成的,src中的文件目录如下:
assets目录用来存放资产文件
components目录用来存放组件(一些可复用,非独立的页面),当然开发者也可以在components中直接创建完整页面。
推荐在components中存放组件,另外单独新建一个page文件夹,专门用来放完整页面。
router目录中,存放了路由的js文件
App.vue是一个Vue组件,也是项目的第一个Vue组件
main.js相当于Java中的main方法,是整个项目的入口js
main.js内容如下:
在main.js中,首先导入Vue对象
导入App.vue,并且命名为App
导入router,注意,由于router目录下路由默认文件名为index.js,因此可以省略
所有东西都导入成功后,创建一个Vue对象,设置要被Vue处理的节点是'#app','#app'指提前在index.html文件中定义的一个div
将router设置到vue对象中,这里是一个简化的写法,完整的写法是router:router,如果key/value一模一样,则可以简写。
声明一个组件App,App这个组件在一开始已经导入到项目中了,但是直接导入的组件无法直接使用,必须要声明。
template中定义了页面模板,即将App组件中的内容渲染到'#app'这个div中。
因此,可以猜测,项目启动成功后,看到的页面效果定义在App.vue中
App.vue是一个vue组件,这个组件中包含三部分内容:1.页面模板(template);2.页面脚本(script);3.页面样式(style)
页面模板中,定义了页面的HTML元素,这里定义了两个,一个是一张图片,另一个则是一个router-view
页面脚本主要用来实现当前页面数据初始化、事件处理等等操作
页面样式就是针对template中HTML元素的页面美化操作
需要额外解释的是,router-view,这个指展示路由页面的位置,可以简单理解为一个占位符,这个占位符展示的内容将根据当前具体的URL地址来定。具体展示的内容,要参考路由表,即router/index.js文件,该文件如下:
这个文件中,首先导入了Vue对象、Router对象以及HelloWorld组件,
创建一个Router对象,并定义路由表
这里定义的路由表,path为/,对应的组件为HelloWorld,即浏览器地址为/时,在router-view位置显示HelloWorld组件
Ⅱ 1.构建JS登录脚本
在编写xshell脚本的过程中用到最多的就是自动输入,自动捕获,延时等语句
自动输入
以自动输入xyz为例
自动输入的语句:xsh.Screen.Send("xyz");
当然,如果你输入的是一条命令,还需要下面这一行输入回车
输入回车的语句:xsh.Screen.Send(String.fromCharCode(13));
自动捕获
以linux系统为例,一般程序执行的打印数据位于倒数第二行,如下图所示
/* 字符串处理 */
var ScreenRow, ReadLine, Items;
/* 读取倒数第二行,长度为40个字符 */
ScreenRow = xsh.Screen.CurrentRow - 1;
ReadLine = xsh.Screen.Get(ScreenRow, 1, ScreenRow, 40);
延时
以等待1s为例
延时语句:xsh.Session.Sleep(1000);
其他
打开新会话:xsh.Session.Open(string);
对话框提醒:xsh.Dialog.MsgBox(string);
设置日志路径:xsh.Session.LogFilePath = string;
开始记录日志:xsh.Session.StartLog();
清屏函数:xsh.Screen.Clear();
等待输入:xsh.Screen.WaitForString(string);
示例
本文以一个自动测试脚本为例,定时向/tmp/test文件写入数据,然后回读打印,截获回读打印的值进行分析
/* 测试函数 /
function test()
{
/ 发送echo 112233 > /tmp/testfile */
xsh.Screen.Send("echo 112233 > /tmp/testfile");
xsh.Screen.Send(String.fromCharCode(13));
}
/* 主函数 /
function Main()
{
/ 打开会话,根据实际的会话路径修改 */
xsh.Session.Open("C: Computer6XshellSessionsubuntu.xsh");
xsh.Screen.Synchronous = true;
// xsh.Screen.WaitForString("start");
// xsh.Screen.Clear();
}
运行脚本的操作:
在编写xshell脚本的过程中用到最多的就是自动输入,自动捕获,延时等语句
自动输入
以自动输入xyz为例
自动输入的语句:xsh.Screen.Send("xyz");
当然,如果你输入的是一条命令,还需要下面这一行输入回车
输入回车的语句:xsh.Screen.Send(String.fromCharCode(13));
自动捕获
以linux系统为例,一般程序执行的打印数据位于倒数第二行,如下图所示
/* 字符串处理 */
var ScreenRow, ReadLine, Items;
/* 读取倒数第二行,长度为40个字符 */
ScreenRow = xsh.Screen.CurrentRow - 1;
ReadLine = xsh.Screen.Get(ScreenRow, 1, ScreenRow, 40);
延时
以等待1s为例
延时语句:xsh.Session.Sleep(1000);
其他
打开新会话:xsh.Session.Open(string);
对话框提醒:xsh.Dialog.MsgBox(string);
设置日志路径:xsh.Session.LogFilePath = string;
开始记录日志:xsh.Session.StartLog();
清屏函数:xsh.Screen.Clear();
等待输入:xsh.Screen.WaitForString(string);
示例
本文以一个自动测试脚本为例,定时向/tmp/test文件写入数据,然后回读打印,截获回读打印的值进行分析
/* 测试函数 /
function test()
{
/ 发送echo 112233 > /tmp/testfile */
xsh.Screen.Send("echo 112233 > /tmp/testfile");
xsh.Screen.Send(String.fromCharCode(13));
}
/* 主函数 /
function Main()
{
/ 打开会话,根据实际的会话路径修改 */
xsh.Session.Open("C: Computer6XshellSessionsubuntu.xsh");
xsh.Screen.Synchronous = true;
// xsh.Screen.WaitForString("start");
// xsh.Screen.Clear();
}
运行脚本的操作:
实际执行结果如下:
Ⅲ Linux内核程序入口地址
在Linux内核中,使用 vmlinux.lds.S 文件(路径: arch/arm64/kernel/ )布局内核映像中相关段(例: .text、.data )的位置。
在Linux内核编译时, vmlinux.lds.S 文件最终会被构建成链接脚本 vmlinux.lds 文件(路径: arch/arm64/kernel/ )。
本文主要介绍Linux内核程序运行的起始位置 _text ,在 vmlinux.lds.S 文件中定义如下:
从上面可以看出: _text = KIMAGE_VADDR + TEXT_OFFSET 。
1、KIMAGE_VADDR定义
文件: arch/arm64/include/asm/memory.h ,定义如下:
文件: include/linux/sizes.h ,定义如下:
宏 KIMAGE_VADDR 展开如下:
上面是按照无符号计算, KIMAGE_VADDR 为: 0xFFFFFF8008000000 。
2、TEXT_OFFSET定义
文件: arch/arm64/Makefile ,定义如下:
通过计算, _text 值为: 0xFFFFFF8008080000 。
在Linux内核启动时,从 log 信息中也可以找到对应的地址:
_text 对应的是虚拟地址 , 在内核中可以直接通过访问该地址获取其保存的值 ,其对应 Image 映像中的第一个字 0x14424000 。
Image 映像查看方法如下:
本文基于 RockPI 4A 单板Linux 4.4内核。