Changes between Version 3 and Version 4 of Dev/KernelHack/COINS/worklog/201111


Ignore:
Timestamp:
Nov 11, 2011 2:22:57 PM (12 years ago)
Author:
mitty
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Dev/KernelHack/COINS/worklog/201111

    v3 v4  
    12071207new_debug with argv[i]: Invalid argument 
    12081208}}} 
     1209 
     1210 = 11/09 = 
     1211 == change sys_clock_gettime to getnstimeofday == 
     1212 * http://hira-consulting.com/wiki/index.php?getnstimeofday%28%29%2Flinux2.6 
     1213 
     1214 * vim arch/x86/kernel/new_debug.c 
     1215{{{#!diff 
     1216Index: arch/x86/kernel/new_debug.c 
     1217=================================================================== 
     1218--- arch/x86/kernel/new_debug.c (リビジョン 1390) 
     1219+++ arch/x86/kernel/new_debug.c (作業コピー) 
     1220@@ -35,7 +35,7 @@ 
     1221         printk(KERN_DEBUG "%s\n", message); 
     1222          
     1223         if (tp_user != NULL) { 
     1224-                sys_clock_gettime(CLOCK_REALTIME, &ts); 
     1225+                getnstimeofday(&ts); 
     1226                 if (copy_to_user(tp_user, &ts, sizeof(ts)) != 0) { 
     1227                         errno = -EFAULT; 
     1228                         goto out; 
     1229}}} 
     1230 
     1231 * windell46:i386 s0711489$ ./build 
     1232{{{ 
     1233Kernel: arch/x86/boot/bzImage is ready  (#12) 
     1234}}} 
     1235 * s0711489@ubuntu-lucid:~$ sudo /mnt/hgfs/tools/install.sh 
     1236 
     1237 
     1238 * gdb 
     1239{{{ 
     1240(gdb) file vmlinux 
     1241Reading symbols from /home/ugrad/07/s0711489/coursework/KernelHack/linux-2.6.35.14/i386/vmlinux...(no debugging symbols found)...done. 
     1242(gdb) b sys_new_debug 
     1243Breakpoint 1 at 0xc101d89c: file arch/x86/kernel/new_debug.c, line 9. 
     1244(gdb) target remote windell46:8832 
     1245Remote debugging using windell46:8832 
     12460xc1007cdf in native_safe_halt () 
     1247    at /home/ugrad/07/s0711489/coursework/KernelHack/linux-2.6.35.14/i386/arch/x86/include/asm/irqflags.h:49 
     124849              asm volatile("sti; hlt": : :"memory"); 
     1249(gdb) c 
     1250Continuing. 
     1251 
     1252Breakpoint 1, sys_new_debug (message_user=0x8048646 "new_debug()", tp_user=0x0) 
     1253    at arch/x86/kernel/new_debug.c:9 
     12549       SYSCALL_DEFINE2(new_debug, const char *, message_user, struct timespec*, tp_user) { 
     1255(gdb) l 
     12564       #include <linux/time.h> 
     12575 
     12586       /* from kernel/printk.c */ 
     12597       #define __LOG_BUF_LEN 1024 
     12608 
     12619       SYSCALL_DEFINE2(new_debug, const char *, message_user, struct timespec*, tp_user) { 
     126210              int errno; 
     126311              static char message[__LOG_BUF_LEN]; 
     126412              struct timespec ts; 
     126513              long len = 0; 
     1266(gdb) 
     126714 
     126815              if(tp_user != NULL && ! access_ok(VERIFY_WRITE, tp_user, sizeof(*tp_user)) ) { 
     126916                      errno = -EFAULT; 
     127017                      goto out; 
     127118              } 
     127219 
     127320              if (message_user == NULL) { 
     127421                      errno = -EINVAL; 
     127522                      goto out; 
     127623              } 
     1277(gdb) 
     127824              len = strnlen_user(message_user, __LOG_BUF_LEN); 
     127925              if (len == 0 || len > __LOG_BUF_LEN) { 
     128026                      errno = -EINVAL; 
     128127                      goto out; 
     128228              } 
     128329              if (strncpy_from_user(message, message_user, sizeof(message) - 1) < 0) { 
     128430                      errno = -EFAULT; 
     128531                      goto out; 
     128632              } 
     128733              message[sizeof(message) - 1] = '\0'; 
     1288(gdb) 
     128934 
     129035              printk(KERN_DEBUG "%s\n", message); 
     129136 
     129237              if (tp_user != NULL) { 
     129338                      getnstimeofday(&ts); 
     129439                      if (copy_to_user(tp_user, &ts, sizeof(ts)) != 0) { 
     129540                              errno = -EFAULT; 
     129641                              goto out; 
     129742                      } 
     129843              } 
     1299(gdb) 
     130044 
     130145              errno = 0; 
     130246 
     130347      out: 
     130448              return errno; 
     130549      } 
     1306(gdb) s 
     130715              if(tp_user != NULL && ! access_ok(VERIFY_WRITE, tp_user, sizeof(*tp_user)) ) { 
     1308(gdb) 
     130920              if (message_user == NULL) { 
     1310(gdb) 
     131124              len = strnlen_user(message_user, __LOG_BUF_LEN); 
     1312(gdb) 
     1313strnlen_user (s=0x8048646 "new_debug()", n=1024) 
     1314    at arch/x86/lib/usercopy_32.c:196 
     1315196     { 
     1316(gdb) finish 
     1317Run till exit from #0  strnlen_user (s=0x8048646 "new_debug()", n=1024) 
     1318    at arch/x86/lib/usercopy_32.c:196 
     1319sys_new_debug (message_user=0x8048646 "new_debug()", tp_user=0x0) 
     1320    at arch/x86/kernel/new_debug.c:25 
     132125              if (len == 0 || len > __LOG_BUF_LEN) { 
     1322Value returned is $1 = 12 
     1323(gdb) s 
     132429              if (strncpy_from_user(message, message_user, sizeof(message) - 1) < 0) { 
     1325(gdb) 
     1326strncpy_from_user (dst=0xc158da00 "", src=0x8048646 "new_debug()", count=1023) 
     1327    at arch/x86/lib/usercopy_32.c:114 
     1328114     { 
     1329(gdb) finish 
     1330Run till exit from #0  strncpy_from_user (dst=0xc158da00 "", 
     1331    src=0x8048646 "new_debug()", count=1023) at arch/x86/lib/usercopy_32.c:114 
     13320xc101d8ea in sys_new_debug (message_user=0x8048646 "new_debug()", tp_user=0x0) 
     1333    at arch/x86/kernel/new_debug.c:29 
     133429              if (strncpy_from_user(message, message_user, sizeof(message) - 1) < 0) { 
     1335Value returned is $2 = 11 
     1336(gdb) s 
     133735              printk(KERN_DEBUG "%s\n", message); 
     1338(gdb) 
     133933              message[sizeof(message) - 1] = '\0'; 
     1340(gdb) 
     134135              printk(KERN_DEBUG "%s\n", message); 
     1342(gdb) 
     1343printk (fmt=0xc1449542 "<7>%s\n") at kernel/printk.c:614 
     1344614             va_start(args, fmt); 
     1345(gdb) finish 
     1346Run till exit from #0  printk (fmt=0xc1449542 "<7>%s\n") at kernel/printk.c:614 
     1347sys_new_debug (message_user=0x8048646 "new_debug()", tp_user=0x0) 
     1348    at arch/x86/kernel/new_debug.c:37 
     134937              if (tp_user != NULL) { 
     1350Value returned is $3 = 33 
     1351(gdb) s 
     135249      } 
     1353(gdb) finish 
     1354Run till exit from #0  sys_new_debug (message_user=0x8048646 "new_debug()", 
     1355    tp_user=0x0) at arch/x86/kernel/new_debug.c:49 
     13560xc100288c in ?? () 
     1357Value returned is $4 = 0 
     1358(gdb) c 
     1359Continuing. 
     1360}}} 
     1361  * s0711489@ubuntu-lucid:~$ ./a.out 
     1362{{{ 
     1363new_debug() 
     1364}}} 
     1365 
     1366 * gdb 
     1367{{{ 
     1368Breakpoint 1, sys_new_debug (message_user=0xbfb1b9b9 "1", tp_user=0xbfb1b324) 
     1369    at arch/x86/kernel/new_debug.c:9 
     13709       SYSCALL_DEFINE2(new_debug, const char *, message_user, struct timespec*, tp_user) { 
     1371(gdb) l 
     13724       #include <linux/time.h> 
     13735 
     13746       /* from kernel/printk.c */ 
     13757       #define __LOG_BUF_LEN 1024 
     13768 
     13779       SYSCALL_DEFINE2(new_debug, const char *, message_user, struct timespec*, tp_user) { 
     137810              int errno; 
     137911              static char message[__LOG_BUF_LEN]; 
     138012              struct timespec ts; 
     138113              long len = 0; 
     1382(gdb) p message 
     1383$5 = "new_debug()", '\000' <repeats 1012 times> 
     1384(gdb) p message_user 
     1385$6 = 0xbfb1b9b9 "1" 
     1386(gdb) p tp_user 
     1387$7 = (struct timespec *) 0xbfb1b324 
     1388(gdb) p ts 
     1389$8 = {tv_sec = -570499584, tv_nsec = -1216356364} 
     1390(gdb) n 
     139115              if(tp_user != NULL && ! access_ok(VERIFY_WRITE, tp_user, sizeof(*tp_user)) ) { 
     1392(gdb) 
     139320              if (message_user == NULL) { 
     1394(gdb) 
     139524              len = strnlen_user(message_user, __LOG_BUF_LEN); 
     1396(gdb) 
     139725              if (len == 0 || len > __LOG_BUF_LEN) { 
     1398(gdb) 
     139929              if (strncpy_from_user(message, message_user, sizeof(message) - 1) < 0) { 
     1400(gdb) 
     140135              printk(KERN_DEBUG "%s\n", message); 
     1402(gdb) 
     140333              message[sizeof(message) - 1] = '\0'; 
     1404(gdb) 
     140535              printk(KERN_DEBUG "%s\n", message); 
     1406(gdb) 
     140737              if (tp_user != NULL) { 
     1408(gdb) 
     140938                      getnstimeofday(&ts); 
     1410(gdb) 
     141139                      if (copy_to_user(tp_user, &ts, sizeof(ts)) != 0) { 
     1412(gdb) p ts 
     1413$9 = {tv_sec = 1320815780, tv_nsec = 601392214} 
     1414(gdb) p tp_user 
     1415$10 = (struct timespec *) 0xbfb1b324 
     1416(gdb) n 
     141749      } 
     1418(gdb) p tp_user 
     1419$11 = (struct timespec *) 0xbfb1b324 
     1420(gdb) finish 
     1421Run till exit from #0  sys_new_debug (message_user=0xbfb1b9b9 "1", 
     1422    tp_user=0xbfb1b324) at arch/x86/kernel/new_debug.c:49 
     14230xc100288c in ?? () 
     1424Value returned is $12 = 0 
     1425(gdb) c 
     1426Continuing. 
     1427}}} 
     1428  * s0711489@ubuntu-lucid:~$ ./a.out 1 
     1429{{{ 
     1430[1320815780.601392214] 1 
     1431}}} 
     1432 
     1433 * s0711489@ubuntu-lucid:~$ ./a.out 1 2 3 4 
     1434{{{ 
     1435[1320815837.554212464] 1 
     1436[1320815837.554367435] 2 
     1437[1320815837.554373628] 3 
     1438[1320815837.554378429] 4 
     1439}}} 
     1440 * s0711489@ubuntu-lucid:~$ ./a.out 1 2 3 4 
     1441{{{ 
     1442[1320815846.036561542] 1 
     1443[1320815846.036726240] 2 
     1444[1320815846.036732514] 3 
     1445[1320815846.036737329] 4 
     1446}}} 
     1447 * s0711489@ubuntu-lucid:~$ tail /var/log/debug 
     1448{{{ 
     1449Nov  9 14:14:21 ubuntu-lucid kernel: [  187.486803] new_debug() 
     1450Nov  9 14:16:38 ubuntu-lucid kernel: [  364.616724] 1 
     1451Nov  9 14:17:17 ubuntu-lucid kernel: [  425.607587] 1 
     1452Nov  9 14:17:17 ubuntu-lucid kernel: [  425.607744] 2 
     1453Nov  9 14:17:17 ubuntu-lucid kernel: [  425.607750] 3 
     1454Nov  9 14:17:17 ubuntu-lucid kernel: [  425.607755] 4 
     1455Nov  9 14:17:26 ubuntu-lucid kernel: [  434.089936] 1 
     1456Nov  9 14:17:26 ubuntu-lucid kernel: [  434.090102] 2 
     1457Nov  9 14:17:26 ubuntu-lucid kernel: [  434.090109] 3 
     1458Nov  9 14:17:26 ubuntu-lucid kernel: [  434.090114] 4 
     1459}}} 
     1460 
     1461 == fix macro for new_debug == 
     1462 * vim arch/x86/include/asm/new_debug.h 
     1463{{{#!diff 
     1464Index: arch/x86/include/asm/new_debug.h 
     1465=================================================================== 
     1466--- arch/x86/include/asm/new_debug.h    (リビジョン 1381) 
     1467+++ arch/x86/include/asm/new_debug.h    (作業コピー) 
     1468@@ -2,6 +2,6 @@ 
     1469 #define _ASM_X86_NEW_DEBUG_H 
     1470  
     1471 #include <asm/unistd.h> 
     1472-#define new_debug(x) syscall(__NR_new_debug, x) 
     1473+#define new_debug(x,y) syscall(__NR_new_debug, x, y) 
     1474  
     1475 #endif /* _ASM_X86_NEW_DEBUG_H */ 
     1476}}} 
     1477 
     1478 * windell46:i386 s0711489$ ./build 
     1479{{{ 
     1480Kernel: arch/x86/boot/bzImage is ready  (#12) 
     1481}}} 
     1482 
     1483 == add new_debug to x86_64 == 
     1484 * vim arch/x86/include/asm/unistd_64.h 
     1485{{{#!diff 
     1486Index: arch/x86/include/asm/unistd_64.h 
     1487=================================================================== 
     1488--- arch/x86/include/asm/unistd_64.h    (リビジョン 1397) 
     1489+++ arch/x86/include/asm/unistd_64.h    (作業コピー) 
     1490@@ -665,6 +665,8 @@ 
     1491 __SYSCALL(__NR_recvmmsg, sys_recvmmsg) 
     1492 #define __NR_new_hello                         300 
     1493 __SYSCALL(__NR_new_hello, sys_new_hello) 
     1494+#define __NR_new_debug                         301 
     1495+__SYSCALL(__NR_new_debug, sys_new_debug) 
     1496  
     1497 #ifndef __NO_STUBS 
     1498 #define __ARCH_WANT_OLD_READDIR 
     1499}}} 
     1500 * viola06:x86_64 s0711489$ ./build 
     1501{{{ 
     1502Kernel: arch/x86/boot/bzImage is ready  (#5) 
     1503}}} 
     1504 * s0711489@ubuntu-lucid64:~$ sudo /mnt/hgfs/tools/install.sh 
     1505 
     1506 * s0711489@ubuntu-lucid64:~$ gcc -I /lib/modules/2.6.35.14/build/arch/x86/include/ 03/new_debug-sys.c 
     1507 
     1508 * s0711489@ubuntu-lucid64:~$ ./a.out 
     1509{{{ 
     1510new_debug() 
     1511}}} 
     1512 * s0711489@ubuntu-lucid64:~$ ./a.out 1 2 3 4 5 6 7 8 
     1513{{{ 
     1514[1320819346.718424802] 1 
     1515[1320819346.718761534] 2 
     1516[1320819346.718767685] 3 
     1517[1320819346.718772404] 4 
     1518[1320819346.718776934] 5 
     1519[1320819346.718781608] 6 
     1520[1320819346.718786123] 7 
     1521[1320819346.718790631] 8 
     1522}}} 
     1523 * s0711489@ubuntu-lucid64:~$ tail /var/log/kern.log 
     1524{{{ 
     1525Nov  9 15:15:24 ubuntu-lucid64 kernel: [   27.316107] cc1 used greatest stack depth: 4368 bytes left 
     1526Nov  9 15:15:36 ubuntu-lucid64 kernel: [   39.137213] new_debug() 
     1527Nov  9 15:15:46 ubuntu-lucid64 kernel: [   49.629638] 1 
     1528Nov  9 15:15:46 ubuntu-lucid64 kernel: [   49.629978] 2 
     1529Nov  9 15:15:46 ubuntu-lucid64 kernel: [   49.629985] 3 
     1530Nov  9 15:15:46 ubuntu-lucid64 kernel: [   49.629990] 4 
     1531Nov  9 15:15:46 ubuntu-lucid64 kernel: [   49.629994] 5 
     1532Nov  9 15:15:46 ubuntu-lucid64 kernel: [   49.629999] 6 
     1533Nov  9 15:15:46 ubuntu-lucid64 kernel: [   49.630004] 7 
     1534Nov  9 15:15:46 ubuntu-lucid64 kernel: [   49.630008] 8 
     1535}}}