当我使用gdb和qemu调试linux内核模块时,我得到不一致的结果。当我设置断点或分解自己的功能时,有时会收到“无法访问地址{function_address}的内存”的信息,并且有时我会获得反汇编的代码
我构建了一个自动化脚本,该脚本使用qemu引发了Linux vm。该脚本将我的内核模块文件传输到vm,构建内核模块并加载它。 该脚本从“ / sys / module / {ko名称} / sections /”“ .text”“ .bss”“ .data”中检索已加载的节地址,然后将具有节的检索地址的ko文件加载到gdb。
我不得不提到我禁用了kaslr并使用调试符号编译了LKM。
然后我尝试“破坏”我自己的功能,有时会失败。
Qemu cmdline:sudo qemu-system-x86_64 -enable-kvm -hda〜/ ubuntu.qcow -m 4096-内核/boot/vmlinuz-5.0.0-23-generic -append“ root = / dev / sda1 nokaslr “ -net用户,hostfwd = tcp :: 10022-:22 -net nic -snapshot -s
正在加载cmdline的LKM符号:add-symbol-file $ {module_path} $ {text} -s .data $ {data} -s .bss $ {bss}
我希望“ disas”命令的输出是反汇编的代码,但是例如,实际结果有时是: 转储函数的汇编代码: 0xffffffffc0344000 <+0>:无法访问地址0xffffffffc0344000的内存