精华内容
下载资源
问答
  • 开机时bios遍历PCI总线发现PCI设备和内存,bios拼凑出物理地址空间,拼凑完有可能改变一个设备BAR的开始物理地址,把改变后的值重新写入配置内存中,配置内存个人理解是linux pci系统统一映射到内存中的,...

    内存虚拟化是一个很大的话题,最近安全部门发现了一个qemu内存虚拟化的安全漏洞,反馈给云平台让解决,感觉很棘手,引起了我对内存虚拟化的思考,想到什么问题就把思考记录下来。

    x86虚拟内存

    问题是由学习qemu MemoryRegion想到的,文档memory.rst中有一句话“memory banks used when the guest address space is smaller than the amount of RAM addressed”,说是alias类型MemoryRegion适用于这种场景,大概意思就是qemu给guest提供的物理内存超过了guest的address space,这时就得用alias类型的MemoryRegion了,那这儿的memory banks是什么意思,物理内存条有rank/bank,这儿的bank应当理解成岸,类似于一个岸把湖分成两半,和真正的内存条中的rank/bank没关系。qemu中有below_4g_mem_size和above_4g_mem_size两个MemoryRegion Alias,我觉得这个命名不好,如果加上userspce和kernelspace就好理解了,进程的虚拟地址空间分为用户空间和内核空间,两者执行权限不一样。所有进程内核空间都一样,只是用户空间不一样,这样所有进程就可以共享内核,所以需要在4G空间有一条线分成两部分。每个进程有自己的页目录,其中page table中关于内核部分指向相同,借用网上的这张图说明一下,假设CPU是32位,内核空间1G,用户态空间3G。

    16015da65ca55c97bfbe05e24edf8685.png

    再想想虚拟地址空间是如果生成的,gcc编译源代码生成elf格式, linux内核load可执行程序elf格式文件生成虚拟地址空间,虚拟地址空间由段和页构成,段有code,data,heap和stack等, stack是固定大小,linux中的段都指向0,主要是page发挥作用。执行时大概是这样IP指令寄存器告诉MMU要加载的指令,如果page fault, 增加page然后建立映射关系, load指令到内存,其它load指令告诉MMU,要把数据放到内存中,不知道还区分数据总线和地址总线不,课本中学过,程序执行用的都是虚拟地址,反汇编可以看到虚拟地址。

    虚拟地址空间设计成这样是因为内核不能发生pagefault,如果内核处理pagefault时发生pagefault没法玩了,所以说内核常驻物理内存中。用户态malloc一块内核,用虚拟地址访问发生pagefault,内核找一个page然后对应起来,那内核分配一个page的内存,内核先得到的是这个page的物理地址,然后把物理地址转换成内核虚拟地址,总之内核管理物理内存,并且和物理内存一一对应,为什么要一一对应没想明白,感觉这样实现是简单,内相经常需要在虚拟和物理地址之间转来转去的,一一对应用virt_to_phys和phys_to_virt就能实现虚拟和物理地址互相转换,简单性能高。也许是因为MMU不是一开始就开启的,内核在CPU处于实模式时创建early_level4_pgt和init_level4_pgt,切换到保护模式才开启MMU了,内核虚拟空间和物理内核一一对应是实模式要求这样的,如果不这样实模式时就没法操作了,要理解虚拟内存肯定得看懂实模式时代码干的活,否则还是有点虚。内核虚拟空间是1G,实际上内核只占用了896M虚拟空间,一一映射那就和物理地址0开始的896M,896M以上的物理地址就叫做high mem,kernel要访问就建立映射到它剩下的128M虚拟空间中,详见函数kmap_high。

    为什么是896M?

    https://stackoverflow.com/questions/4528568/how-does-the-linux-kernel-manage-less-than-1gb-physical-memory

    Final kernel Page Table when RAM size is less than 896 MB - Linux Kernel Reference

    前面说的都是内存,外设内存要是怎么访问的?个人理解外设内存分为配置,BAR和其它内存,配置内存是PCI规范指定的,配置内存中指定BAR空间开始地址和长度,BAR空间中指定其它内存如常说的显卡显存大小。设备写固件时在配置内存中指定BAR开始物理地址和长度,开机时bios遍历PCI总线发现PCI设备和内存,bios拼凑出物理地址空间,拼凑完有可能改变一个设备BAR的开始物理地址,把改变后的值重新写入配置内存中,配置内存个人理解是linux pci系统统一映射到内存中的,BAR是加载设备驱动时映射的,pci bar mmio理解为从pci configure space中得到bar的phy_addr,然后ioremap建立page entry,访问这个phy_addr,pci bus把请求路由给设备而不是内存。外设的其它内存CPU不能直接访问,只有外设自己可以访问,CPU要访问得委托外设DMA把数据写到内存,这部分内存地址CPU不处理,只要驱动和外设配合来就行了,外设可以访问内存,可以访问自己的这部分内存。

    x86中cr3指定页目录,同一个进程系统调用从用户态切换到内核只切换stack和cpu context,不切换cr3,只有不同进程切换时才切换cr3。


    32位CPU可以访问的物理内存最大是4G,但有了PAE就不一样了,一个CPU的虚拟地址空间还是4G,只是这4G不再局限于映射到物理低4G上了,可以访问的最大物理空间总和一定不会超过4G,总的几级页结构换算出来的值一定是4G,但page table entry的结果是64位,用其中46位,加上4k中的偏移即可以得到物理地址。

    5c132ff800d8a20bcf56a648a56dc20b.png

    qemu内存虚拟化

    host的内存物理内存是bios拼凑出来的,guest的物理内存是qemu用MemoryRegion拼凑出来的,guest物理内存也包含内存条内存和设备内存,只是guest内存条内存和设备内存都是由host的的内存虚拟出来的,guest访问内存条内存和设备内存触发kvm执行的动作是不一样的。

    guest和host是独立的系统,两者都有自己的虚拟地址和物理地址,唯一的关系就是把guest的物理地址映射到host的虚拟地址,也就是qemu进程的虚拟地址。拿用的最多的EPT来说,guest有自己的页目录,kvm又维护了一个guest物理地址到host物理地址映射的页目录,cpu进入guest模式时一个虚拟地址要依次查找这两个页目录,guest查找自己的页目录,如果找不到就发生pagefault,处理pagefault,找到一个物理页,给页目录增加一项,访问物理页面发生EPT violation exit,kvm增加guest物理地址到host物理地址映射的页目录表项,重新enter guest继续执行。如果guest在自己页目录中找到,继续查找kvm维护的页目录,如果找不到发生EPT violation exit,kvm调用handle_ept_violation增加guest物理地址到host物理地址映射的页目录表项,然后重新enter guest继续执行,kvm的过程对于guest来说是透明的。如果guest内核回收一个page,删除一个自己的页目录表项,此时guest exit,因为kvm对guest页目录占用的内存做过特殊标记,kvm调用handle_invlpg删除自己的表项。

    guest启动时是实模式,还没有页目录,没有MMU功能,早期guest实模式时由qemu来模拟,后来Intel CPU中加入了Unrestricted Guest,EPT开始支持实模式。

    https://lists.gnu.org/archive/html/qemu-devel/2019-09/msg06225.html

    https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3a624e29c7587b79abab60e279f9d1a62a3d4716

    guest访问自己的设备内存,qemu和kvm对这些内存做了特殊标志,guest访问就触发EPT misconfig,然后kvm调用handle_ept_misconfig处理,根据地址范围找到属于的设备,然后调用设备模拟的代码,如果kvm搞不定退回qemu继续处理,kvm和qemu要做的事情就是把guest的物理地址转换成host的虚拟地址,然后读写转换后的虚拟地址,这样就等价于guest读写自己的外设内存了,处理完后,enter guest让guest继续运行。

    如果物理CPU支持pae特性,比较新一点的linux guest和kvm会检测自动把pae利用起来。

    总结

    个人产生一些想法,努力去找答案,然后记录下来,刚开始都是一些问题,由一个问题想到更多问题,有些问题之间扯的很远,然后找答案,记录下来的都是问题和答案,努力加工整理成文章,感觉还是不成体系,理解不深而且未必正确。

    展开全文
  • Tomcat上传到服务器 将Tomcat解压到/usr/local/tomcat中 在/usr/local/tomcat/conf/Catalina/localhost(若目录不存在,创建即可)中创建一个文件`upload.xml’ <?xml version="1.0" encoding=&...
    1. 将Tomcat上传到服务器
    2. 将Tomcat解压到/usr/local/tomcat中
    3. 在/usr/local/tomcat/conf/Catalina/localhost(若目录不存在,创建即可)中创建一个文件`upload.xml’
    <?xml version="1.0" encoding="UTF-8"?>
    <Context path="/upload" reloadable="true" docBase="/home/admin"/>
    

    注意事项

    • 文件名和path的值必须相同
    • docBase的值必须为ftp用户的可操作目录
    展开全文
  • linux配置端口映射

    2017-07-25 16:18:21
    参考:... 在使用非root用户启动tomcat时,如果tomcat配置为80端口,会报Permission denied错误,如: [plain] view plain copy an 07, 2016 12:19:47 PM org

    参考:http://blog.csdn.net/shilian_h/article/details/50475446


    在使用非root用户启动tomcat时,如果tomcat配置为80端口,会报Permission denied错误,如:

    [plain] view plain copy
    1. an 07, 2016 12:19:47 PM org.apache.coyote.AbstractProtocol init  
    2. INFO: Initializing ProtocolHandler ["http-bio-80"]  
    3. Jan 07, 2016 12:19:47 PM org.apache.coyote.AbstractProtocol init  
    4. SEVERE: Failed to initialize end point associated with ProtocolHandler ["http-bio-80"  
    5. ]  
    6. java.net.BindException: Permission denied <null>:80  
    7.     at org.apache.tomcat.util.net.JIoEndpoint.bind(JIoEndpoint.java:411)  
    8.     at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:640  
    9. )  
    10.     at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:434)  
    11.     at org.apache.coyote.http11.AbstractHttp11JsseProtocol.init(AbstractHttp11Jss  
    12. eProtocol.java:119)  
    13.     at org.apache.catalina.connector.Connector.initInternal(Connector.java:978)  
    14.     at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)  
    15.     at org.apache.catalina.core.StandardService.initInternal(StandardService.java  
    16. :559)  

    在网上查询后,把tomcat改回8080端口,然后配置linux端口映射80到8080端口。

    配置方式一、命令行方式。

    (1)配置映射

    [plain] view plain copy
    1. iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080  

    (2)保存配置。如果不保存,重启后此映射将失效

    [plain] view plain copy
    1. service iptables save  

    配置方式二、修改/etc/sysconfig/iptables文件,修改后要执行 service iptables restart重启防火墙。配置如:

    [plain] view plain copy
    1. # Generated by iptables-save v1.4.7 on Thu Jan  7 12:37:28 2016  
    2. *nat  
    3. :PREROUTING ACCEPT [687:71239]  
    4. :POSTROUTING ACCEPT [2:124]  
    5. :OUTPUT ACCEPT [2:124]  
    6. -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080  
    7. COMMIT  
    8. # Completed on Thu Jan  7 12:37:28 2016  
    9. # Generated by iptables-save v1.4.7 on Thu Jan  7 12:37:28 2016  
    10. *filter  
    11. :INPUT ACCEPT [0:0]  
    12. :FORWARD ACCEPT [0:0]  
    13. :OUTPUT ACCEPT [145:11884]  
    14. -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  
    15. -A INPUT -p icmp -j ACCEPT  
    16. -A INPUT -i lo -j ACCEPT  
    17. -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT  
    18. -A INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT  
    19. -A INPUT -j REJECT --reject-with icmp-host-prohibited  


    展开全文
  • 如果你不想用ngnix配置的话,只单独使用tomcat的话可以看看这篇文章,接下来开始 使用场景 1.单机开发有时侯如果放在war下每次clean都会清理当前项目下静态文件特别折腾. 2.只有启动tomcat即可静态文件放在外面不会...

    如果你不想用ngnix配置的话,只单独使用tomcat的话可以看看这篇文章,接下来开始

    使用场景

    1.单机开发有时侯如果放在war下每次clean都会清理当前项目下静态文件特别折腾.

    2.只有启动tomcat即可静态文件放在外面不会被删,就算未来要上服务也可以选择继续tomcat或者ngnix或者其他联合部署

    3.如果可以就把前端的静态文件都放在静态文件把,那些css,js把项目弄得很累蕞

    开始配置

    windows配置

    直接在servler.xml里修改 
    1. 首先找到Tomcat下的conf文件夹下的server.xml。 
    2. 通过习惯用的编辑器打开server.xml,可以看到Host标签,默认就有一个,一个Host代表一个站点,找到Host结束标签,我们在这中间配置虚拟路径。 
    3. 以如下配置为例。
     

    path指虚拟目录,与浏览器访问的路径相关,如果直接是path=”/”,访问就是http://localhost:8080/XX.png,如果为空串,也是一样,如果加了项目名,访问路径也要加,如path=”/static”,访问就是http://localhost:8080/static/XX.png。
    docBase指实际存在路径,一般在硬盘里。如果我们的文件home直接放在了D盘下,那docBase=“D:\static”
    reloadable指有文件更新时,是否重新加载,一般设置为true,设置为true后,不需重新启动,就能验证我们的改动,不过修改了java文件后,可以重新编译需要一小会,在IDE下的控制台里可以看见输出,一般没有输出滚动出来的时候,就可以了。这三个一般经常设置。
    debug指等级,一般设置为debug=“0”,提供最少的信息。设不设置无大影响。

    配置server.xml

    <Context path="/static" debug="0" docBase="D:\static" reloadable="true" />
    如果在eclipse配置要注意:直接在eclipse里面的servers的server.xml配置即可

     

    linux配置

    如果你的tomcat是放在跟我一样在/usr/local/apache-tomcat-7.0/下面

    /usr/local/apache-tomcat-7.0/conf/server.xml
    那打开它,像windows一样,增加如下

     <Context path="/static" docBase="/user/local/static" reloadable="true" crossContext="true"></Context>
    其实windows和linux基本是一样的,这个多亏tomcat的跨平台性,哈哈

     

    测试效果

    启动tomcat程序,在static文件夹添加一张图片

    打开浏览器,输入网址http://localhost:9080/static/hello.jpg(我的tomat端口可能和你们不一样,tomcat默认8080,我改了9080,所以你们自己改)

    效果如下:

    转载于:https://www.cnblogs.com/jiathis/p/11313980.html

    展开全文
  • 如果你不想用ngnix配置的话,只单独使用tomcat的话可以看看这篇文章,接下来开始 使用场景 1.单机开发有时侯如果放在war下每次clean都会清理当前项目下静态文件特别折腾. 2.只有启动tomcat即可静态文件放在外面不会...
  • 如果你不想用ngnix配置的话,只单独使用tomcat的话可以看看这篇文章,接下来开始 使用场景 1.单机开发有时侯如果放在war下每次clean都会清理当前项目下静态文件特别折腾. 2.只有启动tomcat即可静态文件放在外面不会...
  • linux 配置多个子域名映射tomcat中不同项目文件 1、进入tomcat下的根目录,进入到conf文件夹 2、使用vi编辑server.xml配置文件 3、更改端口号为80端口,那么访问项目可以不同输入端口号(tomcat默认端口...
  • Windows下的tomcat下的conf下的server.xml中的路径映射配置为: &lt;Context docBase="/img" path="/test/upload" reloadable="true" source="org.eclipse.jst.jee...
  • 如果你不想用ngnix配置的话,只单独使用tomcat的话可以看看这篇文章,接下来开始使用场景1.单机开发有时侯如果放在war下每次clean都会清理当前项目下静态文件特别折腾.2.只有启动tomcat即可静态文件放在外面不会被删,...
  • LinuxTomcat8.5配置虚拟主机图文教程

    千次阅读 2017-12-21 15:21:58
    LinuxTomcat8.5配置虚拟主机 》 首先我们需要将项目打包,上传到Linux,我这儿用一个纯静态项目作为实例,如果你打的是 war 包,往下看,会有详细的配置介绍; 项目上传后,创建一个 www 文件夹,输入...
  • Linux服务器中的tomcat配置虚拟路径

    千次阅读 2018-07-28 15:27:12
     有时候我们有固定的deployment的目录,需要我们将war包放在规定的文件夹里,而不是tomcat的webapps,这就需要我们配置虚拟路径,  假如我们将war包放在deployment/webapps下,我们的tomcat安装目录为:...
  • Linux配置本地端口映射

    万次阅读 2018-06-14 20:32:07
    前言:在linux服务器上,1024以下...但是为了安全起见,一般都是使用其他用户启动tomcat,可以采用端口映射的方式,比如映射80到8080端口。 一、iptables命令 -t<表>:指定要操纵的表; -A:向规则链中添...
  • 1.安装nginx相关依赖包 yum -y install gcc pcre-devel zlib-devel openssl openssl-devel ...3.配置 ./configure --prefix=/usr/local/nginx-1.12.2 4.创建日志文件夹 mkdir logs chmod 700 lo
  • 最后在宿主机器上打开对应端口的地址即可测试是否成功,到这一步Tomcat配置信息算是基本完成了。 问题总结,暂时没有遇到,从网上看到的就先留个眼。 通过端口映射后还是无法访问的话: 1、在win7...
  • 均为修改tomcat/bin/server.xml 在最后 替换 注意 docBase / 1 <Realm className="org.apache.catalina.realm.UserDatabaseRealm" 2 resourceName="UserDatabase"/> 3 4 <...
  • 1、linux wget下载tomcat 安装 选择要下载的版本 去tomcat库查看想要下载的版本  https://mirrors.cnnic.cn/apache/tomcat/ 下载 选择tomcat9的一个版本 wget ...
  • 一、tomcat的默认虚拟根目录和虚拟目录 在tomcat安装目录下的webapps的ROOT目录为tomcat默认...tomcat只能有一个默认根目录,一个 默认根目录只能映射一个 “文件系统目录”。 在tomcat安装目录的conf目录下的ser...
  • 以前服务都是在Windows上跑,8080端口改成80端口,以后访问的时候就不用写端口号了,但是最近在Linux上一直启动tomcat失败,经过查询发现非系统应用不能调用80端口,所以做了端口映射来实现。特此记录一下。iptables...
  • 目标:把web项目的目录映射tomcat中。这样项目不需要再放到tomcat的webapp下,启动tomcat可以自己去找对应的路径启动项目,可自己建一个自己的目录把项目放里面管理 方法如下:  1、conf/server.xml,(即tomcat...
  • 常用的的软件在Linux上进行配置:  修改HOSTNAME:vi /etc/sysconfig/network  修改HOSTNAME和IP的映射:vi /etc/hosts  关闭防火墙:service iptables stop  关闭防火墙的开机启动:chkconfig iptables off...
  • 常用软件在Linux上进行配置(jdk,tomcat,maven,svn) 配置前先进行以下五步 修改HOSTNAME(主机名) 原因是需要登录进服务器后,就可以很直观的知道该服务器部署了什么项目 vi /etc/sysconfig/network HOSTNAME=redis ...
  • 在本地 eclipse 双击 tomcat Document base : 对应的本地图片所在文件夹 如:D:/file Path: 对应映射些虚拟路径。 如/ 或者 /image 或者 /...Linux服务器配置方法更改server.xml文件,如图:docBase对应Documen...
  • 常用的软件在linux上进行配置: 0,首先一个新的虚拟机要先进行配置这几步: 1,修改HOSTANME vi /etc/sysconfig/network 2,修改HOSTNAME和IP的映射 vi /etc/hosts 3、关闭防火墙 service iptables stop 4、...
  • 前提条件 jdk环境 Tomcat。 jdk环境此处略。 1.官网下载Tomcat http://tomcat.apache.org/ 我这里下载的是8.5.43 2.上传至你的服务器 解压Tomcat;...tar -zxvf apache-tomcat-...3.外部文件映射下载配置 <Cont...
  • linux部署多个tomcat8.5

    2020-12-12 11:19:28
    首先配置好jdk环境 而后去apache官网下载对应的tomcat,之后解压即可 解压后改名: tar -xzvf apache-tomcat-8.5.54.tar.gz ...修改 Connector (映射的端口标签) 和修改 Server (关闭端口的标签) 然后其他的配置类似
  • 很多情况下,我们在linux服务器上安装了tomcat或者nginx之类的软件. 当我们想用80端口的时候,如果不用root用户启动就会报错.  这是因为,对于linux系统而言,1024以下的端口,普通用户是无法使用的. 网上关于这...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 122
精华内容 48
关键字:

linuxtomcat配置映射

linux 订阅