• 草稿本(1)总结


    linux之所以提供模块机制,是因为它本身为单内核,即优点为效率高,因为所有的内容都集成到了一起,但缺点是可扩展性和可维护性差,模块即填补这一缺陷,模块是一个为内核或其他内核模块提供使用功能的代码块,如实时文件系统,驱动程序等
     
    用户态进入内核态的唯一入口:使用系统调用。int $0x80指令把用户态的执行模式转变为内核态,并将控制权交给系统调用过程的起点system_call()
     
    kvm中与体系结构无关的代码位于virt/kvm下,与体系结构相关的分布于各个体系结构的kvm目录下,其他相关文件分布在include/asm或include/linux目录下,相关c文件分布在kernel目录下
     
    kvm_x86_ops结构体包含了以下操作:vcpu创建与管理,中断管理,寄存器管理,时钟管理。在kvm_init初始过程中,通过调用kvm_arch_init给kvm_x86_ops赋值
     
    客户机物理地址:为了让客户机os使用一个隔离的,从0开始连续的内存空间而引入的新的地址空间
    客户机虚拟地址(GVA)到客户机物理地址(GPA):由客户机os完成
    客户机物理地址(GPA)到宿主机物理地址(HPA):由VMM完成。为实现该步骤,VMM维护GPA到HPA的映射表。VMM截获后进行映射,每个客户机均有由VMM维护的这样一张表,使得VMM将客户机对应的HPA相互隔离开
     
    VMPTRLD:将指定VMCS与物理CPU绑定
    VMCLEAR:将物理CPU与VMCS解绑
    VMREAD:读VMCS中索引指定的域
    VMWRITE:写VMCS中索引指定的域
     
    TDP(Two-dimentional Paging):两级页表结构,两级指虚拟机内部维护自己的GVA到GPA的页表结构,VMM负责维护EPT/NPT进行GPA到HPA的映射。与传统SPT(shadow page table)影子页表不同,SPT进行一级映射,即直接从GVA到HPA,虚拟机对页面的初次访问进行完整的地址翻译(GVA->GPA->HVA->HPA)并建立GVA到HPA的映射
     
    pfn:host上物理页大小;gfn:guest上物理页大小。两者均为一个页帧
    kvm中每一个页表页都对应一个数据结构kvm_mmu_page,通过kvm_mmu_get_page得到或新建一个页表页
     
    MSR寄存器存放一些内核栈地址,执行入口地址等,在vmlaunch时可装载
     
    vcpu创建流程:vmx_create_vcpu创建vcpu->分配vcpu标识->初始化虚拟寄存器组->初始化vcpu状态信息->初始化额外部件->初始化其他信息。在vcpu创建vmx_create_vcpu中进行mmu的初始化。
     
    全局段描述符GDT存放在gdtr寄存器,局部段描述符LDT存放在ldtr寄存器
     
    反向映射,由hva计算可得到gfn,具体见计算公式。通过gfn反向映射得到spte,将对应项设置为空,映射这个页的所有页表项,由gfn(客户机页框号)找到映射此页的spte
     
    gcc内嵌汇编:
    _asm_violate("movl %1,%0" : "=r"(result) : "m"(input))
    _asm为asm别名
    _violate_表示编译器不优化代码
    movl %1,%0为汇编语句模板
    顺序:result对应%0,input对应%1
    =r :=表示为输出,r表示result与寄存器关联
    m:表示与内存相联,汇编中目的与源不能同时为内存m
    _asm_(汇编语句模板:输出:输入:破坏描述部分),最后一项即为会被修改的寄存器
     
    解压命令:
    tar -xvf file.tar 解压tar包
    tar -xzvf file.tar.gz 解压tar.gz包
    tar -xjvf file.tar.bz2 解压tar.bz2包
    tar -xzvf file.tar.z 解压tar.z包
     
    页框:把内存划分为长度为4KB或8KB的块,这种块就叫页框
    VMCALL .byte 0x0f,0x01,0xc1 表示VMCALL指定的机器码
     
    linux服务器版安装图形界面命令
    apt-get install x-windows-sytem-core
    apt-get install gdm
    apt-get install ubuntu-desktop
    apt-get install gnome-core
     
    栈帧:ebp栈帧底部,帧指针(高地址),esp栈帧顶部,栈指针(低地址,函数返回地址)
    举例:执行函数fun
    初:pushl %ebp 将原来ebp压栈
    movl %esp,%ebp 将esp给ebp,作为新的fun的ebp
    末:movl %ebp,%esp,ebp给esp
    popl %ebp  fun执行完后,出栈压入的ebp,此时esp与ebp恢复为初始
     
    ubuntu找不到/var/log/messages方法:
    由于其默认被注释,在/etc/rsylogd.d/50-default.conf中将 *.=info一直到 -/var/log/messages注释去掉
    再重启服务sudo service rsyslog restore
     
    gdb命令:
    gdb x  查看内存地址中的值
    gdb x/<n/f/u> <addr>
    n为正整数,表示需要显示的内存单元个数
    f为显示格式:x为十六进制,d为十进制,t为二进制
    u为当前地址往后请求的字节数,默认为4 bytes,b为单字节,h为双字节,w为四字节,g为八字节
     
    gdb:
    c:继续调试,直到下一个断点或程序结束
    s:执行一行代码,如果有函数调用,则进入该函数
    n:执行一行代码,函数调用一并执行
    si:类似s命令,但针对于汇编指令
    ni:类似n命令,但针对于汇编指令
    p:输出
    i  b:查看断点
    i  r:查看寄存器信息。最左为寄存器,中间为内存地址,最右为内存对应值
    bt:查看堆栈信息
     
    在一次函数调用中,栈依次压入:参数,返回地址,ebp,函数的局部变量
     
    开机不能进入图形界面,修改/home下隐藏文件 .Xauthority,原为root权限,修改为本地用户即可
    sudo chown cjx:cjx .Xauthority
    find -name .Xauthor*
    rm -rf .Xauthor*
     
    通过qemu命令行创建虚拟机
    1、创建img:dd if =/dev/zero of=xxx.img bs=1M count=8192 在当前目录下创建8G的img
    2、安装iso:qemu-system-i386 -enable-kvm -m 1024 -smp 1 -boot order=dc -had /.../xxx.img -cdrom /.../xxx.iso
     
    gdb开启虚拟机命令
    gdb qemu-system-i386
    set args --enable-kvm -m 1024 -boot menu=on xxx.img -vnc :13
    r
    vncviewer :13
    autoreconf:not found解决方法
    sudo apt-get install autoconf automake libtool
     
    查看.o文件的反汇编代码
    objdump -DS xxx.o > xxx.txt
     
    图形界面以root登录:先设置root密码,sudo passwd root
    修改/etc/lightdm/lightdm.conf
    添加:user-session=ubuntu
    greeter-show-manual-login=true
    allow-guest=false
     
    打开core dump
    ulimit -a 可查看当前状态
    ulimit -c :输出为0则表示关闭,输出为unlimited则打开
    ulimit -c 1024设置大小为core ,1024KB
     
    关闭DEP(堆栈不可执行),Stack Protector(栈保护)
    gcc -fno -stack-protector -z execstack -o xxx xxx.c
    关闭内存地址随机化
    sudo -s
    echo 0>/proc/sys/kernel/randomize_va_space
    exit
    打开内存地址随机化
    echo 2>/proc/sys/kernel/randomize_va_space
     
    vnc连接上没有桌面的解决方法
    1、以root方式开启vnc
    2、在/etc/.vnc/xstartup下修改unset
     
    查找需要安装的包
    apt-cache search zlib
     
    pc_init_pci调用了pc_init1
    pc_init1中pc_cpus_init和pc_memory_init分别为cpu和内存的初始化,函数位于pc_piix.c
     
    查看libvirt是否启动
    ps -le | grep libvirt *
    重启libvirt
    libvirtd -d
     
    kvm中,kvm_arch_vcpu_setup后面的create_vcpu_fd为proc创建控制fd,让qemu使用
    kvm创建qemu内存映射入口在kernel中kvm_vm_ioctl的case KVM_SET_USER_MEMORY_REGION。调用kvm_vm_ioctl_set_memory_region,kvm中用Kvm_memory_slot来维护用户空间地址映射
     
    编译内核
    make bzimage j4  用4个cpu编译,默认只用一个cpu
     
    top显示进程运行状态,netstat显示网络连接
     
    ioctl执行流保护
    用户空间ioctl->SYSCALL_DEFINE3(ioctl,unsigned...)->do_vfs_ioctl->vfs_ioctl->陷入到VMM中的kvm_vcpu_ioctl。其在kvm的file_operations有定义.ioctl = kvm_vcpu_ioctl
     
    make menuconfig时报错:'make menuconfig' requires the ncurses libraries
    安装光标库相关包即可
     
    1 [root@localhost ]# yum list | grep ncurses
    ncurses.x86_64                         5.7-3.20090208.el6               @anaconda-CentOS-201106060106.x86_64/6.0
    ncurses-base.x86_64                    5.7-3.20090208.el6               @anaconda-CentOS-201106060106.x86_64/6.0
    ncurses-libs.x86_64                    5.7-3.20090208.el6               @anaconda-CentOS-201106060106.x86_64/6.0
    ncurses-devel.i686                     5.7-3.20090208.el6               base
    ncurses-devel.x86_64                   5.7-3.20090208.el6               base
    ncurses-libs.i686                      5.7-3.20090208.el6               base
    ncurses-static.x86_64                  5.7-3.20090208.el6               base
    ncurses-term.x86_64                    5.7-3.20090208.el6               base
     
    2 查看已经安装的包
     
    [root@localhost ]#  rpm -qa | grep ncurses
    ncurses-5.7-3.20090208.el6.x86_64
    ncurses-base-5.7-3.20090208.el6.x86_64
    ncurses-libs-5.7-3.20090208.el6.x86_64
     
    3 只需再安装一个ncurses-devel.x86_64即可
     
    [root@localhost ]# yum install ncurses-devel.x86_64  -y
  • 相关阅读:
    比较两个NSDate
    关于修改UIWebView的UserAgent
    iOS9适配 之 关于info.plist 第三方登录 添加URL Schemes白名单
    iOS系统自带分享功能
    swift中的协议
    iOS性能优化:Instruments使用实战
    iOS利用HealthKit框架从健康app中获取步数信息
    iOS设备型号
    iOS消息推送机制
    Swift进阶
  • 原文地址:https://www.cnblogs.com/scu-cjx/p/6878179.html
Copyright © 2020-2023  润新知