Changes between Version 7 and Version 8 of Dev/KernelHack/COINS/worklog/201111


Ignore:
Timestamp:
Nov 25, 2011 1:42:57 AM (12 years ago)
Author:
mitty
Comment:

--

Legend:

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

    v7 v8  
    16881688Nov 20 17:52:58 ubuntu-lucid64 kernel: [ 4419.365281] stackmod is released 
    16891689}}} 
     1690 
     1691 == /proc read skeleton == 
     1692 * [http://www.ibm.com/developerworks/jp/linux/library/l-proc/ /procファイルシステムを使用したLinuxカーネルへのアクセス] 
     1693 * [http://homepage3.nifty.com/rio_i/lab/driver24/007proc.html /proc インタフェースを使う] 
     1694 * [http://d.hatena.ne.jp/masami256/20100315/1268662409 procfs経由でデータの読み書き - linuxとかテストとか] 
     1695 
     1696 * 参考 
     1697  * sound/core/info.c -> create_proc_entry 
     1698  * arch/h8300/kernel/gpio.c -> create_proc_entry 
     1699  * arch/arm/mach-bcmring/dma.c -> create_proc_read_entry 
     1700  * drivers/nubus/nubus.c -> create_proc_read_entry 
     1701  * include/linux/proc_fs.h -> static inline struct proc_dir_entry *create_proc_read_entry 
     1702 
     1703 * s0711489@ubuntu-lucid64:~$ sudo insmod stackmod.ko 
     1704{{{ 
     1705Nov 21 00:33:28 ubuntu-lucid64 kernel: [   41.547601] stackmod is loaded 
     1706Nov 21 00:33:28 ubuntu-lucid64 kernel: [   41.547606] stackmod: 128 entry, major is 251, minor is 0 
     1707Nov 21 00:33:28 ubuntu-lucid64 kernel: [   41.547615] stackmod: create /proc/stackmod 
     1708Nov 21 00:33:28 ubuntu-lucid64 kernel: [   41.547617] stackmod is added successfully 
     1709}}} 
     1710 
     1711 * s0711489@ubuntu-lucid64:~$ ls -l /proc/ | grep stack 
     1712{{{ 
     1713-r--r--r--  1 root     root                   0 2011-11-21 00:34 stackmod 
     1714}}} 
     1715 
     1716 * s0711489@ubuntu-lucid64:~$ cat /proc/stackmod 
     1717{{{ 
     1718Nov 21 00:34:21 ubuntu-lucid64 kernel: [   94.446963] /proc/stackmod is read 
     1719}}} 
     1720 
     1721 * s0711489@ubuntu-lucid64:~$ sudo rmmod stackmod.ko 
     1722{{{ 
     1723Nov 21 00:35:43 ubuntu-lucid64 kernel: [  177.060782] stackmod is unloaded 
     1724}}} 
     1725 
     1726 === implement stackmod_proc_read as proc_dir_entry->read_proc === 
     1727 * fs/proc/generic.c -> __proc_file_read 
     1728{{{ 
     1729 * How to be a proc read function 
     1730}}} 
     1731 
     1732 * s0711489@ubuntu-lucid64:~$ sudo insmod stackmod.ko 
     1733 * s0711489@ubuntu-lucid64:~$ cat /proc/stackmod 
     1734{{{ 
     17350 stacks 
     1736}}} 
     1737{{{ 
     1738Nov 21 02:30:23 ubuntu-lucid64 kernel: [ 7055.042732] /proc/stackmod is read 
     1739Nov 21 02:30:23 ubuntu-lucid64 kernel: [ 7055.042747] /proc/stackmod is read 
     1740}}} 
     1741 
     1742 == kmalloc/kfree -> stack.buffer == 
     1743 === research kmalloc === 
     1744 * [http://tiki.is.os-omicron.org/tiki.cgi?c=v&p=Linux%2FLKM%2FGDB%A4%F2%BB%C8%A4%C3%A4%C6%A5%B3%A1%BC%A5%C9%A4%F2%C4%C9%A4%C3%A4%AB%A4%B1%A4%EB Omicron Linux/LKM/GDBを使ってコードを追っかける] 
     1745 * [http://www.denx.de/wiki/DULG/DebuggingLinuxKernel DebuggingLinuxKernel < DULG < DENX] 
     1746 
     1747 ==== without memset ==== 
     1748 * s0711489@ubuntu-lucid64:~$ sudo insmod stackmod.ko 
     1749 * s0711489@ubuntu-lucid64:~$ cat /sys/module/stackmod/sections/.text 
     1750{{{ 
     17510xffffffffa0056000 
     1752}}} 
     1753 * s0711489@ubuntu-lucid64:~$ cat /sys/module/stackmod/sections/.data 
     1754{{{ 
     17550xffffffffa0056458 
     1756}}} 
     1757 * s0711489@ubuntu-lucid64:~$ cat /sys/module/stackmod/sections/.bss 
     1758{{{ 
     17590xffffffffa0056690 
     1760}}} 
     1761 
     1762 * gdb 
     1763{{{ 
     1764(gdb) file vmlinux 
     1765Reading symbols from /home/ugrad/07/s0711489/coursework/KernelHack/linux-2.6.35.14/x86_64/vmlinux...(no debugging symbols found)...done. 
     1766(gdb) add-symbol-file ../../04/stackmod/stackmod.o 0xffffffffa0056000 -s .data 0xffffffffa0056458 -s .bss 0xffffffffa0056690 
     1767add symbol table from file "../../04/stackmod/stackmod.o" at 
     1768        .text_addr = 0xffffffffa0056000 
     1769        .data_addr = 0xffffffffa0056458 
     1770        .bss_addr = 0xffffffffa0056690 
     1771(y or n) y 
     1772Reading symbols from /home/ugrad/07/s0711489/coursework/KernelHack/04/stackmod/stackmod.o...done. 
     1773(gdb) l stackmod.c:145 
     1774 
     1775140             stack.buffer = (char **) kmalloc(entry * sizeof(char *), GFP_KERNEL); 
     1776141             if (stack.buffer == NULL) { 
     1777142                     printk(KERN_WARNING MODNAME ": (char **) kmalloc failed\n"); 
     1778143                     ret = -ENOMEM; 
     1779144                     goto error_cdev; 
     1780145             } 
     1781146     //        memset(stack.buffer, NULL, entry * sizeof(char *)); 
     1782147 
     1783148             printk(KERN_INFO MODNAME " is added successfully\n"); 
     1784149 
     1785(gdb) p stack 
     1786Cannot access memory at address 0xffffffffa0056690 
     1787(gdb) target remote localhost:8864 
     1788Remote debugging using localhost:8864 
     17890xffffffff810097a9 in native_safe_halt () 
     1790    at /home/ugrad/07/s0711489/coursework/KernelHack/linux-2.6.35.14/x86_64/arch/x86/include/asm/irqflags.h:49 
     179149              asm volatile("sti; hlt": : :"memory"); 
     1792(gdb) p stack 
     1793$1 = {buffer = 0xffff88001b740800, depth = 0, errno = 0} 
     1794(gdb) ptype stack 
     1795type = struct kernel_module_stack { 
     1796    char **buffer; 
     1797    int depth; 
     1798    int errno; 
     1799} 
     1800(gdb) p stack.buffer 
     1801$2 = (char **) 0xffff88001b740800 
     1802(gdb) p stack.buffer[0] 
     1803$3 = 0xffff88001b744c00 "" 
     1804(gdb) p stack.buffer[1] 
     1805$4 = 0x1000 <Address 0x1000 out of bounds> 
     1806(gdb) p stack.buffer[2] 
     1807$5 = 0xffffea00005f0148 "," 
     1808(gdb) p stack.buffer[3] 
     1809$6 = 0x1000 <Address 0x1000 out of bounds> 
     1810(gdb) p stack.buffer[4] 
     1811$7 = 0xffffea00005f0110 "," 
     1812(gdb) p stack.buffer[5] 
     1813$8 = 0x1000 <Address 0x1000 out of bounds> 
     1814(gdb) p stack.buffer[6] 
     1815$9 = 0xffffea00005f4048 "," 
     1816(gdb) p stack.depth 
     1817$10 = 0 
     1818(gdb) p/c stack.depth 
     1819$11 = 0 '\000' 
     1820(gdb) p stack.buffer 
     1821$12 = (char **) 0xffff88001b740800 
     1822(gdb) p/x stack.buffer 
     1823$13 = 0xffff88001b740800 
     1824(gdb) p/x stack.buffer[0] 
     1825$14 = 0xffff88001b744c00 
     1826(gdb) p/x stack.buffer[1] 
     1827$15 = 0x1000 
     1828(gdb) p/x stack.buffer[2] 
     1829$16 = 0xffffea00005f0148 
     1830(gdb) p/x stack.buffer[3] 
     1831$17 = 0x1000 
     1832(gdb) p/x stack.buffer[4] 
     1833$18 = 0xffffea00005f0110 
     1834}}} 
     1835 
     1836 ==== with memset ==== 
     1837 * s0711489@ubuntu-lucid64:~$ sudo insmod stackmod.ko 
     1838 * s0711489@ubuntu-lucid64:~$ cat /sys/module/stackmod/sections/.text 
     1839{{{ 
     18400xffffffffa0056000 
     1841}}} 
     1842 * s0711489@ubuntu-lucid64:~$ cat /sys/module/stackmod/sections/.data 
     1843{{{ 
     18440xffffffffa0056458 
     1845}}} 
     1846 * s0711489@ubuntu-lucid64:~$ cat /sys/module/stackmod/sections/.bss 
     1847{{{ 
     18480xffffffffa0056690 
     1849}}} 
     1850 
     1851 * gdb 
     1852{{{ 
     1853(gdb) file vmlinux 
     1854Reading symbols from /home/ugrad/07/s0711489/coursework/KernelHack/linux-2.6.35.14/x86_64/vmlinux...(no debugging symbols found)...done. 
     1855(gdb) add-symbol-file ../../04/stackmod/stackmod.o 0xffffffffa0056000 -s .data 0xffffffffa0056458 -s .bss 0xffffffffa0056690 
     1856add symbol table from file "../../04/stackmod/stackmod.o" at 
     1857        .text_addr = 0xffffffffa0056000 
     1858        .data_addr = 0xffffffffa0056458 
     1859        .bss_addr = 0xffffffffa0056690 
     1860(y or n) y 
     1861Reading symbols from /home/ugrad/07/s0711489/coursework/KernelHack/04/stackmod/stackmod.o...done. 
     1862(gdb) l stackmod.c:145 
     1863 
     1864140             stack.buffer = (char **) kmalloc(entry * sizeof(char *), GFP_KERNEL); 
     1865141             if (stack.buffer == NULL) { 
     1866142                     printk(KERN_WARNING MODNAME ": (char **) kmalloc failed\n"); 
     1867143                     ret = -ENOMEM; 
     1868144                     goto error_cdev; 
     1869145             } 
     1870146             memset(stack.buffer, (int) NULL, entry * sizeof(char *)); 
     1871147 
     1872148             printk(KERN_INFO MODNAME " is added successfully\n"); 
     1873149 
     1874(gdb) target remote localhost:8864 
     1875Remote debugging using localhost:8864 
     18760xffffffff810097a9 in native_safe_halt () 
     1877    at /home/ugrad/07/s0711489/coursework/KernelHack/linux-2.6.35.14/x86_64/arch/x86/include/asm/irqflags.h:49 
     187849              asm volatile("sti; hlt": : :"memory"); 
     1879(gdb) p stack 
     1880$1 = {buffer = 0xffff88001b5cb400, depth = 0, errno = 0} 
     1881(gdb) p stack.buffer 
     1882$2 = (char **) 0xffff88001b5cb400 
     1883(gdb) p/c stack.buffer 
     1884$3 = 0 '\000' 
     1885(gdb) p/x stack.buffer 
     1886$4 = 0xffff88001b5cb400 
     1887(gdb) p/x stack.buffer[0] 
     1888$5 = 0x0 
     1889(gdb) p/x stack.buffer[1] 
     1890$6 = 0x0 
     1891(gdb) p/x stack.buffer[2] 
     1892$7 = 0x0 
     1893(gdb) p/x stack.buffer[3] 
     1894$8 = 0x0 
     1895(gdb) p/x stack.buffer[4] 
     1896$9 = 0x0 
     1897(gdb) p/x stack.buffer[5] 
     1898$10 = 0x0 
     1899(gdb) p/x stack.buffer[127] 
     1900$11 = 0x0 
     1901(gdb) p/x stack.buffer[128] 
     1902$12 = 0xffff88001b5cb000 
     1903(gdb) p/x stack.buffer[129] 
     1904$13 = 0x0 
     1905(gdb) p/x stack.buffer[130] 
     1906$14 = 0xffffffff00000000 
     1907(gdb) p/x stack.buffer[126] 
     1908$15 = 0x0 
     1909(gdb) p/x stack.buffer[125] 
     1910$16 = 0x0 
     1911}}} 
     1912 
     1913 ===== much more entry with memset ===== 
     1914 * s0711489@ubuntu-lucid64:~$ sudo rmmod stackmod.ko 
     1915 * s0711489@ubuntu-lucid64:~$ sudo insmod stackmod.ko entry=1024 
     1916 * s0711489@ubuntu-lucid64:~$ cat /sys/module/stackmod/sections/.text 
     1917{{{ 
     19180xffffffffa005c000 
     1919}}} 
     1920 * s0711489@ubuntu-lucid64:~$ cat /sys/module/stackmod/sections/.data 
     1921{{{ 
     19220xffffffffa005c458 
     1923}}} 
     1924 * s0711489@ubuntu-lucid64:~$ cat /sys/module/stackmod/sections/.bss 
     1925{{{ 
     19260xffffffffa005c690 
     1927}}} 
     1928 
     1929 * gdb 
     1930{{{ 
     1931(gdb) file vmlinux 
     1932Reading symbols from /home/ugrad/07/s0711489/coursework/KernelHack/linux-2.6.35.14/x86_64/vmlinux...(no debugging symbols found)...done. 
     1933(gdb) add-symbol-file ../../04/stackmod/stackmod.o 0xffffffffa005c000 -s .data 0xffffffffa005c458 -s .bss 0xffffffffa005c690 
     1934add symbol table from file "../../04/stackmod/stackmod.o" at 
     1935        .text_addr = 0xffffffffa005c000 
     1936        .data_addr = 0xffffffffa005c458 
     1937        .bss_addr = 0xffffffffa005c690 
     1938(y or n) y 
     1939Reading symbols from /home/ugrad/07/s0711489/coursework/KernelHack/04/stackmod/stackmod.o...done. 
     1940(gdb) target remote localhost:8864 
     1941Remote debugging using localhost:8864 
     19420xffffffff810097a9 in native_safe_halt () 
     1943    at /home/ugrad/07/s0711489/coursework/KernelHack/linux-2.6.35.14/x86_64/arch/x86/include/asm/irqflags.h:49 
     194449              asm volatile("sti; hlt": : :"memory"); 
     1945(gdb) p stack 
     1946$1 = {buffer = 0xffff88001af16000, depth = 0, errno = 0} 
     1947(gdb) p entry 
     1948$2 = 1024 
     1949(gdb) p stack.buffer 
     1950$3 = (char **) 0xffff88001af16000 
     1951(gdb) p/x stack.buffer 
     1952$4 = 0xffff88001af16000 
     1953(gdb) p/x stack.buffer[0] 
     1954$5 = 0x0 
     1955(gdb) p/x stack.buffer[127] 
     1956$6 = 0x0 
     1957(gdb) p/x stack.buffer[128] 
     1958$7 = 0x0 
     1959(gdb) p/x stack.buffer[1020] 
     1960$8 = 0x0 
     1961(gdb) p/x stack.buffer[1021] 
     1962$9 = 0x0 
     1963(gdb) p/x stack.buffer[1022] 
     1964$10 = 0x0 
     1965(gdb) p/x stack.buffer[1023] 
     1966$11 = 0x0 
     1967(gdb) p/x stack.buffer[1024] 
     1968$12 = 0xc7c7485500c3c9a0 
     1969(gdb) p/x stack.buffer[1025] 
     1970$13 = 0xe8e58948a001a000 
     1971(gdb) p/x stack.buffer[1026] 
     1972$14 = 0x4855c3c9e11ca49c 
     1973}}}