├── .gitignore ├── README.md ├── build-system ├── .gitignore ├── README.md ├── base │ └── .gitkeep ├── build-system ├── kernel-configs │ └── x86_64 │ │ ├── tiny.config │ │ └── x86_64_defconfig ├── patches │ └── .gitkeep ├── scripts │ └── disk.pm └── specs │ ├── .gitkeep │ └── example.img.yml ├── kernel-sections ├── Makefile ├── README.md └── kernel-sections.c ├── kexp ├── Makefile ├── kexp.c └── ukexp.c └── patches ├── README.md ├── TODO.md └── x86-e820-early-mm-dump.patch /.gitignore: -------------------------------------------------------------------------------- 1 | *.mod 2 | *.cmd 3 | *.symvers 4 | *.order 5 | *.ko 6 | *.mod.c 7 | !*.patch -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # kernel-dev 2 | 3 | This repo contains set of small and useful kernel modules for tracing/debugging of different stuff 4 | and for learning of Linux kernel. 5 | 6 | ## Modules 7 | 8 | * `kernel-sections` - dumps some kernel sections related symbols into `/proc/kernel-sections` 9 | and information about them. 10 | 11 | ## Patches 12 | 13 | See [README.md](https://github.com/0xAX/kernel-modules/blob/master/patches/README.md) 14 | 15 | ## build-system 16 | 17 | This directory contains a try to build minimal image with some useful stuff to test 18 | the Linux kernel. 19 | 20 | ## Author 21 | 22 | [@0xAX](https://twitter.com/0xAX) -------------------------------------------------------------------------------- /build-system/.gitignore: -------------------------------------------------------------------------------- 1 | !Build/ 2 | .last_cover_stats 3 | /META.yml 4 | /META.json 5 | /MYMETA.* 6 | *.o 7 | *.pm.tdy 8 | *.bs 9 | 10 | # Devel::Cover 11 | cover_db/ 12 | 13 | # Devel::NYTProf 14 | nytprof.out 15 | 16 | # Dizt::Zilla 17 | /.build/ 18 | 19 | # Module::Build 20 | _build/ 21 | Build 22 | Build.bat 23 | 24 | # Module::Install 25 | inc/ 26 | 27 | # ExtUtils::MakeMaker 28 | /blib/ 29 | /_eumm/ 30 | /*.gz 31 | /Makefile 32 | /Makefile.old 33 | /MANIFEST.bak 34 | /pm_to_blib 35 | /*.zip 36 | -------------------------------------------------------------------------------- /build-system/README.md: -------------------------------------------------------------------------------- 1 | ## Dependencies 2 | 3 | * [perl](https://www.perl.org/) 4 | * [qemu](https://www.qemu.org/) 5 | 6 | Perl libraries: 7 | 8 | * [Perl-YAML](http://search.cpan.org/~tinita/YAML-1.24/lib/YAML.pod) -------------------------------------------------------------------------------- /build-system/base/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0xAX/kernel-dev/408200e5825047c77b3da0af5295b3353e996e52/build-system/base/.gitkeep -------------------------------------------------------------------------------- /build-system/build-system: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env perl 2 | # 3 | # The build-system is Copyright (C) 2017 Alexander Kuleshov , 4 | # 5 | # Github: https://github.com/0xAX/kernel-dev/tree/master/kernel-testing 6 | 7 | use strict; 8 | use warnings "all"; 9 | use diagnostics; 10 | 11 | use YAML; 12 | use Getopt::Long; 13 | 14 | require "./scripts/disk.pm"; 15 | 16 | # path to specification 17 | my $spec = ""; 18 | 19 | GetOptions( 20 | "spec=s" => \$spec 21 | ) or die("Wrong set of command line arguments were passed\n"); 22 | 23 | exit 0; 24 | -------------------------------------------------------------------------------- /build-system/kernel-configs/x86_64/tiny.config: -------------------------------------------------------------------------------- 1 | CONFIG_NOHIGHMEM=y 2 | # CONFIG_HIGHMEM4G is not set 3 | # CONFIG_HIGHMEM64G is not set 4 | CONFIG_UNWINDER_GUESS=y 5 | # CONFIG_UNWINDER_FRAME_POINTER is not set 6 | -------------------------------------------------------------------------------- /build-system/kernel-configs/x86_64/x86_64_defconfig: -------------------------------------------------------------------------------- 1 | # CONFIG_LOCALVERSION_AUTO is not set 2 | CONFIG_SYSVIPC=y 3 | CONFIG_POSIX_MQUEUE=y 4 | CONFIG_BSD_PROCESS_ACCT=y 5 | CONFIG_TASKSTATS=y 6 | CONFIG_TASK_DELAY_ACCT=y 7 | CONFIG_TASK_XACCT=y 8 | CONFIG_TASK_IO_ACCOUNTING=y 9 | CONFIG_FHANDLE=y 10 | CONFIG_AUDIT=y 11 | CONFIG_NO_HZ=y 12 | CONFIG_HIGH_RES_TIMERS=y 13 | CONFIG_LOG_BUF_SHIFT=18 14 | CONFIG_CGROUPS=y 15 | CONFIG_CGROUP_FREEZER=y 16 | CONFIG_CPUSETS=y 17 | CONFIG_CGROUP_CPUACCT=y 18 | CONFIG_CGROUP_SCHED=y 19 | CONFIG_BLK_DEV_INITRD=y 20 | # CONFIG_COMPAT_BRK is not set 21 | CONFIG_PROFILING=y 22 | CONFIG_KPROBES=y 23 | CONFIG_JUMP_LABEL=y 24 | CONFIG_MODULES=y 25 | CONFIG_MODULE_UNLOAD=y 26 | CONFIG_MODULE_FORCE_UNLOAD=y 27 | CONFIG_PARTITION_ADVANCED=y 28 | CONFIG_OSF_PARTITION=y 29 | CONFIG_AMIGA_PARTITION=y 30 | CONFIG_MAC_PARTITION=y 31 | CONFIG_BSD_DISKLABEL=y 32 | CONFIG_MINIX_SUBPARTITION=y 33 | CONFIG_SOLARIS_X86_PARTITION=y 34 | CONFIG_UNIXWARE_DISKLABEL=y 35 | CONFIG_SGI_PARTITION=y 36 | CONFIG_SUN_PARTITION=y 37 | CONFIG_KARMA_PARTITION=y 38 | CONFIG_EFI_PARTITION=y 39 | CONFIG_SMP=y 40 | CONFIG_CALGARY_IOMMU=y 41 | CONFIG_NR_CPUS=64 42 | CONFIG_SCHED_SMT=y 43 | CONFIG_PREEMPT_VOLUNTARY=y 44 | CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y 45 | CONFIG_X86_MCE=y 46 | CONFIG_MICROCODE=y 47 | CONFIG_MICROCODE_AMD=y 48 | CONFIG_X86_MSR=y 49 | CONFIG_X86_CPUID=y 50 | CONFIG_NUMA=y 51 | CONFIG_X86_CHECK_BIOS_CORRUPTION=y 52 | # CONFIG_MTRR_SANITIZER is not set 53 | CONFIG_EFI=y 54 | CONFIG_HZ_1000=y 55 | CONFIG_KEXEC=y 56 | CONFIG_CRASH_DUMP=y 57 | CONFIG_RANDOMIZE_BASE=y 58 | CONFIG_RANDOMIZE_MEMORY=y 59 | # CONFIG_COMPAT_VDSO is not set 60 | CONFIG_HIBERNATION=y 61 | CONFIG_PM_DEBUG=y 62 | CONFIG_PM_TRACE_RTC=y 63 | CONFIG_ACPI_DOCK=y 64 | CONFIG_CPU_FREQ=y 65 | # CONFIG_CPU_FREQ_STAT is not set 66 | CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y 67 | CONFIG_CPU_FREQ_GOV_PERFORMANCE=y 68 | CONFIG_CPU_FREQ_GOV_ONDEMAND=y 69 | CONFIG_X86_ACPI_CPUFREQ=y 70 | CONFIG_PCI_MMCONFIG=y 71 | CONFIG_PCIEPORTBUS=y 72 | CONFIG_PCCARD=y 73 | CONFIG_YENTA=y 74 | CONFIG_HOTPLUG_PCI=y 75 | CONFIG_BINFMT_MISC=y 76 | CONFIG_IA32_EMULATION=y 77 | CONFIG_NET=y 78 | CONFIG_PACKET=y 79 | CONFIG_UNIX=y 80 | CONFIG_XFRM_USER=y 81 | CONFIG_INET=y 82 | CONFIG_IP_MULTICAST=y 83 | CONFIG_IP_ADVANCED_ROUTER=y 84 | CONFIG_IP_MULTIPLE_TABLES=y 85 | CONFIG_IP_ROUTE_MULTIPATH=y 86 | CONFIG_IP_ROUTE_VERBOSE=y 87 | CONFIG_IP_PNP=y 88 | CONFIG_IP_PNP_DHCP=y 89 | CONFIG_IP_PNP_BOOTP=y 90 | CONFIG_IP_PNP_RARP=y 91 | CONFIG_IP_MROUTE=y 92 | CONFIG_IP_PIMSM_V1=y 93 | CONFIG_IP_PIMSM_V2=y 94 | CONFIG_SYN_COOKIES=y 95 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set 96 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set 97 | # CONFIG_INET_XFRM_MODE_BEET is not set 98 | # CONFIG_INET_DIAG is not set 99 | CONFIG_TCP_CONG_ADVANCED=y 100 | # CONFIG_TCP_CONG_BIC is not set 101 | # CONFIG_TCP_CONG_WESTWOOD is not set 102 | # CONFIG_TCP_CONG_HTCP is not set 103 | CONFIG_TCP_MD5SIG=y 104 | CONFIG_IPV6=y 105 | CONFIG_INET6_AH=y 106 | CONFIG_INET6_ESP=y 107 | CONFIG_NETLABEL=y 108 | CONFIG_NETFILTER=y 109 | # CONFIG_NETFILTER_ADVANCED is not set 110 | CONFIG_NF_CONNTRACK=y 111 | CONFIG_NF_CONNTRACK_FTP=y 112 | CONFIG_NF_CONNTRACK_IRC=y 113 | CONFIG_NF_CONNTRACK_SIP=y 114 | CONFIG_NF_CT_NETLINK=y 115 | CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y 116 | CONFIG_NETFILTER_XT_TARGET_NFLOG=y 117 | CONFIG_NETFILTER_XT_TARGET_SECMARK=y 118 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=y 119 | CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y 120 | CONFIG_NETFILTER_XT_MATCH_POLICY=y 121 | CONFIG_NETFILTER_XT_MATCH_STATE=y 122 | CONFIG_NF_CONNTRACK_IPV4=y 123 | CONFIG_IP_NF_IPTABLES=y 124 | CONFIG_IP_NF_FILTER=y 125 | CONFIG_IP_NF_TARGET_REJECT=y 126 | CONFIG_NF_NAT=y 127 | CONFIG_IP_NF_TARGET_MASQUERADE=y 128 | CONFIG_IP_NF_MANGLE=y 129 | CONFIG_NF_CONNTRACK_IPV6=y 130 | CONFIG_IP6_NF_IPTABLES=y 131 | CONFIG_IP6_NF_MATCH_IPV6HEADER=y 132 | CONFIG_IP6_NF_FILTER=y 133 | CONFIG_IP6_NF_TARGET_REJECT=y 134 | CONFIG_IP6_NF_MANGLE=y 135 | CONFIG_NET_SCHED=y 136 | CONFIG_NET_EMATCH=y 137 | CONFIG_NET_CLS_ACT=y 138 | CONFIG_HAMRADIO=y 139 | CONFIG_CFG80211=y 140 | CONFIG_MAC80211=y 141 | CONFIG_MAC80211_LEDS=y 142 | CONFIG_RFKILL=y 143 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" 144 | CONFIG_DEVTMPFS=y 145 | CONFIG_DEVTMPFS_MOUNT=y 146 | CONFIG_DEBUG_DEVRES=y 147 | CONFIG_CONNECTOR=y 148 | CONFIG_BLK_DEV_LOOP=y 149 | CONFIG_BLK_DEV_SD=y 150 | CONFIG_BLK_DEV_SR=y 151 | CONFIG_BLK_DEV_SR_VENDOR=y 152 | CONFIG_CHR_DEV_SG=y 153 | CONFIG_SCSI_CONSTANTS=y 154 | CONFIG_SCSI_SPI_ATTRS=y 155 | # CONFIG_SCSI_LOWLEVEL is not set 156 | CONFIG_ATA=y 157 | CONFIG_SATA_AHCI=y 158 | CONFIG_ATA_PIIX=y 159 | CONFIG_PATA_AMD=y 160 | CONFIG_PATA_OLDPIIX=y 161 | CONFIG_PATA_SCH=y 162 | CONFIG_MD=y 163 | CONFIG_BLK_DEV_MD=y 164 | CONFIG_BLK_DEV_DM=y 165 | CONFIG_DM_MIRROR=y 166 | CONFIG_DM_ZERO=y 167 | CONFIG_MACINTOSH_DRIVERS=y 168 | CONFIG_MAC_EMUMOUSEBTN=y 169 | CONFIG_NETDEVICES=y 170 | CONFIG_NETCONSOLE=y 171 | CONFIG_TIGON3=y 172 | CONFIG_NET_TULIP=y 173 | CONFIG_E100=y 174 | CONFIG_E1000=y 175 | CONFIG_E1000E=y 176 | CONFIG_SKY2=y 177 | CONFIG_FORCEDETH=y 178 | CONFIG_8139TOO=y 179 | CONFIG_R8169=y 180 | CONFIG_FDDI=y 181 | CONFIG_INPUT_POLLDEV=y 182 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set 183 | CONFIG_INPUT_EVDEV=y 184 | CONFIG_INPUT_JOYSTICK=y 185 | CONFIG_INPUT_TABLET=y 186 | CONFIG_INPUT_TOUCHSCREEN=y 187 | CONFIG_INPUT_MISC=y 188 | CONFIG_VT_HW_CONSOLE_BINDING=y 189 | # CONFIG_LEGACY_PTYS is not set 190 | CONFIG_SERIAL_NONSTANDARD=y 191 | CONFIG_SERIAL_8250=y 192 | CONFIG_SERIAL_8250_CONSOLE=y 193 | CONFIG_SERIAL_8250_NR_UARTS=32 194 | CONFIG_SERIAL_8250_EXTENDED=y 195 | CONFIG_SERIAL_8250_MANY_PORTS=y 196 | CONFIG_SERIAL_8250_SHARE_IRQ=y 197 | CONFIG_SERIAL_8250_DETECT_IRQ=y 198 | CONFIG_SERIAL_8250_RSA=y 199 | CONFIG_HW_RANDOM=y 200 | # CONFIG_HW_RANDOM_INTEL is not set 201 | # CONFIG_HW_RANDOM_AMD is not set 202 | CONFIG_NVRAM=y 203 | CONFIG_HPET=y 204 | # CONFIG_HPET_MMAP is not set 205 | CONFIG_I2C_I801=y 206 | CONFIG_WATCHDOG=y 207 | CONFIG_AGP=y 208 | CONFIG_AGP_AMD64=y 209 | CONFIG_AGP_INTEL=y 210 | CONFIG_DRM=y 211 | CONFIG_DRM_I915=y 212 | CONFIG_FB_MODE_HELPERS=y 213 | CONFIG_FB_TILEBLITTING=y 214 | CONFIG_FB_EFI=y 215 | # CONFIG_LCD_CLASS_DEVICE is not set 216 | CONFIG_VGACON_SOFT_SCROLLBACK=y 217 | CONFIG_LOGO=y 218 | # CONFIG_LOGO_LINUX_MONO is not set 219 | # CONFIG_LOGO_LINUX_VGA16 is not set 220 | CONFIG_SOUND=y 221 | CONFIG_SND=y 222 | CONFIG_SND_SEQUENCER=y 223 | CONFIG_SND_SEQ_DUMMY=y 224 | CONFIG_SND_MIXER_OSS=y 225 | CONFIG_SND_PCM_OSS=y 226 | CONFIG_SND_SEQUENCER_OSS=y 227 | CONFIG_SND_HRTIMER=y 228 | CONFIG_SND_HDA_INTEL=y 229 | CONFIG_SND_HDA_HWDEP=y 230 | CONFIG_HIDRAW=y 231 | CONFIG_HID_GYRATION=y 232 | CONFIG_LOGITECH_FF=y 233 | CONFIG_HID_NTRIG=y 234 | CONFIG_HID_PANTHERLORD=y 235 | CONFIG_PANTHERLORD_FF=y 236 | CONFIG_HID_PETALYNX=y 237 | CONFIG_HID_SAMSUNG=y 238 | CONFIG_HID_SONY=y 239 | CONFIG_HID_SUNPLUS=y 240 | CONFIG_HID_TOPSEED=y 241 | CONFIG_HID_PID=y 242 | CONFIG_USB_HIDDEV=y 243 | CONFIG_USB=y 244 | CONFIG_USB_ANNOUNCE_NEW_DEVICES=y 245 | CONFIG_USB_MON=y 246 | CONFIG_USB_EHCI_HCD=y 247 | CONFIG_USB_EHCI_TT_NEWSCHED=y 248 | CONFIG_USB_OHCI_HCD=y 249 | CONFIG_USB_UHCI_HCD=y 250 | CONFIG_USB_PRINTER=y 251 | CONFIG_USB_STORAGE=y 252 | CONFIG_EDAC=y 253 | CONFIG_RTC_CLASS=y 254 | # CONFIG_RTC_HCTOSYS is not set 255 | CONFIG_DMADEVICES=y 256 | CONFIG_EEEPC_LAPTOP=y 257 | CONFIG_AMD_IOMMU=y 258 | CONFIG_INTEL_IOMMU=y 259 | # CONFIG_INTEL_IOMMU_DEFAULT_ON is not set 260 | CONFIG_EFI_VARS=y 261 | CONFIG_EXT4_FS=y 262 | CONFIG_EXT4_FS_POSIX_ACL=y 263 | CONFIG_EXT4_FS_SECURITY=y 264 | CONFIG_QUOTA=y 265 | CONFIG_QUOTA_NETLINK_INTERFACE=y 266 | # CONFIG_PRINT_QUOTA_WARNING is not set 267 | CONFIG_QFMT_V2=y 268 | CONFIG_AUTOFS4_FS=y 269 | CONFIG_ISO9660_FS=y 270 | CONFIG_JOLIET=y 271 | CONFIG_ZISOFS=y 272 | CONFIG_MSDOS_FS=y 273 | CONFIG_VFAT_FS=y 274 | CONFIG_PROC_KCORE=y 275 | CONFIG_TMPFS_POSIX_ACL=y 276 | CONFIG_HUGETLBFS=y 277 | CONFIG_NFS_FS=y 278 | CONFIG_NFS_V3_ACL=y 279 | CONFIG_NFS_V4=y 280 | CONFIG_ROOT_NFS=y 281 | CONFIG_NLS_DEFAULT="utf8" 282 | CONFIG_NLS_CODEPAGE_437=y 283 | CONFIG_NLS_ASCII=y 284 | CONFIG_NLS_ISO8859_1=y 285 | CONFIG_NLS_UTF8=y 286 | CONFIG_PRINTK_TIME=y 287 | # CONFIG_ENABLE_WARN_DEPRECATED is not set 288 | CONFIG_MAGIC_SYSRQ=y 289 | # CONFIG_UNUSED_SYMBOLS is not set 290 | CONFIG_DEBUG_KERNEL=y 291 | # CONFIG_SCHED_DEBUG is not set 292 | CONFIG_SCHEDSTATS=y 293 | CONFIG_TIMER_STATS=y 294 | CONFIG_DEBUG_STACK_USAGE=y 295 | CONFIG_BLK_DEV_IO_TRACE=y 296 | CONFIG_PROVIDE_OHCI1394_DMA_INIT=y 297 | CONFIG_EARLY_PRINTK_DBGP=y 298 | CONFIG_DEBUG_STACKOVERFLOW=y 299 | # CONFIG_DEBUG_RODATA_TEST is not set 300 | CONFIG_DEBUG_BOOT_PARAMS=y 301 | CONFIG_OPTIMIZE_INLINING=y 302 | CONFIG_UNWINDER_ORC=y 303 | CONFIG_SECURITY=y 304 | CONFIG_SECURITY_NETWORK=y 305 | CONFIG_SECURITY_SELINUX=y 306 | CONFIG_SECURITY_SELINUX_BOOTPARAM=y 307 | CONFIG_SECURITY_SELINUX_DISABLE=y 308 | # CONFIG_CRYPTO_ANSI_CPRNG is not set 309 | -------------------------------------------------------------------------------- /build-system/patches/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0xAX/kernel-dev/408200e5825047c77b3da0af5295b3353e996e52/build-system/patches/.gitkeep -------------------------------------------------------------------------------- /build-system/scripts/disk.pm: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env perl 2 | # 3 | # The build-system is Copyright (C) 2017 Alexander Kuleshov , 4 | # 5 | # Github: https://github.com/0xAX/kernel-dev/tree/master/kernel-testing 6 | 7 | use strict; 8 | use warnings "all"; 9 | use diagnostics; 10 | 11 | 1; 12 | -------------------------------------------------------------------------------- /build-system/specs/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0xAX/kernel-dev/408200e5825047c77b3da0af5295b3353e996e52/build-system/specs/.gitkeep -------------------------------------------------------------------------------- /build-system/specs/example.img.yml: -------------------------------------------------------------------------------- 1 | disk: 2 | name: "example.img" 3 | size: 10G 4 | format: raw -------------------------------------------------------------------------------- /kernel-sections/Makefile: -------------------------------------------------------------------------------- 1 | PWD = $(shell pwd) 2 | 3 | MOD = kernel-sections.ko 4 | obj-m += kernel-sections.o 5 | 6 | all: 7 | make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 8 | 9 | install: 10 | sudo insmod kernel-sections.ko 11 | 12 | uninstall: 13 | sudo rmmod kernel-sections.ko 14 | 15 | clean: 16 | make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 17 | rm -rf *.o 18 | rm -rf *.ko 19 | rm -rf *.mod.c 20 | rm -rf modules.order 21 | rm -rf Module.symvers 22 | 23 | reload: 24 | sudo rmmod $(MOD) 25 | sudo insmod $(MOD) 26 | -------------------------------------------------------------------------------- /kernel-sections/README.md: -------------------------------------------------------------------------------- 1 | # kernel-sections 2 | 3 | The `kernel-sections` module provides simple module which dumps some kernel symbols (sections) which are 4 | related to sections boundaries. 5 | 6 | ## Usage 7 | 8 | ``` 9 | $ cd dump_kern_symbols 10 | $ make 11 | $ make install 12 | ``` 13 | 14 | The `kernel-sections` module will create `/proc/kernel-sections` file: 15 | 16 | ``` 17 | cat /proc/kernel-sections 18 | Start End Size 19 | 20 | _text physical addr: [0x1000000] [16777216] [7906806 bytes] 21 | _text virtual addr: [0xffffffff81000000] [18446744071578845184] 22 | 23 | __bss physical addr: [0x201e000] [33677312] [11468800 bytes] 24 | __bss virtual addr: [0xffffffff8201e000] [18446744071595745280] 25 | ``` 26 | 27 | To remove the module execute: 28 | 29 | ``` 30 | $ make uninstall 31 | ``` -------------------------------------------------------------------------------- /kernel-sections/kernel-sections.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | /* 7 | * TODO: 8 | * * Add other sections 9 | */ 10 | typedef u64 virt_addr_t; 11 | 12 | static struct proc_dir_entry *kernel_symbols_info; 13 | 14 | static int kern_syms_proc_show(struct seq_file *m, void *v) 15 | { 16 | phys_addr_t __text = (phys_addr_t)__pa_symbol(kallsyms_lookup_name("_text")); 17 | virt_addr_t __text_v = (virt_addr_t)kallsyms_lookup_name("_text"); 18 | phys_addr_t __etext = (phys_addr_t)__pa_symbol(kallsyms_lookup_name("_etext")); 19 | phys_addr_t __bss_start = (phys_addr_t)__pa_symbol(kallsyms_lookup_name("__bss_start")); 20 | virt_addr_t __bss_start_v = (virt_addr_t)kallsyms_lookup_name("__bss_start"); 21 | phys_addr_t __bss_stop = (phys_addr_t)__pa_symbol(kallsyms_lookup_name("__bss_stop")); 22 | 23 | seq_printf(m, " \t\tStart End\t\t\tSize\n\n"); 24 | seq_printf(m, "_text physical addr: \t\t[%#llx] [%llu]\t\t[%llu bytes]\n", __text, __text, __etext - __text); 25 | seq_printf(m, "_text virtual addr: \t\t[%#llx] [%llu]\n", __text_v, __text_v); 26 | 27 | seq_printf(m, "\n"); 28 | 29 | seq_printf(m, "__bss physical addr: \t\t[%#llx] [%llu]\t\t[%llu bytes]\n", __bss_start, __bss_start, __bss_stop - __bss_start); 30 | seq_printf(m, "__bss virtual addr: \t\t[%#llx] [%llu]\n", __bss_start_v, __bss_start_v); 31 | 32 | return 0; 33 | } 34 | 35 | static int kern_syms_open(struct inode *inode, struct file *file) 36 | { 37 | return single_open(file, kern_syms_proc_show, NULL); 38 | } 39 | 40 | static const struct file_operations kern_syms_fops = { 41 | .open = kern_syms_open, 42 | .read = seq_read, 43 | .llseek = seq_lseek, 44 | .release = single_release, 45 | }; 46 | 47 | static int __init kernel_sections_mod_init(void) 48 | { 49 | kernel_symbols_info = proc_create("kernel-sections", 0, NULL, &kern_syms_fops); 50 | 51 | if (!kernel_symbols_info) 52 | { 53 | pr_info("Error creating /proc/kernel-sections directory"); 54 | return -ENOMEM; 55 | } 56 | 57 | return 0; 58 | } 59 | 60 | static void __exit kernel_sections_mod_cleanup(void) 61 | { 62 | remove_proc_entry("kernel-sections", NULL); 63 | } 64 | 65 | module_init(kernel_sections_mod_init); 66 | module_exit(kernel_sections_mod_cleanup); 67 | 68 | MODULE_LICENSE("GPL v2"); 69 | MODULE_AUTHOR("Alexander Kuleshov "); 70 | MODULE_DESCRIPTION("Expose page tables to the /proc."); 71 | -------------------------------------------------------------------------------- /kexp/Makefile: -------------------------------------------------------------------------------- 1 | PWD = $(shell pwd) 2 | 3 | MOD = kexp.ko 4 | obj-m += kexp.o 5 | 6 | all: 7 | make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 8 | gcc ukexp.c -o ukexp 9 | 10 | install: 11 | sudo insmod kexp.ko 12 | 13 | uninstall: 14 | sudo rmmod kexp.ko 15 | 16 | clean: 17 | make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 18 | rm -rf *.o 19 | rm -rf *.ko 20 | rm -rf *.mod.c 21 | rm -rf modules.order 22 | rm -rf Module.symvers 23 | rm -rf ukexp 24 | 25 | reload: 26 | sudo rmmod $(MOD) 27 | sudo insmod $(MOD) 28 | -------------------------------------------------------------------------------- /kexp/kexp.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | struct sock *socket = NULL; 7 | 8 | static void recvmsg(struct sk_buff *skb) 9 | { 10 | int res; 11 | int pid; 12 | struct nlmsghdr *nlh = (struct nlmsghdr*)skb->data; 13 | char *received_msg = (char*)nlmsg_data(nlh); 14 | size_t msg_len = strlen(received_msg); 15 | struct sk_buff *skb_out; 16 | 17 | printk(KERN_INFO "Netlink received msg payload:%s\n", received_msg); 18 | 19 | /* getting pid of sending process */ 20 | pid = nlh->nlmsg_pid; 21 | 22 | skb_out = nlmsg_new(6, 0); /* 6 is message size */ 23 | if (!skb_out) { 24 | printk(KERN_ERR "Failed to allocate new skb\n"); 25 | return; 26 | } 27 | nlh = nlmsg_put(skb_out, 0, 0, NLMSG_DONE, msg_len, 0); 28 | NETLINK_CB(skb_out).dst_group = 0; 29 | strncpy(nlmsg_data(nlh), received_msg, msg_len); 30 | 31 | 32 | res = nlmsg_unicast(socket, skb_out, pid); 33 | 34 | if (res) 35 | printk(KERN_INFO "Error while sending back to user\n"); 36 | } 37 | 38 | struct netlink_kernel_cfg cfg = 39 | { 40 | .input = recvmsg, 41 | }; 42 | 43 | static int __init kexp_mod_init(void) 44 | { 45 | printk("Entering: %s\n",__FUNCTION__); 46 | 47 | socket = netlink_kernel_create(&init_net, 31, &cfg); 48 | if (!socket) 49 | { 50 | printk(KERN_ALERT "Error creating NETLINK socket.\n"); 51 | return -1; 52 | } 53 | 54 | return 0; 55 | } 56 | 57 | static void __exit kexp_mod_cleanup(void) 58 | { 59 | printk(KERN_INFO "kexp module exiting...\n"); 60 | netlink_kernel_release(socket); 61 | } 62 | 63 | 64 | module_init(kexp_mod_init); 65 | module_exit(kexp_mod_cleanup); 66 | 67 | MODULE_LICENSE("GPL v2"); 68 | MODULE_AUTHOR("Alexander Kuleshov "); 69 | MODULE_DESCRIPTION("Expose page tables to the /proc."); 70 | -------------------------------------------------------------------------------- /kexp/ukexp.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | struct msghdr msg; 10 | static int socket_fd; 11 | static struct iovec iov; 12 | static struct nlmsghdr *nlh = NULL; 13 | static struct sockaddr_nl src_addr, dest_addr; 14 | 15 | int main() 16 | { 17 | /* create netlink socket */ 18 | socket_fd = socket(PF_NETLINK, SOCK_RAW, 31); 19 | if (socket_fd < 0) 20 | return -1; 21 | 22 | /* fill netlink source address */ 23 | memset(&src_addr, 0, sizeof(src_addr)); 24 | src_addr.nl_family = AF_NETLINK; 25 | src_addr.nl_pid = getpid(); 26 | 27 | /* bind an address to the netlink socket */ 28 | bind(socket_fd, (struct sockaddr*)&src_addr, sizeof(src_addr)); 29 | 30 | /* fill netlink destination address */ 31 | memset(&dest_addr, 0, sizeof(dest_addr)); 32 | dest_addr.nl_family = AF_NETLINK; 33 | dest_addr.nl_pid = 0; 34 | dest_addr.nl_groups = 0; 35 | 36 | /* fill netlink message header */ 37 | nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(1024)); 38 | memset(nlh, 0, NLMSG_SPACE(1024)); 39 | nlh->nlmsg_len = NLMSG_SPACE(1024); 40 | nlh->nlmsg_pid = getpid(); 41 | nlh->nlmsg_flags = 0; 42 | 43 | /* fill message */ 44 | strcpy(NLMSG_DATA(nlh), "Hello"); 45 | 46 | /* fill message header */ 47 | iov.iov_base = (void *)nlh; 48 | iov.iov_len = nlh->nlmsg_len; 49 | msg.msg_name = (void *)&dest_addr; 50 | msg.msg_namelen = sizeof(dest_addr); 51 | msg.msg_iov = &iov; 52 | msg.msg_iovlen = 1; 53 | 54 | /* send message to kernel */ 55 | sendmsg(socket_fd, &msg, 0); 56 | /* read message from kernel */ 57 | recvmsg(socket_fd, &msg, 0); 58 | 59 | printf("Received message payload: %s\n", NLMSG_DATA(nlh)); 60 | close(socket_fd); 61 | 62 | return 0; 63 | } 64 | -------------------------------------------------------------------------------- /patches/README.md: -------------------------------------------------------------------------------- 1 | # Linux kernel patches 2 | 3 | Here are some patches for the Linux kernel from upstream to get some 4 | useful debug information. 5 | 6 | ## x86-e820-early-mm-dump.patch 7 | 8 | This patch adds simple function that prints information about avilable 9 | memory regions collected by `e820` during early setup. 10 | 11 | Example: 12 | 13 | ``` 14 | Early memory map: 15 | 16 | [USABLE] base: 0x0 size: 0x654336 17 | [RESERVED] base: 0x654336 size: 0x1024 18 | [RESERVED] base: 0x983040 size: 0x65536 19 | [USABLE] base: 0x1048576 size: 0x3220045824 20 | [RESERVED] base: 0x3221094400 size: 0x131072 21 | [RESERVED] base: 0x4294705152 size: 0x262144 22 | ``` -------------------------------------------------------------------------------- /patches/TODO.md: -------------------------------------------------------------------------------- 1 | # TODO 2 | 3 | * Would be good to add support for 64-bit values to `printf()` from the [arch/x86/boot/printf.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/printf.c). 4 | * Add `early-memory-dump` command line options to call `dump_memory_map()` from `x86-e820-early-mm-dump.patch`. -------------------------------------------------------------------------------- /patches/x86-e820-early-mm-dump.patch: -------------------------------------------------------------------------------- 1 | From 66484934de44e546de4457118d81f90406a09b59 Mon Sep 17 00:00:00 2001 2 | From: Alexander Kuleshov 3 | Date: Fri, 26 Aug 2017 00:04:00 +0600 4 | Subject: [PATCH] x86/e820: introduce dump_memory_map() 5 | 6 | This patch introduces dump_memory_map() function that will be called 7 | during very early setup of Linux kernel. 8 | 9 | After information about memory regions will be collected via e820 10 | service, this function will be called and dump information about 11 | collected RAM regions. 12 | 13 | Example: 14 | 15 | Early memory map: 16 | [USABLE] base: 0x0 size: 0x654336 17 | [RESERVED] base: 0x654336 size: 0x1024 18 | [RESERVED] base: 0x983040 size: 0x65536 19 | [USABLE] base: 0x1048576 size: 0x3220045824 20 | [RESERVED] base: 0x3221094400 size: 0x131072 21 | [RESERVED] base: 0x4294705152 size: 0x262144 22 | 23 | NOTE: Now early printf() from the arch/x86/boot/printf.c does 24 | not support 64-bit values. So, values could be overloaded. 25 | 26 | Signed-off-by: Alexander Kuleshov 27 | --- 28 | arch/x86/boot/boot.h | 1 + 29 | arch/x86/boot/main.c | 1 + 30 | arch/x86/boot/memory.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 31 | arch/x86/boot/printf.c | 2 +- 32 | 4 files changed, 49 insertions(+), 1 deletion(-) 33 | 34 | diff --git a/arch/x86/boot/boot.h b/arch/x86/boot/boot.h 35 | index ef5a9cc66fb8..468dced7f980 100644 36 | --- a/arch/x86/boot/boot.h 37 | +++ b/arch/x86/boot/boot.h 38 | @@ -310,6 +310,7 @@ void __attribute__((noreturn)) die(void); 39 | 40 | /* memory.c */ 41 | int detect_memory(void); 42 | +void dump_memory_map(void); 43 | 44 | /* pm.c */ 45 | void __attribute__((noreturn)) go_to_protected_mode(void); 46 | diff --git a/arch/x86/boot/main.c b/arch/x86/boot/main.c 47 | index 9bcea386db65..c75913d3c9e7 100644 48 | --- a/arch/x86/boot/main.c 49 | +++ b/arch/x86/boot/main.c 50 | @@ -157,6 +157,7 @@ void main(void) 51 | 52 | /* Detect memory layout */ 53 | detect_memory(); 54 | + dump_memory_map(); 55 | 56 | /* Set keyboard repeat rate (why?) and query the lock flags */ 57 | keyboard_init(); 58 | diff --git a/arch/x86/boot/memory.c b/arch/x86/boot/memory.c 59 | index d9c28c87e477..b56207118298 100644 60 | --- a/arch/x86/boot/memory.c 61 | +++ b/arch/x86/boot/memory.c 62 | @@ -15,6 +15,12 @@ 63 | 64 | #include "boot.h" 65 | 66 | +#define E820_USABLE 1 67 | +#define E820_RESERVED 2 68 | +#define E820_ACPI 3 69 | +#define E820_ACPI_NVS 4 70 | +#define E820_BAD 5 71 | + 72 | #define SMAP 0x534d4150 /* ASCII "SMAP" */ 73 | 74 | static int detect_memory_e820(void) 75 | @@ -134,3 +140,43 @@ int detect_memory(void) 76 | 77 | return err; 78 | } 79 | + 80 | +void dump_memory_map(void) 81 | +{ 82 | + int count = 0; 83 | + 84 | + printf("Early memory map:\n\n"); 85 | + 86 | + while (count < ARRAY_SIZE(boot_params.e820_table)) 87 | + { 88 | + __u32 mem_type = boot_params.e820_table[count].type; 89 | + __u64 addr = boot_params.e820_table[count].addr; 90 | + __u64 size = boot_params.e820_table[count].size; 91 | + 92 | + if (!mem_type) 93 | + break; 94 | + 95 | + switch (mem_type) 96 | + { 97 | + case E820_USABLE: 98 | + printf("[USABLE] base: 0x%lu size: 0x%lu\n", addr, size); 99 | + break; 100 | + case E820_RESERVED: 101 | + printf("[RESERVED] base: 0x%lu size: 0x%lu\n", addr, size); 102 | + break; 103 | + case E820_ACPI: 104 | + printf("[ACPI] base: 0x%lu size: 0x%lu\n", addr, size); 105 | + break; 106 | + case E820_ACPI_NVS: 107 | + printf("[NVS] base: 0x%lu size: 0x%lu\n", addr, size); 108 | + break; 109 | + case E820_BAD: 110 | + printf("[BAD REGION] base: 0x%lu size: 0x%lu\n", addr, size); 111 | + break; 112 | + default: 113 | + printf("Other memory type %d\n", mem_type); 114 | + break; 115 | + } 116 | + count++; 117 | + } 118 | +} 119 | diff --git a/arch/x86/boot/printf.c b/arch/x86/boot/printf.c 120 | index 565083c16e5c..f70e9b7a4757 100644 121 | --- a/arch/x86/boot/printf.c 122 | +++ b/arch/x86/boot/printf.c 123 | @@ -267,7 +267,7 @@ int vsprintf(char *buf, const char *fmt, va_list args) 124 | continue; 125 | } 126 | if (qualifier == 'l') 127 | - num = va_arg(args, unsigned long); 128 | + num = va_arg(args, __u64); 129 | else if (qualifier == 'h') { 130 | num = (unsigned short)va_arg(args, int); 131 | if (flags & SIGN) 132 | -- 133 | 2.13.5 134 | 135 | --------------------------------------------------------------------------------