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