| | 882 | |
| | 883 | = 10/19 = |
| | 884 | == add new system call (i386) == |
| | 885 | * windell57:i386 s0711489$ vim arch/x86/include/asm/unistd_32.h |
| | 886 | * windell57:i386 s0711489$ vim arch/x86/kernel/syscall_table_32.S |
| | 887 | * windell57:i386 s0711489$ vim arch/x86/include/asm/new_hello.h |
| | 888 | * windell57:i386 s0711489$ vim arch/x86/kernel/new_hello.c |
| | 889 | |
| | 890 | = 10/21 = |
| | 891 | == add new system call (i386) (cont) == |
| | 892 | * windell57:i386 s0711489$ vim arch/x86/kernel/new_hello.c |
| | 893 | * windell57:i386 s0711489$ vim arch/x86/kernel/Makefile |
| | 894 | {{{#!diff |
| | 895 | Index: arch/x86/kernel/syscall_table_32.S |
| | 896 | =================================================================== |
| | 897 | --- arch/x86/kernel/syscall_table_32.S (revision 1352) |
| | 898 | +++ arch/x86/kernel/syscall_table_32.S (revision 1353) |
| | 899 | @@ -337,3 +337,4 @@ |
| | 900 | .long sys_rt_tgsigqueueinfo /* 335 */ |
| | 901 | .long sys_perf_event_open |
| | 902 | .long sys_recvmmsg |
| | 903 | + .long sys_new_hello |
| | 904 | Index: arch/x86/kernel/Makefile |
| | 905 | =================================================================== |
| | 906 | --- arch/x86/kernel/Makefile (revision 1352) |
| | 907 | +++ arch/x86/kernel/Makefile (revision 1353) |
| | 908 | @@ -131,3 +131,5 @@ |
| | 909 | obj-$(CONFIG_PCI_MMCONFIG) += mmconf-fam10h_64.o |
| | 910 | obj-y += vsmp_64.o |
| | 911 | endif |
| | 912 | + |
| | 913 | +obj-y += new_hello.o |
| | 914 | Index: arch/x86/kernel/new_hello.c |
| | 915 | =================================================================== |
| | 916 | --- arch/x86/kernel/new_hello.c (revision 0) |
| | 917 | +++ arch/x86/kernel/new_hello.c (revision 1353) |
| | 918 | @@ -0,0 +1,7 @@ |
| | 919 | +#include <linux/kernel.h> |
| | 920 | +#include <linux/syscalls.h> |
| | 921 | + |
| | 922 | +SYSCALL_DEFINE1(new_hello, int, i) { |
| | 923 | + printk(KERN_DEBUG "new_hello() syscall with %d", i); |
| | 924 | + return i; |
| | 925 | +} |
| | 926 | Index: arch/x86/include/asm/unistd_32.h |
| | 927 | =================================================================== |
| | 928 | --- arch/x86/include/asm/unistd_32.h (revision 1352) |
| | 929 | +++ arch/x86/include/asm/unistd_32.h (revision 1353) |
| | 930 | @@ -343,10 +343,11 @@ |
| | 931 | #define __NR_rt_tgsigqueueinfo 335 |
| | 932 | #define __NR_perf_event_open 336 |
| | 933 | #define __NR_recvmmsg 337 |
| | 934 | +#define __NR_new_hello 338 |
| | 935 | |
| | 936 | #ifdef __KERNEL__ |
| | 937 | |
| | 938 | -#define NR_syscalls 338 |
| | 939 | +#define NR_syscalls 339 |
| | 940 | |
| | 941 | #define __ARCH_WANT_IPC_PARSE_VERSION |
| | 942 | #define __ARCH_WANT_OLD_READDIR |
| | 943 | Index: arch/x86/include/asm/new_hello.h |
| | 944 | =================================================================== |
| | 945 | --- arch/x86/include/asm/new_hello.h (revision 0) |
| | 946 | +++ arch/x86/include/asm/new_hello.h (revision 1353) |
| | 947 | @@ -0,0 +1,7 @@ |
| | 948 | +#ifndef _ASM_X86_NEW_HELLO_H |
| | 949 | +#define _ASM_X86_NEW_HELLO_H |
| | 950 | + |
| | 951 | +#include <asm/unistd.h> |
| | 952 | +#define new_hello(x) syscall(__NR_new_hello, x) |
| | 953 | + |
| | 954 | +#endif /* _ASM_X86_NEW_HELLO_H */ |
| | 955 | }}} |
| | 956 | |
| | 957 | * windell57:i386 s0711489$ make |
| | 958 | {{{ |
| | 959 | Kernel: arch/x86/boot/bzImage is ready (#2) |
| | 960 | }}} |
| | 961 | * windell57:i386 s0711489$ make modules |
| | 962 | |
| | 963 | * s0711489@ubuntu-lucid:~$ sudo /mnt/hgfs/tools/install.sh |
| | 964 | * s0711489@ubuntu-lucid:~$ sudo reboot |
| | 965 | {{{ |
| | 966 | Linux ubuntu-lucid 2.6.35.14 #2 SMP Fri Oct 21 14:25:51 JST 2011 i686 GNU/Linux |
| | 967 | Ubuntu 10.04.3 LTS |
| | 968 | }}} |
| | 969 | |
| | 970 | |
| | 971 | * s0711489@ubuntu-lucid:~$ cat > new_hello.c |
| | 972 | {{{#!cc |
| | 973 | #include <unistd.h> |
| | 974 | #include <syscall.h> |
| | 975 | #include <stdio.h> |
| | 976 | |
| | 977 | int main (void) { |
| | 978 | printf ("new_helloc(1) -> %d\n", |
| | 979 | syscall(__NR_new_hello, 1) |
| | 980 | ); |
| | 981 | } |
| | 982 | }}} |
| | 983 | * s0711489@ubuntu-lucid:~$ gcc -I /lib/modules/2.6.35.14/build/arch/x86/include/ new_hello.c |
| | 984 | {{{ |
| | 985 | new_hello.c: In function ‘main’: |
| | 986 | new_hello.c:8: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘long int’ |
| | 987 | }}} |
| | 988 | |
| | 989 | * dmesgにしか出なかったので、KERN_DEBUGを消す |
| | 990 | |
| | 991 | * windell57:i386 s0711489$ make |
| | 992 | {{{ |
| | 993 | Kernel: arch/x86/boot/bzImage is ready (#3) |
| | 994 | }}} |
| | 995 | * windell57:i386 s0711489$ make modules |
| | 996 | |
| | 997 | * s0711489@ubuntu-lucid:~$ sudo /mnt/hgfs/tools/install.sh |
| | 998 | * s0711489@ubuntu-lucid:~$ sudo reboot |
| | 999 | |
| | 1000 | |
| | 1001 | * s0711489@ubuntu-lucid:~$ cat > new_hello.c |
| | 1002 | * s0711489@ubuntu-lucid:~$ gcc -I /lib/modules/2.6.35.14/build/arch/x86/include/ new_hello.c |
| | 1003 | * s0711489@ubuntu-lucid:~$ ./a.out |
| | 1004 | {{{ |
| | 1005 | new_helloc(1) -> 1 |
| | 1006 | }}} |
| | 1007 | |
| | 1008 | * s0711489@ubuntu-lucid:~$ dmesg | tail -n 1 |
| | 1009 | {{{ |
| | 1010 | [ 116.986628] new_hello() syscall with 1 |
| | 1011 | }}} |
| | 1012 | * KERN_DEBUGを消したが、結局dmesgにしか出ない |
| | 1013 | * \nの追加 |
| | 1014 | {{{#!diff |
| | 1015 | Index: arch/x86/kernel/new_hello.c |
| | 1016 | =================================================================== |
| | 1017 | --- arch/x86/kernel/new_hello.c (revision 1354) |
| | 1018 | +++ arch/x86/kernel/new_hello.c (revision 1355) |
| | 1019 | @@ -2,6 +2,6 @@ |
| | 1020 | #include <linux/syscalls.h> |
| | 1021 | |
| | 1022 | SYSCALL_DEFINE1(new_hello, int, i) { |
| | 1023 | - printk(KERN_DEBUG "new_hello() syscall with %d", i); |
| | 1024 | + printk("new_hello() syscall with %d\n", i); |
| | 1025 | return i; |
| | 1026 | } |
| | 1027 | }}} |
| | 1028 | |
| | 1029 | * windell57:i386 s0711489$ make |
| | 1030 | {{{ |
| | 1031 | Kernel: arch/x86/boot/bzImage is ready (#4) |
| | 1032 | }}} |
| | 1033 | * windell57:i386 s0711489$ make modules |
| | 1034 | * s0711489@ubuntu-lucid:~$ sudo /mnt/hgfs/tools/install.sh |
| | 1035 | |
| | 1036 | |
| | 1037 | * s0711489@ubuntu-lucid:~$ cat > new_hello.c |
| | 1038 | * s0711489@ubuntu-lucid:~$ gcc -I /lib/modules/2.6.35.14/build/arch/x86/include/ new_hello.c |
| | 1039 | * s0711489@ubuntu-lucid:~$ ./a.out |
| | 1040 | {{{ |
| | 1041 | new_helloc(1) -> 1 |
| | 1042 | }}} |
| | 1043 | * s0711489@ubuntu-lucid:~$ ./a.out 1 |
| | 1044 | {{{ |
| | 1045 | new_helloc(2) -> 2 |
| | 1046 | }}} |
| | 1047 | * s0711489@ubuntu-lucid:~$ ./a.out 2 |
| | 1048 | {{{ |
| | 1049 | new_helloc(2) -> 2 |
| | 1050 | }}} |
| | 1051 | * s0711489@ubuntu-lucid:~$ ./a.out 3 |
| | 1052 | {{{ |
| | 1053 | new_helloc(2) -> 2 |
| | 1054 | }}} |
| | 1055 | * s0711489@ubuntu-lucid:~$ ./a.out 1 2 3 4 5 |
| | 1056 | {{{ |
| | 1057 | new_helloc(6) -> 6 |
| | 1058 | }}} |
| | 1059 | |
| | 1060 | * s0711489@ubuntu-lucid:~$ dmesg | tail |
| | 1061 | {{{ |
| | 1062 | [ 62.656820] new_hello() syscall with 1 |
| | 1063 | [ 66.271703] new_hello() syscall with 2 |
| | 1064 | [ 68.411791] new_hello() syscall with 2 |
| | 1065 | [ 70.395934] new_hello() syscall with 2 |
| | 1066 | [ 77.010426] new_hello() syscall with 6 |
| | 1067 | }}} |
| | 1068 | |
| | 1069 | * /var/log/messages /var/log/kern.log /var/log/syslog にも出るようになった |
| | 1070 | {{{ |
| | 1071 | Oct 21 15:29:00 ubuntu-lucid kernel: [ 62.656820] new_hello() syscall with 1 |
| | 1072 | Oct 21 15:29:04 ubuntu-lucid kernel: [ 66.271703] new_hello() syscall with 2 |
| | 1073 | Oct 21 15:29:06 ubuntu-lucid kernel: [ 68.411791] new_hello() syscall with 2 |
| | 1074 | Oct 21 15:29:08 ubuntu-lucid kernel: [ 70.395934] new_hello() syscall with 2 |
| | 1075 | Oct 21 15:29:14 ubuntu-lucid kernel: [ 77.010426] new_hello() syscall with 6 |
| | 1076 | }}} |
| | 1077 | |
| | 1078 | * KERN_DEBUGを戻す |
| | 1079 | {{{#!diff |
| | 1080 | Index: arch/x86/kernel/new_hello.c |
| | 1081 | =================================================================== |
| | 1082 | --- arch/x86/kernel/new_hello.c (revision 1356) |
| | 1083 | +++ arch/x86/kernel/new_hello.c (revision 1357) |
| | 1084 | @@ -2,6 +2,6 @@ |
| | 1085 | #include <linux/syscalls.h> |
| | 1086 | |
| | 1087 | SYSCALL_DEFINE1(new_hello, int, i) { |
| | 1088 | - printk("new_hello() syscall with %d\n", i); |
| | 1089 | + printk(KERN_DEBUG "new_hello() syscall with %d\n", i); |
| | 1090 | return i; |
| | 1091 | } |
| | 1092 | }}} |
| | 1093 | |
| | 1094 | * windell57:i386 s0711489$ make |
| | 1095 | {{{ |
| | 1096 | Kernel: arch/x86/boot/bzImage is ready (#5) |
| | 1097 | }}} |
| | 1098 | * windell57:i386 s0711489$ make modules |
| | 1099 | |
| | 1100 | * s0711489@ubuntu-lucid:~$ sudo /mnt/hgfs/tools/install.sh |
| | 1101 | |
| | 1102 | |
| | 1103 | * s0711489@ubuntu-lucid:~$ ./a.out |
| | 1104 | {{{ |
| | 1105 | new_helloc(1) -> 1 |
| | 1106 | }}} |
| | 1107 | * s0711489@ubuntu-lucid:~$ ./a.out 2 |
| | 1108 | {{{ |
| | 1109 | new_helloc(2) -> 2 |
| | 1110 | }}} |
| | 1111 | * s0711489@ubuntu-lucid:~$ ./a.out 2 4 |
| | 1112 | {{{ |
| | 1113 | new_helloc(3) -> 3 |
| | 1114 | }}} |
| | 1115 | * s0711489@ubuntu-lucid:~$ ./a.out 2 3 4 |
| | 1116 | {{{ |
| | 1117 | new_helloc(4) -> 4 |
| | 1118 | }}} |
| | 1119 | |
| | 1120 | * s0711489@ubuntu-lucid:~$ tailf /var/log/syslog |
| | 1121 | {{{ |
| | 1122 | Oct 21 15:39:29 ubuntu-lucid kernel: [ 55.626892] new_hello() syscall with 1 |
| | 1123 | Oct 21 15:40:18 ubuntu-lucid kernel: [ 104.990720] new_hello() syscall with 2 |
| | 1124 | Oct 21 15:40:20 ubuntu-lucid kernel: [ 106.772709] new_hello() syscall with 3 |
| | 1125 | Oct 21 15:40:23 ubuntu-lucid kernel: [ 109.867051] new_hello() syscall with 4 |
| | 1126 | }}} |
| | 1127 | |
| | 1128 | * /var/log/messages には出なくなる |
| | 1129 | |
| | 1130 | === trace sys_new_hello with GDB === |
| | 1131 | * windell57:i386 s0711489$ gdb |
| | 1132 | {{{ |
| | 1133 | (gdb) file vmlinux |
| | 1134 | Reading symbols from /home/ugrad/07/s0711489/coursework/KernelHack/linux-2.6.35.14/i386/vmlinux...(no debugging symbols found)...done. |
| | 1135 | (gdb) b sys_new_hello |
| | 1136 | Breakpoint 1 at 0xc101d87c: file arch/x86/kernel/new_hello.c, line 4. |
| | 1137 | (gdb) target remote localhost:8832 |
| | 1138 | Remote debugging using localhost:8832 |
| | 1139 | 0xc1007cdf in native_safe_halt () |
| | 1140 | at /home/ugrad/07/s0711489/coursework/KernelHack/linux-2.6.35.14/i386/arch/x86/include/asm/irqflags.h:49 |
| | 1141 | 49 asm volatile("sti; hlt": : :"memory"); |
| | 1142 | (gdb) c |
| | 1143 | Continuing. |
| | 1144 | |
| | 1145 | Breakpoint 1, sys_new_hello (i=1) at arch/x86/kernel/new_hello.c:4 |
| | 1146 | 4 SYSCALL_DEFINE1(new_hello, int, i) { |
| | 1147 | (gdb) n |
| | 1148 | 5 printk(KERN_DEBUG "new_hello() syscall with %d\n", i); |
| | 1149 | (gdb) l |
| | 1150 | 1 #include <linux/kernel.h> |
| | 1151 | 2 #include <linux/syscalls.h> |
| | 1152 | 3 |
| | 1153 | 4 SYSCALL_DEFINE1(new_hello, int, i) { |
| | 1154 | 5 printk(KERN_DEBUG "new_hello() syscall with %d\n", i); |
| | 1155 | 6 return i; |
| | 1156 | 7 } |
| | 1157 | (gdb) s |
| | 1158 | printk (fmt=0xc1449502 "<7>new_hello() syscall with %d\n") |
| | 1159 | at kernel/printk.c:614 |
| | 1160 | 614 va_start(args, fmt); |
| | 1161 | (gdb) l |
| | 1162 | 609 r = vkdb_printf(fmt, args); |
| | 1163 | 610 va_end(args); |
| | 1164 | 611 return r; |
| | 1165 | 612 } |
| | 1166 | 613 #endif |
| | 1167 | 614 va_start(args, fmt); |
| | 1168 | 615 r = vprintk(fmt, args); |
| | 1169 | 616 va_end(args); |
| | 1170 | 617 |
| | 1171 | 618 return r; |
| | 1172 | (gdb) n |
| | 1173 | 615 r = vprintk(fmt, args); |
| | 1174 | (gdb) |
| | 1175 | 614 va_start(args, fmt); |
| | 1176 | (gdb) |
| | 1177 | 615 r = vprintk(fmt, args); |
| | 1178 | (gdb) |
| | 1179 | 619 } |
| | 1180 | (gdb) |
| | 1181 | sys_new_hello (i=1) at arch/x86/kernel/new_hello.c:7 |
| | 1182 | 7 } |
| | 1183 | (gdb) l |
| | 1184 | 2 #include <linux/syscalls.h> |
| | 1185 | 3 |
| | 1186 | 4 SYSCALL_DEFINE1(new_hello, int, i) { |
| | 1187 | 5 printk(KERN_DEBUG "new_hello() syscall with %d\n", i); |
| | 1188 | 6 return i; |
| | 1189 | 7 } |
| | 1190 | (gdb) s |
| | 1191 | }}} |
| | 1192 | |
| | 1193 | * s0711489@ubuntu-lucid:~$ ./a.out |
| | 1194 | {{{ |
| | 1195 | new_helloc(1) -> 1 |
| | 1196 | }}} |
| | 1197 | |
| | 1198 | === add sys_new_hello entry === |
| | 1199 | * windell57:i386 s0711489$ vim include/linux/syscalls.h |
| | 1200 | {{{#!diff |
| | 1201 | Index: include/linux/syscalls.h |
| | 1202 | =================================================================== |
| | 1203 | --- include/linux/syscalls.h (revision 1358) |
| | 1204 | +++ include/linux/syscalls.h (revision 1359) |
| | 1205 | @@ -826,4 +826,6 @@ |
| | 1206 | unsigned long fd, unsigned long pgoff); |
| | 1207 | asmlinkage long sys_old_mmap(struct mmap_arg_struct __user *arg); |
| | 1208 | |
| | 1209 | +asmlinkage long sys_new_hello(int i); |
| | 1210 | + |
| | 1211 | #endif |
| | 1212 | }}} |
| | 1213 | |
| | 1214 | * windell57:i386 s0711489$ make |
| | 1215 | {{{ |
| | 1216 | Kernel: arch/x86/boot/bzImage is ready (#6) |
| | 1217 | }}} |
| | 1218 | * windell57:i386 s0711489$ make modules |
| | 1219 | |
| | 1220 | * s0711489@ubuntu-lucid:~$ sudo /mnt/hgfs/tools/install.sh |
| | 1221 | |
| | 1222 | * s0711489@ubuntu-lucid:~$ ./a.out |
| | 1223 | {{{ |
| | 1224 | new_helloc(1) -> 1 |
| | 1225 | }}} |
| | 1226 | * s0711489@ubuntu-lucid:~$ ./a.out 2 |
| | 1227 | {{{ |
| | 1228 | new_helloc(2) -> 2 |
| | 1229 | }}} |
| | 1230 | * s0711489@ubuntu-lucid:~$ ./a.out 2 3 |
| | 1231 | {{{ |
| | 1232 | new_helloc(3) -> 3 |
| | 1233 | }}} |
| | 1234 | |
| | 1235 | * s0711489@ubuntu-lucid:~$ tailf /var/log/kern.log |
| | 1236 | {{{ |
| | 1237 | Oct 21 16:16:20 ubuntu-lucid kernel: [ 59.045533] new_hello() syscall with 1 |
| | 1238 | Oct 21 16:16:22 ubuntu-lucid kernel: [ 61.043321] new_hello() syscall with 2 |
| | 1239 | Oct 21 16:16:24 ubuntu-lucid kernel: [ 63.470397] new_hello() syscall with 3 |
| | 1240 | }}} |
| | 1241 | |
| | 1242 | |
| | 1243 | == add new system call (x86_64) == |
| | 1244 | * viola04:linux-2.6.35.14 s0711489$ svn cp i386/arch/x86/include/asm/new_hello.h x86_64/arch/x86/include/asm/new_hello.h |
| | 1245 | * viola04:linux-2.6.35.14 s0711489$ svn cp i386/arch/x86/kernel/new_hello.c x86_64/arch/x86/kernel/ |
| | 1246 | * viola04:linux-2.6.35.14 s0711489$ svn merge i386/include/linux/syscalls.h x86_64/include/linux/syscalls.h -r 1358:1359 |