Linux

已经clone了github仓库发现子模块只有目录没有内容

cd到克隆下来的仓库里:

就ok了。

 

一般来说,要直接指定clone包括子模块在内的所有内容,应该在初始时使用命令:

 …

Continue reading...

echo with color

Shell脚本里加入如下定义:

 …

Continue reading...

ssh免密登录多id_rsa文件配置

在 ~/.ssh/ 先新建文件 config,相关的私钥随便命名,放置在 ~/.ssh 下,不一定要id_rsa,都是如此就覆盖了。

config 文件如下:

尖括号里面的内容请自行修改成自己对应的数据(最后不要带上尖括号)。

后期登录命令为:

 …

Continue reading...

Arch Linux vmware-workstation 启动失败一般解决办法

Vmware一般出问题都是在更新以后,可能是系统升级后没有自动安装相应的组件,所以重新安装就好:

 …

Continue reading...

/bin/bash^M: bad interpreter

原因,文本格式被Windows修改为了Dos模式,需要修改为Unix模式。

批量修改命令:

 

单个文件修改可以:

或者用VIM打开后在Normal模式下输入:

然后回车…

Continue reading...

Zsh 配置文件备份

Continue reading...

Shell 按比例缩放图片大小

一般屏幕大小是1920*1080,以下是将目录下的所有.jpg图片转换为该大小,注意是按比例缩放,并不是最终大小一定是1920*1080

 

Continue reading...

虚拟内存如何翻译出物理地址

在进行详细阐述之前需要了解的前提知识:

1.  内核或者说系统为每一个进程维护一个叫做 任务结构 的数据结构(其实就是一个结构体,另:该任务结构是一个所谓叫做进程表的双向链表的一个成员, 进程表包含系统中打开的每一个进程),结构体名为 task_struct,其中内部有一个结构体指针叫做 mm ,可以在下面的代码中找到这么一行 struct mm_struct *mm; mm指向一个结构体 mm_struct(同样的作者也将该结构体一并贴出到下面的代码中),mm_struct中又有一个指针变量 pgd, 是Page Global Directory的缩写,指向页全局目录的基础地址。作者猜想:每当切换到某个进程时,便会索引出对应进程任务结构中的mm_struct,然后获取出pgd内容,将它写进CR3,CR3是存储页表基址的寄存器,叫做PTBR,全称Page Table Base Register. task_struct内部结构如下图1.1所示:

2. 虚拟地址由两部分组成,VPN+VPO,即 Virtual Page Number 和 Virtual Page Offset 的缩写,叫做虚拟页号和虚拟页偏移量。MMU翻译虚拟地址的过程如下图1.2所示:

详细过程如下:

当进程访问某个虚拟地址时,MMU的硬件翻译单元便会开始进行地址翻译,翻译过程如下:

根据虚拟地址中虚拟页号到PTBR指向的页表中索引出页表条目,页表条目中包含有两个字段:有效位+物理页号,有效位指示当前页是否存在在物理页中,如果不存在则产生缺页异常,由缺页异常处理程序进行页面调度(物理页在磁盘和主存之间进行传送页的活动),并更新页表条目,然后重新索引到该页表条目,由于页表已经更新并指示当前物理页号字段不为空,将不会再次产生缺页异常,那么MMU可以继续工作,根据对应页表条目中的物理页字段,索引到物理页,再结合虚拟地址的虚拟页偏移量VPO,算出最后的物理地址。

 

以下是 struct task_struct 以及 struct mm_struct 的内容,分别来自作者系统目录:

/usr/lib/modules/5.6.6-arch1-1/build/include/linux/sched.h

/usr/lib/modules/5.6.6-arch1-1/build/include/linux/mm_types.h

Continue reading...