2017-05-23 16 views
5

Tôi đang cố gắng để hack/hiểu các mô-đun nullfs hạt nhân (trên FreeBSD) để đến mục đích ấy, tôi làm sau:FreeBSD mô-đun gỡ lỗi - không thể truy cập vào bộ nhớ tại địa chỉ

Trên máy mục tiêu: kldstat cho :

Id Refs Address   Size  Name 
1 10 0xffffffff80200000 17e10c8 kernel 
2 1 0xffffffff819e2000 4cf0  vmxnet.ko 
3 1 0xffffffff819e7000 16e0  echo.ko 
4 1 0xffffffff81c11000 23dc  vmmemctl.ko 
5 1 0xffffffff81c14000 641b  nullfs.ko 

nm /boot/kernel/nullfs.ko | grep mount 
00000000000018f0 t null_getwritemount 
0000000000000540 t nullfs_mount 
0000000000000930 t nullfs_unmount 
       U vfs_mountedfrom 
       U vop_getwritemount_desc 

Trên máy tính cục bộ mà kết nối với mục tiêu thông qua một ống tên đóng vai trò như một serial console (tôi đang sử dụng máy ảo):

(kgdb) tr0 
kdb_sysctl_enter (oidp=<value optimized out>, arg1=<value optimized out>, 
arg2=0xfffffe004e7cc7f0, 
    req=<value optimized out>) at /usr/src/sys/kern/subr_kdb.c:446 
446      kdb_why = KDB_WHY_UNSET; 
Current language: auto; currently minimal 
(kgdb) getsyms 
During symbol reading, Incomplete CFI data; unspecified registers at 
0xffffffff8099497a. 
Id Refs Address Size  Name 
1 10 0x80200000 17e10c8 kernel 
2 1 0x819e2000 4cf0  vmxnet.ko 
3 1 0x819e7000 16e0  echo.ko 
4 1 0x81c11000 23dc  vmmemctl.ko 
5 1 0x81c14000 641b  nullfs.ko 
Select the list above with the mouse, paste into the screen 
and then press ^D. Yes, this is annoying. 
5 1 0x81c14000 641b  nullfs.ko 
add symbol table from file 
"/usr/obj/usr/src/sys/AIJAZ-DEBUG/modules/usr/src/sys/modules/nullfs/nullfs.ko.debug" 
at 
     .text_addr = 0x81c14000 
     .data_addr = 0x81c14000 
     .bss_addr = 0x81c14000 
(kgdb) add-kld nullfs.ko 
add symbol table from file "/boot/kernel/nullfs.ko.symbols" at 
     .text_addr = 0xffffffff81c14000 
     set_sysinit_set_addr = 0xffffffff81c15c90 
     set_sysuninit_set_addr = 0xffffffff81c15cb0 
     .rodata.str1.1_addr = 0xffffffff81c15cc8 
     set_modmetadata_set_addr = 0xffffffff81c15e48 
     set_sysctl_set_addr = 0xffffffff81c15e58 
     .data_addr = 0xffffffff81c15e60 
     .bss_addr = 0xffffffff81c16360 
(y or n) y 
Reading symbols from /boot/kernel/nullfs.ko.symbols... 
location expression too complex...done. 

(kgdb) b nullfs_mount 
Cannot access memory at address 0x81c14540 

Như người ta có thể thấy từ đầu ra của 'nm' và 'kldstat' ở trên, các địa chỉ thực sự là thích hợp.

Tôi thậm chí còn cố gắng thiết lập một "breakpoint phần cứng" tại địa chỉ trên:

(kgdb) hbreak *0x81c14540 
Hardware assisted breakpoint 1 at 0x81c14540: file 
/usr/src/sys/modules/nullfs/../../fs/nullfs/null_vfsops.c, line 74. 

(kgdb) c 
Continuing. 
Warning: 
Cannot insert breakpoint 1. 
Error accessing memory address 0x81c14540: Input/output error. 

Tuy nhiên lần này mặc dù breakpoint được đăng ký, nó không bao giờ được chèn vào. Khi tìm kiếm lỗi này trên Linux, có vẻ như điều này được xử lý bằng cách tắt CONFIG_DEBUG_RODATA như một phần của cấu hình hạt nhân (như là trên mỗi link này có vẻ là một cơ chế bảo vệ phát hiện khi phần văn bản hạt nhân đang bị ghi đè vì một số lý do). Điều này giúp với việc thiết lập các điểm ngắt phần mềm mà nếu không sẽ không được thiết lập. Tôi không biết đây có phải là lý do tại sao không.

Thứ hai tôi muốn biết rằng mặc dù địa chỉ thực tế trên đích nằm ở trên 0xffffffff00000000, trình gỡ lỗi chỉ báo cáo 8 bit thấp hơn. Có phải vì nó được hiểu/giả định?

Keen được nghe từ bạn folks

Trả lời

0

Không trực tiếp trả lời các câu tại sao nó xảy ra (tôi đã không nghiên cứu), tôi sẽ tư vấn để chạy trong QEMU mà thực hiện máy chủ GDB riêng của mình thay vì sử dụng một trong FreeBSD hạt nhân . Nếu bạn chạy QEMU mà không có ảo hóa HW, bạn thậm chí có thể đặt các điểm ngắt SW bất cứ nơi nào đáng tin cậy.

Các vấn đề liên quan