This script extracts the bitmap only from a binary file. It takes only a single input as file. This will be useful to users for exploring the writable working set for the VM.
Signed-off-by: Sanidhya Kashyap <sanidhya.ii...@gmail.com> --- scripts/extract-bitmap.py | 68 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100755 scripts/extract-bitmap.py diff --git a/scripts/extract-bitmap.py b/scripts/extract-bitmap.py new file mode 100755 index 0000000..64ce136 --- /dev/null +++ b/scripts/extract-bitmap.py @@ -0,0 +1,68 @@ +#!/usr/bin/python +# This python script helps in extracting the dirty bitmap present +# in the file after executing the log-dirty-bitmap command either +# from the qmp or hmp interface. This file only processes binary +# file obtained via command. +# +# Copyright (C) Sanidhya Kashyap <sanidhya.ii...@gmail.com> +# +# Authors: +# Sanidhya Kashyap +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, see <http://www.gnu.org/licenses/>. +# + +import struct +import argparse +from functools import partial + +long_bytes = 8 +complete_bitmap_list = [] + +def get_unsigned_long_integer(value): + return struct.unpack('<Q', value)[0] + +def get_long_integer(value): + return struct.unpack('<q',value)[0] + +def dump_bitmap(infile, bitmap_length): + count = 1 + bitmap_list = [] + for value in iter(partial(infile.read, long_bytes), ''): + if (count % bitmap_length): + count += 1 + bitmap_list.append(hex(get_unsigned_long_integer(value))) + else: + complete_bitmap_list.append(bitmap_list) + count = 1 + bitmap_list = [] + # currently, the complete list is printed. It is up to the user to decide about + # the usage of the bitmap as the bitmap provides the writable working set of the + # VM for a particular duration. + print complete_bitmap_list + +def main(): + extracter = argparse.ArgumentParser(description='Extract dirty bitmap from binary file.') + extracter.add_argument('infile', help='Input file to extract the bitmap') + args = extracter.parse_args() + print 'The filename is {}'.format(args.infile) + + infile = open(format(args.infile), 'rb') + + ram_bitmap_pages = get_long_integer(infile.read(long_bytes)) + print ram_bitmap_pages + bitmap_length = get_long_integer(infile.read(long_bytes)) + print bitmap_length + + dump_bitmap(infile, bitmap_length); + + infile.close() + +if __name__ == '__main__': + main() -- 1.8.3.1