一/ 清理内存
echo 1 > /proc/sys/vm/drop_caches
ipcrm -M 0xabababab -M 0x55555555 -M 0x77777777
二/ 查看进程运行在哪个核上:
方法1:ps -eF,其中PSR就是(processor that process is currently assigned to.)
方法2:ps -eF|grep hellWorld(程序名)
核绑定应用程序 taskset -c
三/ 更改CPU自动调频模式
更改使用的调节器,需要加载相应的内核模块,再更改scaling_governor文件,例如:
// modprobe cpufreq_performance
// echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
增加内核启动参数禁用自动调频功能:intel_pstate=disable
四/ 磁盘空间及分区查看
五/ kill命令用于终止进程
kill -9 [PID];-9表示强迫进程立即停止
通常用ps 查看进程PID ,用kill命令终止进程
六/ jobs查看当前有多少在后台运行的命令
jobs -l选项可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated。
七/
shell环境下 crtl+Z 将当前进程暂停并转到后台
bg %进程号,将后台进程状态转为运行
fg %进程号,将后台进程转至前台
八/
九/ cat用法
cat主要有三大功能:
1.一次显示整个文件。$ cat filename
2.从键盘创建一个文件。$ cat > filename
只能创建新文件,不能编辑已有文件.
3.将几个文件合并为一个文件。$cat file1 file2 > file
在linux shell脚本中我们经常见到类似于cat << EOF的语句,EOF是“end of file”,表示文本结束符。
十一/ 将GDB调试信息输出到文件
// (gdb) set logging file <文件名>
// (gdb) set logging on
// (gdb)…
// (gdb) set logging off
十二/ find命令用法
查找文件 find / -name “xx”
查找目录 find / -type d -name xx
查找指定大小文件 find / -size +1G
十三/ 查看IP及网关
nm-tool以及route
十四/ linux shell如何识别命令的执行路径
shell根据PATH变量保存的路径搜索这个命令名,如果最先在某个目录中找到这个程序就执行它,如果所有路径中都找不到这个程序,就返回没有找到命令的错误提示。
十五/ scp或者ssh命令远程登录时,提示:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
命令行输入:rm -rf ~/.ssh/known_hosts
十六/ qemu控制台
qemu环境下crtl+alt+2切换至控制台模式,help命令可以查看帮助信息;【crtl+alt+3串口;crtl+alt+4并口】
help info查看info的帮助信息,info registers可以查看x86所有寄存器状态
十七/ qemu开启KVM加速
添加行参数 -enable-kvm
判断cpu是否支持虚拟化技术KVM,查看flags标志中是否有vmx项;
判断当前环境是否启用了虚拟化功能,lsmod | grep kvm
十八/ Makefile中未定义的变量值为空
十九/ linux间共享文件夹
服务器端:
vi /etc/exports /home/whp/workstation 10.61.26.32(rw,no_root_squash,sync)
service rpcbind restart
service nfs restart
systemctl stop firewalld.service
showmount -e
宿主机端:
mount 10.61.26.89:/home/yude/share /home/whp/share_denverton/
sudo apt-get install nfs-common
十九/查看目标核上有哪些线程
ps -eLo ruser,pid,psr,args | awk ‘{if($3==5) print $0}’
ps -eLo psr | grep 2 | wc -l
二十/
查看内存信息: dmidecode -t memory
二十一/
vim中清除高亮 :noh
1)删除多行 :m,nd m,n分别为行号
2)撤销:按u
3)恢复:按crtl+r
4)查找:
/pattern 向后搜索字符串pattern
?pattern 向前搜索字符串pattern
“\c” 忽略大小写
“\C” 大小写敏感
n 下一个匹配(如果是/搜索,则是向下的下一个,?搜索则是向上的下一个)
N 上一个匹配(同上)
sublime text中:
1)撤销:crtl+z
2)恢复:crtl+y
二十二/
解压 tar -zxvf file-name.tar.gz
tar -jxvf file-name.tar.bz2
统一使用tar -xvf 自动识别文件格式
压缩 tar -zcvf file-name.tar.gz source-file
tar -jcvf file-name.tar.bz2 source-file
二十三/ 查看系统的环境变量
env
二十四/ 查看静态库中函数接口
nm -g --defined-only libxx.a
二十五/
对于-l链接库的顺序,编译器是从右往左连接的,如果链接库之间有依赖关系,应当注意链接库的顺序,比如 库A 依赖 库B,那么写成 -lB -lA就会报错。
二十六/ gdb多进程调试
(1)使用set follow-fork-mode mode来设置fork跟随模式。
set follow-fork-mode 所带的mode参数可以是以下的一种:
parent, gdb只跟踪父进程,不跟踪子进程,这是默认的模式。
child, gdb在子进程产生以后只跟踪子进程,放弃对父进程的跟踪。
进入gdb以后,我们可以使用show follow-fork-mode来查看目前的跟踪模式。
(2)Linux提供了set detach-on-fork mode命令来供我们使用。其使用的mode可以是以下的一种:
on, 只调试父进程或子进程的其中一个(根据follow-fork-mode来决定),这是默认的模式。
off, 父子进程都在gdb的控制之下,其中一个进程正常调试(根据follow-fork-mode来决定);另一个进程会被设置为暂停状态。
同样,show detach-on-fork显示了目前是的detach-on-fork模式
(3)使用set follow-exec-mode mode提供的模式来跟踪这个exec装载的程序。mode可以是以下的一种:
new 当发生exec的时候,如果这个选项是new,则新建一个inferior给执行起来的子进程,而父进程的inferior仍然保留,当前保留的inferior的程序状态是没有执行。
same 当发生exec的时候,如果这个选项是same(默认值),因为父进程已经退出,所以自动在执行exec的inferior上控制子进程。
(4)你可以使用时间延迟的方法,在子进程fork出来之后,使用Sleep函数等待一段时间再运行,在这段时间中你使用ps找到该进程,然后使用Attach方法把该进程附加到gdb中,从而达到可以调试子进程的目的。
二十七/
1)在汇编中如果直接使用eip寄存器,会提示错误信息。
Error: bad register name `%eip’;
2)在64位长模式下可以使用RIP相对寻址方式
PS. eflags寄存器也无法直接使用,通过popf/pushf间接获取;
二十八/
OUTPUT_ARCH(BFDARCH):设置输出文件的machine architecture(体系结构),BFDARCH为被BFD库使用的名字之一。可以用命令objdump -f查看。
三十/ ubuntu命令行更新软件源
1)sudo apt-get update
2)sudo apt-get upgrade/dist-upgrade
Centos/Fedora跟新软件源:
1)yum clean all
2)yum makecache
三十一/ make menuconfig出错
安装ncurses-devel,这个是红帽或者FC的安装程序,Ubuntu的需要安装libncurses5-dev
三十二/ 创建qemu虚拟机
第一步:创建虚拟机硬盘空间
qemu-img create -f qcow2 fedora.img 10G
第二步:安装虚拟机操作系统
qemu-system-x86_64 -m 2048 -enable-kvm fedora.img -cdrom ./Fedora-Live-Desktop-x86_64-20-1.iso
第三步:启动虚拟机
qemu-system-x86_64 -m 2048 -enable-kvm fedora.img
PS
qemu-system-x86_64 -m 2048 -enable-kvm -net nic -net tap,ifname=tap0,script=no,downscript=no CentOS6.img //
qemu-system-x86_64 -bios OVMF_64_serial.fd -serial stdio -smp 4 -m 2048 -enable-kvm -net nic -net tap,ifname=tap0,script=no,downscript=no ubuntu16.04.img
UEFI
build -p OvmfPkg/OvmfPkgX64.dsc -a X64 -D DEBUG_ON_SERIAL_PORT
qemu-system-x86_64 -bios OVMF.fd -serial stdio
三十四/ centos关闭防火墙
service iptables stop
chkconfig iptables off
ubuntu关闭防火墙
stop ufw
三十五/ GRUB的mbchk功能检查是否包含multiboot头【后续版本不再支持】
三十六/ VIM修改TAB空格长度
在.vimrc中添加以下代码后,重启vim即可实现按TAB产生4个空格:
set ts=4 (注:ts是tabstop的缩写,设TAB宽4个空格)
set expandtab
三十七/
ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/5//libstdc++.so
缺少g+±multilib库,安装即可: apt-get install g+±multilib
三十八/
ssh: connect to host 10.61.26.36 port 22: Connection timed out
可以从以下几个方面检查【首先检查ssh服务是否安装】
1 vi /etc/ssh/sshd_config:
然后将这两项的注释号去掉
Port 22
Protocol 2
2 检查sshd服务
sudo service ssh status.
3 检查名字是否一致
/etc/hostname, and /etc/hosts.
4 检查防火墙.
sudo service ufw status
//sudo apt-get install openssh-server
//sudo apt-get install openssh-client
四十/ ubuntu设置root用户密码:sudo passwd root
四十一/ linux下查看串口地址
dmesg | grep ttys*
四十二/ 查看磁盘分区方式
legacy bios + MBR//uefi bios + GPT
1)sudo parted /dev/sda
2)print all
四十四 判断elf文件是ICC编译还是GCC编译
objdump -t XX | grep “intel”
四十六汇编伪指令section的用法
(1).section .text
(2).section “.test”, “ax”
未指定section属性时,如果已初始化,则存入.data段;否则存入.bss段。
如果指定section属性,则无论是否初始化,都存入指定段。未初始化变量不会位于.bss段中。
结构体(struct)中所有变量是“共存”的优点是“有容乃大”,全面;缺点是struct内存空间的分配是粗放的,不管用不用,全分配。
而联合体(union)中是各变量是“互斥”的缺点就是不够“包容”;但优点是内存使用更为精细灵活,也节省了内存空间。
3)在unix系统中,一般标准的头文件路径为:
/usr/local/include
/usr/lib/gcc-lib/target/version/include
/usr/target/include
/usr/include
ubuntu14.04 gedit中文乱码解决方法:
gsettings set org.gnome.gedit.preferences.encodings auto-detected “[‘GB18030’, ‘GB2312’, ‘GBK’, ‘UTF-8’, ‘BIG5’, ‘CURRENT’, ‘UTF-16’]”
gsettings set org.gnome.gedit.preferences.encodings shown-in-menu “[‘GB18030’, ‘GB2312’, ‘GBK’, ‘UTF-8’, ‘BIG5’, ‘CURRENT’, ‘UTF-16’]”
grub配置文件的修改
注:一般修改/etc/default/grub文件,然后执行sudo update-grub来生成/boot/grub/grub.cfg
四十七 实现脚本定时执行
1)编写定时执行的脚本文件,记得将属性修改为可执行;
2)编写cron的配置文件,格式参考系统配置文件/etc/crontab;
3)crontab 配置文件,即可;确认cron进程正常运行中;
4)若想停止,/var/spool/cron/目录下删除相应文件
四十八 修改和重启网络服务
1)sudo vim /etc/network/interfaces
2)sudo /etc/init.d/networking restart
3)sudo service networking restart
4)sudo service network-manager restart
5)sudo ifdown eth0/sudo ifup eth0
四十九、Linux下创建和删除用户
创建用户:useradd -r -m -s /bin/bash spark
设置密码:passwd spark
赋予用户root权限:vim /etc/sudoers
添加:spark ALL=(ALL:ALL) ALL
删除用户:userdel -r spark
五十、查看/sys/firmware/acpi/tables
(1)sudo cat HPET > hpet.dat
(2)iasl -d hpet.dat
五十一、PCI设备的查看
(1)lspci -vvv;
(2)tree /sys/bus/pci/devices;
(3)cat /proc/bus/pci/devices | cut -f1
五十二、关闭irqbalance服务
开启IRQBalance服务:service irqbalance start
关闭IRQBalance服务:service irqbalance stop
关闭开机启动IRQBalance服务:chkconfig --level 123456 irqbalance off
五十三、Linux内核启动参数
(1)initcall_debug;
(2)nox2apic;
(3)pci=pcie_scan_all: Scan all possible PCIe devices. Otherwise we only look for one device below a PCIe downstream port.
(4)realloc= Enable/disable reallocating PCI bridge resources if allocations done by BIOS are too small to accommodate resources required by all child devices.
off: Turn realloc off
on: Turn realloc on
realloc same as realloc=on
(5)echo 1 > /sys/devices/system/cpu/cpu0/online
(6)earlyprintk=serial,0x3f8,115200;
(7)kaslr;
(8)isolcpus=1-11;
(9)intel_pstate=disable;
(10)rcu_nocbs=1-11;
(11)nmi_watchdog=0;
(12)nohz=off;
(13)irqaffinity=0;
(14)idle=poll;/nohlt
五十四、链接生成map
-Xlinker -Map=xx.map
五十五、对部分代码可以去除优化:
#pragma GCC push_options
#pragma GCC optimize (“O0”)
code
#pragma GCC pop_options
五十六、Ubuntu下安装KVM虚拟机
(1)KVM安装
sudo apt-get install qemu kvm qemu-kvm virtinst python-libvirt virt-viewer virt-manager qemu-system
P.S. 如果碰上一些莫名其妙的错误,百度不到的错误,有可能将qemu/kvm卸载后重新安装一遍就好了。
(2)设置网络桥接
宿主机和客户机之间有两种网络连接方式,分别是NAT和Bridge。
(3)虚拟机vm安装
sudo virt-install --name vm-ubuntu14 --virt-type kvm --hvm --accelerate --ram 1024 --vcpus 1 --disk path=./vm.img,size=10 --network network:default --cdrom …/ubuntu-14.04.6-desktop-amd64.iso
–virt-type:使用的hypervisor,如kvm、qemu、xen等;所有可用值可以使用’virsh capabilities’命令获取;
-v, --hvm:当物理机同时支持完全虚拟化和半虚拟化时,指定使用完全虚拟化;
–accelerate:当安装QEMU客户机时,如果支持可用KVM或KQEMU内核加速能力。除非一个客户机操作系统不兼容加速,这个选项是推荐最好加上。如果KVM和KQEMU都支持,KVM加速器优先使用。
-p, --paravirt:指定使用半虚拟化;
–boot=BOOTOPTS:指定安装过程完成后的配置选项,如指定引导设备次序、使用指定的而非安装的kernel/initrd来引导系统启动等 ;例如: --boot cdrom,hd,network:指定引导次序;
–boot kernel=KERNEL,initrd=INITRD,kernel_args=”console=/dev/ttyS0”:指定启动系统的内核及initrd文件;
–os-type=DISTRO_TYPE:操作系统类型,如Linux、unix或windows等;
–os-variant=DISTRO_VARIANT:某类型操作系统的变体,如rhel5、fedora8等;
-c CDROM, --cdrom=CDROM:光盘安装介质
更多参数详见:https://www.jianshu.com/p/2ff2e303bb05
(4)虚拟机操作命令 virsh --help
查看虚拟运行状态:virsh list -all
开启虚拟机:virsh start domain
重启虚拟机:virsh reboot/reset domain
关闭虚拟机:virsh shudown domain
强制关闭虚拟机:virsh destroy domain
打印虚拟机配置文件:virsh dumpxml domain
(5)基于KVM建立的虚拟机相关文件默认存放位置
kvm虚拟机配置文件位置:/etc/libvirt/qemu/??? <—都是xml文件
kvm虚拟机文件位置:/var/lib/libvirt/images/?? <—可以在建立虚拟机时指定??
kvm虚拟机的日志文件存放在:/var/log/libvirt/qemu/
/var/run/libvirt/qemu目录下存放虚拟机的pid文件和配置文件,配置文件与/etc/libvirt/qemu目录下对应的虚拟机文件相同,pid文件保存有此虚拟机进程号。
五十七
qemu卸载根据安装方式的不同也会有响应的卸载方式:(1)源码编译安装需要手动卸载;(2)ubutnu pakage安装需要命令卸载
(1) 源码编译安装的qemu需要手动卸载:
可执行文件默认放在/usr/local/bin
库文件默认存放在/usr/local/libexec
配置文件默认存放在/usr/local/etc
共享文件默认存放在/usr/local/share
卸载源码只需将上面四个目录中相关文件或者目录删除
#rm -rf /usr/local/bin/qemu-*
#rm -rf /usr/local/libexec/qemu-bridge-helper
#rm -rf /usr/local/etc/qemu
#rm -rf /usr/local/share/qemu
补充: rm -rf /usr/bin/qemu-*
(2) pakage安装方式需命令卸载
删除包和相关依赖
#sudo apt-get remove --auto-remove qemu-system-x86
五十八、nested技术,简单的说,就是在虚拟机上跑虚拟机。
第一步 打开kvm内核模块 nested特性
modprobe kvm-intel nested=1
或者修改modprobe.d 编辑 /etc/modprobe.d/kvm_mod.conf ,添加以下内容
options kvm-intel nested=y
检查是否打开nested功能
cat /sys/module/kvm_intel/parameters/nested
Y
五十九
编译预处理–>编译–>汇编–>链接
(1)编译预处理:C程序由编译器ccl完成;C++程序由cclplus完成
主要作用:include文件的包含;宏定义的替换;条件编译;
(2)编译:C程序由编译器ccl完成;C++程序由cclplus完成
主要作用:语法语义检查;生成汇编代码;
(3)汇编:由汇编器as完成
主要作用:将编译生成汇编代码转换成机器码
(4)链接:由链接器ld完成
主要作用:将编译汇编后多个文件进行链接,生成可执行文件;通常由.lds文件规定器格式;
六十
区别elf文件和bin文件:
1、elf文件格式是一个开放标准,各种UNIX系统的可执行文件都采用elf格式,它有三种不同的类型:
(1)可重定位的目标文件(Relocatable,或者Object File): gcc编译生成.o文件属于elf类型
(2)可执行文件(Executable): gcc链接生成可执行文件属于elf类型
(3)共享库(Shared Object,或者Shared Library)
elf文件除了包含机器码之外,还包含符号表/重定位表/段地址等,内核通过elf-loader来解析和执行elf文件。
2、bin文件是直接的二进制文件,只包含机器码。只要将程序加载到起始地址就可以执行。通过objcpy命令可以将elf文件转换成bin文件。
六十一
后缀为.asm/.s/.S都是汇编文件,在linux环境下,AT&T汇编格式的文件GCC可以直接编译;INTEL汇编格式的文件用NASM命令编译。
(1).asm为dos和windows下常见汇编文件后缀名;.s为linux下汇编文件后缀名;本质上都是文本文档,没有区别。
(2).s和.S汇编源文件的区别,GCC对.s文件的操作:汇编;对.S文件的操作:预处理/汇编。因而,.S文件中可以添加预处理的命令。
(3)原始程序码的扩展名指出所用编写程序所用的语言,以及GCC相对应的处理方法:
.c C 原始程序 ; 预处理、编译、汇编
.C C++ 原始程序 ; 预处理、编译、汇编
.cc C++ 原始程序 ; 预处理、编译、汇编
.cxx C++ 原始程序 ; 预处理、编译、汇编
.m Objective-C 原始程序 ; 预处理、编译、汇编
.i 已经过预处理之 C 原始程序 ; 编译、汇编
.ii 已经过预处理之 C++ 原始程序 ; 编译、汇编
.s 组合语言原始程序 ; 汇编
.S 组合语言原始程序 ; 预处理、汇编
.h 预处理文件(标头文件) ; 不常出现在指令行
六十二
GCC编译链接过程:
gcc -o test test.c包含的过程:
(1) gcc -E test.c
(2) gcc -S test.c
(3) gcc -c test.c
(4) ld crt1.o crti.o test.o -lc -dynamic-linker /lib/ld-linux.so.2 crtn.o
编译预处理–>编译(生成汇编文件.s)–>汇编(生成机器码,包含符号表,重定位表 .o文件)–>链接(生成可执行文件)
crt1.o:包含程序入口标号_start,由_start寻找标号main,从而进入用户主函数;
结合/crti.o/crtn.o实现对全局变量的初始化,对bss段数据初始化,对栈的初始化;
esp指针默认指向0xbfffffff(附近),用户可以使用约2G的栈总空间(实际上不可能);
线程默认栈大小2M;
可以通过ulimit -a进行查看;
可以通过ld行参数 --stack reserved,commit进行设置;
main函数结束后清理工作;
六十三
(1)时间局限性:如果CPU执行了程序的某个指令,那么很可能在接下来还会执行这个指令;如果CPU访问了某个数据,那么很有可能在接下来的运算中,还会访问这个数据。产生这种局限性的原因是因为很多程序都会经常出现循环操作。
(2)空间局限性:一旦CPU访问了某个存储单元,那么在不久以后,CPU很有可能会访问其附近的存储单元,也就是说,CPU在一段时间内访问的地址很可能是连续的。发生这种情况经常是执行顺序程序。
这里有两点要说明一下:时间局限性其实在小范围内包括了空间局限性,但反过来则不是了,换句话说就是CPU反复访问的数据或者指令是连续在一起的,而连续在一起的数据或者指令却不一定会反复使用,细心的读者应该从前面的说明看出来了。另一点就是,很多程序在执行指令(代码)和数据时,所呈现出来的局限性是不同的,有可能执行代码的时候呈现出时间局限性,而数据呈现出空间局限性,这也是为什么L1 Cache会分成Instruction Cache(指令缓存)和Data Cache(数据缓存)的原因之一。
正是由于CPU具有这两个局限性,才给Cache的实现提供了理论依据,让它以较小的容量来保证CPU所需要的大部分指令和数据,所以我们才说Cache的工作原理是基于这两个局限性。
六十四
(1)gcc默认使用-mhard-float硬浮点编译选项,使用FPU浮点运算单元处理浮点运算;
(2)如果选用-msoft-float软浮点编译选项,由GNU-C库的glibc提供浮点运算模拟.
(默认的glibc是没有浮点运算模拟支持的,但是在编译配置的时候可以编译生成浮点运算模拟支持(FPE Float Prcess Emulation))
(3)X86保留异常中向量号16:“X87 FPU浮点错误”,如果内核使用软浮点编译选项,应用程序使用硬浮点编译选项,应用程序运行会触发FPU浮点错误异常,异常程序中通过软件模拟浮点运算返回结果.
(4)FPU浮点运算命令后+s 表示单浮点精度;+l 表示双浮点精度
(1)–no-gc-sections:链接所有,无论是否使用;
(2)–gc-sections:只链接编译器认为用到的函数或是数据;
在连接命令行内使用了选项–gc-sections后,连接器可能将某些它认为没用的section过滤掉,此时就有必要强制连接器保留一些特定的section,可用KEEP()关键字达此目的。如KEEP((.text))或KEEP(SORT()(.text));
六十五
原子操作(atomic operation)意为"不可被中断的一个或一系列操作" 。
1/处理器会自动保证基本的内存操作的原子性。处理器保证从系统内存当中读取或者写入一个字节是原子的,意思是当一个处理器读取一个字节时,其他处理器不能访问这个字节的内存地址。奔腾6和最新的处理器能自动保证单处理器对同一个缓存行里进行16/32/64位的操作是原子的,但是复杂的内存操作处理器不能自动保证其原子性,比如跨总线宽度,跨多个缓存行,跨页表的访问。
2/处理器提供总线锁定和缓存锁定两个机制来保证复杂内存操作的原子性。
总线锁:使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,那么该处理器可以独占使用共享内存。但总线锁定把CPU和内存之间通信锁住了,这使得锁定期间,其他处理器不能操作其他内存地址的数据,所以总线锁定的开销比较大【说法不全对,老的处理器是直接锁总线。现行处理器锁的粒度应该是一条cacheline,不影响其他地址的访问】。
缓存锁:在同一时刻我们只需保证对某个内存地址的操作是原子性即可,所谓“缓存锁定”就是如果缓存在处理器缓存行中,内存区域在LOCK操作期间被锁定,当它执行锁操作回写内存时,处理器不在总线上声言LOCK#信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作的原子性,因为缓存一致性机制会阻止同时修改被两个以上处理器缓存的内存区域数据,当其他处理器回写已被锁定的缓存行的数据时会起缓存行无效。
有两种情况下处理器不会使用缓存锁定。第一种情况是:当操作的数据不能被缓存在处理器内部,或操作的数据跨多个缓存行(cache line),则处理器会调用总线锁定。第二种情况是:有些处理器不支持缓存锁定。
总线锁和缓存锁都是处理器自动实现的。
六十六
制作引导软盘镜像
1)用dd命令新建软盘镜像flp.img。
dd if=/dev/zero of=flp.img bs=512 count=2880
/dev/zero,是一个输入设备,你可你用它来初始化文件。该设备无穷尽地提供0,可以使用任何你需要的数目——设备提供的要多的多。他可以用于向设备或文件写入字符串0。
2)用losetup命令将flp.img与loop设备关联,这样我们可以通过/dev/loop3设备,像操作真实软盘样操作flp.img文件。
losetup /dev/loop0 flp.img
3)将可执行文件boot中的引导代码写入flp.img的第一个扇区。首先我们要确定.boot段在可执行文件boot中的位置,注意此位置不是指.boot段的VMA地址,而是指其存储在磁盘文件boot中的物理位置,我们用objdump命令查看:
objdump -h boot
六十七
When a program forks(分叉;分歧), gdb will continue to debug the parent process and the child process will run unimpeded. If you have set a breakpoint in any code which the child then executes, the child will get a SIGTRAP signal which (unless it catches the signal) will cause it to terminate.
通用方法是: 在child process 的代码中加入sleep, 然后attach child-pid。