[Linux Project] Linux Kernel Module for Listing Tasks
来源:互联网 发布:java面向对象设计原则 编辑:程序博客网 时间:2024/06/10 13:02
- 这一次, 我们要编写一个能列出 Linux 系统中所有当前进程的内核模块.
- Part 1. 线性遍历整个进程列表
- 在 Linux 中, 进程控制块(PCB)的实现形式为内核结构体
task_struct
, 它被定义在头文件<Linux/sched.h>
里. 在 Linux 中, 宏for_each_process()
可以迭代系统中所有当前进程.
#include <linux/sched.h>struct task_struct *task;for_each_process(task) { /* 每次迭代中, task 指向下一个任务(头节点为哨兵节点) */}
- 把遍历的过程写在模块的入口函数里, 输出每个进程的名字(executable name), 状态(state)和进程 id 到内核日志, 并将输出内容和
ps -el
命令显示的内容相比对, 确认程序的正确性.
/* pa3.c */#include <linux/init.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/sched.h>int pa3_init(void) { struct task_struct *task; for_each_process(task) { printk(KERN_INFO "task pid: %d, task state: %ld, task name: %s\n", task->pid, task->state, task->comm); } return 0;}void pa3_exit(void) { return ;}module_init(pa3_init);module_exit(pa3_exit);MODULE_LICENSE("GPL");MODULE_DESCRIPTION("PA3");MODULE_AUTHOR("AW");
obj-m += pa3.oall: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
- 总体来说比较简单, 照做就行了. 下面是
ps -el
命令和模块输出内容各自前若干行的比较.
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD4 S 0 1 0 0 80 0 - 29972 - ? 00:00:06 systemd1 S 0 2 0 0 80 0 - 0 - ? 00:00:00 kthreadd1 S 0 4 2 0 60 -20 - 0 - ? 00:00:00 kworker/0:0H1 S 0 6 2 0 80 0 - 0 - ? 00:00:00 ksoftirqd/01 S 0 7 2 0 80 0 - 0 - ? 00:00:11 rcu_sched1 S 0 8 2 0 80 0 - 0 - ? 00:00:00 rcu_bh1 S 0 9 2 0 -40 - - 0 - ? 00:00:00 migration/01 S 0 10 2 0 60 -20 - 0 - ? 00:00:00 lru-add-drain5 S 0 11 2 0 -40 - - 0 - ? 00:00:00 watchdog/01 S 0 12 2 0 80 0 - 0 - ? 00:00:00 cpuhp/01 S 0 13 2 0 80 0 - 0 - ? 00:00:00 cpuhp/15 S 0 14 2 0 -40 - - 0 - ? 00:00:00 watchdog/11 S 0 15 2 0 -40 - - 0 - ? 00:00:00 migration/11 S 0 16 2 0 80 0 - 0 - ? 00:00:00 ksoftirqd/11 S 0 18 2 0 60 -20 - 0 - ? 00:00:00 kworker/1:0H5 S 0 19 2 0 80 0 - 0 - ? 00:00:00 kdevtmpfs1 S 0 20 2 0 60 -20 - 0 - ? 00:00:00 netns
[49946.111610] task pid: 1, task state: 1, task name: systemd[49946.111613] task pid: 2, task state: 1, task name: kthreadd[49946.111614] task pid: 4, task state: 1, task name: kworker/0:0H[49946.111615] task pid: 6, task state: 1, task name: ksoftirqd/0[49946.111616] task pid: 7, task state: 1, task name: rcu_sched[49946.111617] task pid: 8, task state: 1, task name: rcu_bh[49946.111618] task pid: 9, task state: 1, task name: migration/0[49946.111619] task pid: 10, task state: 1, task name: lru-add-drain[49946.111620] task pid: 11, task state: 1, task name: watchdog/0[49946.111621] task pid: 12, task state: 1, task name: cpuhp/0[49946.111621] task pid: 13, task state: 1, task name: cpuhp/1[49946.111622] task pid: 14, task state: 1, task name: watchdog/1[49946.111623] task pid: 15, task state: 1, task name: migration/1[49946.111624] task pid: 16, task state: 1, task name: ksoftirqd/1[49946.111625] task pid: 18, task state: 1, task name: kworker/1:0H[49946.111626] task pid: 19, task state: 1, task name: kdevtmpfs[49946.111627] task pid: 20, task state: 1, task name: netns
- 第二部分要求用深度优先搜索的方法来打印当前进程信息, 为了解决这个问题, 我们同样可以从内核现有代码中寻求帮助.
- 首先,在
<linux/sched.h>
中找到内核维护的进程树的根, 也就是 init 进程, 它作为struct task_struct *init_task;
出现. 这也是我们 DFS 的根节点 - 其次, 在
struct task_struct
的定义中我们发现每个进程控制块都维护了它的子进程的列表children
和兄弟进程列表sibling
. 这是 DFS 的迭代途径. - 然后, 我们找到定义在
<linux/list.h>
中的宏list_for_each()
通过它我们可以迭代children
列表. - 最后, 为了在
chilren
列表的元素中找到迭代对象, 我们使用list_entry()
宏来提取信息. - 注意到内核中的链表都是带有空白节点的双向循环链表, 按照我下面的代码最终实现的是对内核当前进程以 init 进程为根的先根次序访问.
/* pa3.c */#include <linux/init.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/sched.h>#include <linux/list.h>void dfs(struct task_struct *parent) { struct task_struct *task; struct list_head *list; list_for_each(list, &parent->children) { task = list_entry(list, struct task_struct, sibling); printk(KERN_INFO "task pid: %d, task ppid: %d, task ptask state: %ld, task name: %s\n", task->pid, task_ppid_nr(task), task->state, task->comm); dfs(task); }}int pa3_init(void) { printk(KERN_INFO "Part 1. Iterating over Tasks Linearly\n"); struct task_struct *task; for_each_process(task) { printk(KERN_INFO "task pid: %d, task state: %ld, task name: %s\n", task->pid, task->state, task->comm); } printk(KERN_INFO "Part 2. Iterating over Tasks with a Depth-First Search Tree\n"); dfs(&init_task); return 0;}void pa3_exit(void) { return ;}module_init(pa3_init);module_exit(pa3_exit);MODULE_LICENSE("GPL");MODULE_DESCRIPTION("PA3");MODULE_AUTHOR("AW");
- 结果输出在 Part 2 一行之后, 这里 Makefile 可以继续使用上一个.
- 最终我在内核日志中查看到的输出如下:
[51592.439863] Part 2. Iterating over Tasks with a Depth-First Search Tree[51592.439865] task pid: 1, task ppid: 0, task ptask state: 1, task name: systemd[51592.439866] task pid: 351, task ppid: 1, task ptask state: 1, task name: systemd-journal[51592.439867] task pid: 370, task ppid: 1, task ptask state: 1, task name: systemd-udevd[51592.439867] task pid: 24031, task ppid: 370, task ptask state: 0, task name: systemd-udevd[51592.439868] task pid: 736, task ppid: 1, task ptask state: 1, task name: systemd-timesyn[51592.439869] task pid: 1025, task ppid: 1, task ptask state: 1, task name: vmhgfs-fuse[51592.439870] task pid: 1048, task ppid: 1, task ptask state: 1, task name: vmware-vmblock-[51592.439871] task pid: 1067, task ppid: 1, task ptask state: 1, task name: vmtoolsd[51592.439871] task pid: 1093, task ppid: 1, task ptask state: 1, task name: VGAuthService[51592.439872] task pid: 1143, task ppid: 1, task ptask state: 1, task name: ManagementAgent[51592.439873] task pid: 1147, task ppid: 1, task ptask state: 1, task name: systemd-logind[51592.439874] task pid: 1148, task ppid: 1, task ptask state: 1, task name: bluetoothd[51592.439874] task pid: 1149, task ppid: 1, task ptask state: 1, task name: cron[51592.439875] task pid: 1150, task ppid: 1, task ptask state: 1, task name: dbus-daemon[51592.439876] task pid: 1153, task ppid: 1, task ptask state: 1, task name: NetworkManager[51592.439877] task pid: 1353, task ppid: 1153, task ptask state: 1, task name: dnsmasq[51592.439878] task pid: 20428, task ppid: 1153, task ptask state: 1, task name: dhclient[51592.439878] task pid: 1154, task ppid: 1, task ptask state: 1, task name: rsyslogd[51592.439879] task pid: 1156, task ppid: 1, task ptask state: 1, task name: acpid[51592.439880] task pid: 1166, task ppid: 1, task ptask state: 1, task name: whoopsie[51592.439881] task pid: 1167, task ppid: 1, task ptask state: 1, task name: snapd[51592.439881] task pid: 1173, task ppid: 1, task ptask state: 1, task name: avahi-daemon[51592.439882] task pid: 1206, task ppid: 1173, task ptask state: 1, task name: avahi-daemon[51592.439883] task pid: 1182, task ppid: 1, task ptask state: 1, task name: ModemManager[51592.439884] task pid: 1183, task ppid: 1, task ptask state: 1, task name: accounts-daemon[51592.439902] task pid: 1184, task ppid: 1, task ptask state: 1, task name: thermald[51592.439904] task pid: 1270, task ppid: 1, task ptask state: 1, task name: polkitd[51592.439905] task pid: 1271, task ppid: 1, task ptask state: 1, task name: cups-browsed[51592.439905] task pid: 1272, task ppid: 1, task ptask state: 1, task name: irqbalance[51592.439906] task pid: 1287, task ppid: 1, task ptask state: 1, task name: lightdm[51592.439907] task pid: 1318, task ppid: 1287, task ptask state: 1, task name: Xorg[51592.439908] task pid: 1477, task ppid: 1287, task ptask state: 1, task name: lightdm[51592.439909] task pid: 1488, task ppid: 1477, task ptask state: 1, task name: upstart[51592.439910] task pid: 1571, task ppid: 1488, task ptask state: 1, task name: upstart-udev-br[51592.439910] task pid: 1577, task ppid: 1488, task ptask state: 1, task name: dbus-daemon[51592.439911] task pid: 1589, task ppid: 1488, task ptask state: 1, task name: window-stack-br[51592.439912] task pid: 1615, task ppid: 1488, task ptask state: 1, task name: upstart-file-br[51592.439913] task pid: 1613, task ppid: 1488, task ptask state: 1, task name: upstart-dbus-br[51592.439913] task pid: 1617, task ppid: 1488, task ptask state: 1, task name: upstart-dbus-br[51592.439914] task pid: 1618, task ppid: 1488, task ptask state: 1, task name: gnome-keyring-d[51592.439921] task pid: 1638, task ppid: 1488, task ptask state: 1, task name: gpg-agent[51592.439922] task pid: 1644, task ppid: 1488, task ptask state: 1, task name: bamfdaemon[51592.439923] task pid: 1645, task ppid: 1488, task ptask state: 1, task name: ibus-daemon[51592.439924] task pid: 1665, task ppid: 1645, task ptask state: 1, task name: ibus-dconf[51592.439924] task pid: 1671, task ppid: 1645, task ptask state: 1, task name: ibus-ui-gtk3[51592.439925] task pid: 1772, task ppid: 1645, task ptask state: 1, task name: ibus-engine-sim[51592.439926] task pid: 1654, task ppid: 1488, task ptask state: 1, task name: gvfsd[51592.439927] task pid: 1662, task ppid: 1488, task ptask state: 1, task name: gvfsd-fuse[51592.439928] task pid: 1676, task ppid: 1488, task ptask state: 1, task name: ibus-x11[51592.439928] task pid: 1686, task ppid: 1488, task ptask state: 1, task name: at-spi-bus-laun[51592.439929] task pid: 1700, task ppid: 1686, task ptask state: 1, task name: dbus-daemon[51592.439930] task pid: 1705, task ppid: 1488, task ptask state: 1, task name: hud-service[51592.439931] task pid: 1708, task ppid: 1488, task ptask state: 1, task name: unity-settings-[51592.439932] task pid: 1710, task ppid: 1488, task ptask state: 1, task name: at-spi2-registr[51592.439932] task pid: 1715, task ppid: 1488, task ptask state: 1, task name: gnome-session-b[51592.439933] task pid: 1891, task ppid: 1715, task ptask state: 1, task name: nautilus[51592.439934] task pid: 1926, task ppid: 1715, task ptask state: 1, task name: gnome-software[51592.439935] task pid: 1928, task ppid: 1715, task ptask state: 1, task name: polkit-gnome-au[51592.439936] task pid: 1932, task ppid: 1715, task ptask state: 1, task name: nm-applet[51592.439936] task pid: 1956, task ppid: 1715, task ptask state: 1, task name: unity-fallback-[51592.439937] task pid: 2257, task ppid: 1715, task ptask state: 1, task name: update-notifier[51592.439938] task pid: 2280, task ppid: 1715, task ptask state: 1, task name: deja-dup-monito[51592.439939] task pid: 1726, task ppid: 1488, task ptask state: 1, task name: unity-panel-ser[51592.439939] task pid: 1746, task ppid: 1488, task ptask state: 1, task name: dconf-service[51592.439940] task pid: 1784, task ppid: 1488, task ptask state: 1, task name: indicator-messa[51592.439941] task pid: 1785, task ppid: 1488, task ptask state: 1, task name: indicator-bluet[51592.439941] task pid: 1786, task ppid: 1488, task ptask state: 1, task name: indicator-power[51592.439942] task pid: 1787, task ppid: 1488, task ptask state: 1, task name: indicator-datet[51592.439962] task pid: 1790, task ppid: 1488, task ptask state: 1, task name: indicator-keybo[51592.439964] task pid: 1791, task ppid: 1488, task ptask state: 1, task name: indicator-sound[51592.439965] task pid: 1798, task ppid: 1488, task ptask state: 1, task name: indicator-print[51592.439965] task pid: 1800, task ppid: 1488, task ptask state: 1, task name: indicator-sessi[51592.439966] task pid: 1801, task ppid: 1488, task ptask state: 1, task name: compiz[51592.439967] task pid: 1806, task ppid: 1488, task ptask state: 1, task name: indicator-appli[51592.439968] task pid: 1845, task ppid: 1488, task ptask state: 1, task name: pulseaudio[51592.439969] task pid: 1867, task ppid: 1488, task ptask state: 1, task name: evolution-sourc[51592.439969] task pid: 1989, task ppid: 1488, task ptask state: 1, task name: vmtoolsd[51592.439970] task pid: 1982, task ppid: 1488, task ptask state: 1, task name: gvfs-udisks2-vo[51592.439971] task pid: 2005, task ppid: 1488, task ptask state: 1, task name: gvfs-gphoto2-vo[51592.439972] task pid: 2013, task ppid: 1488, task ptask state: 1, task name: gvfs-mtp-volume[51592.439972] task pid: 2018, task ppid: 1488, task ptask state: 1, task name: gvfs-goa-volume[51592.439973] task pid: 2026, task ppid: 1488, task ptask state: 1, task name: gvfs-afc-volume[51592.439974] task pid: 2041, task ppid: 1488, task ptask state: 1, task name: gconfd-2[51592.439975] task pid: 1960, task ppid: 1488, task ptask state: 1, task name: evolution-calen[51592.439976] task pid: 2054, task ppid: 1960, task ptask state: 1, task name: evolution-calen[51592.439976] task pid: 2088, task ppid: 1960, task ptask state: 1, task name: evolution-calen[51592.439977] task pid: 2063, task ppid: 1488, task ptask state: 1, task name: gvfsd-trash[51592.439978] task pid: 2087, task ppid: 1488, task ptask state: 1, task name: evolution-addre[51592.439979] task pid: 2102, task ppid: 2087, task ptask state: 1, task name: evolution-addre[51592.439980] task pid: 2117, task ppid: 1488, task ptask state: 1, task name: gvfsd-metadata[51592.439980] task pid: 2184, task ppid: 1488, task ptask state: 1, task name: sh[51592.439981] task pid: 2188, task ppid: 2184, task ptask state: 1, task name: zeitgeist-daemo[51592.439982] task pid: 2197, task ppid: 1488, task ptask state: 1, task name: zeitgeist-datah[51592.439983] task pid: 2195, task ppid: 1488, task ptask state: 1, task name: zeitgeist-fts[51592.439984] task pid: 2405, task ppid: 1488, task ptask state: 0, task name: gnome-terminal-[51592.439985] task pid: 2412, task ppid: 2405, task ptask state: 1, task name: bash[51592.439985] task pid: 24028, task ppid: 2412, task ptask state: 1, task name: sudo[51592.439986] task pid: 24030, task ppid: 24028, task ptask state: 0, task name: insmod[51592.439987] task pid: 4326, task ppid: 1488, task ptask state: 1, task name: unity-scope-hom[51592.439988] task pid: 4339, task ppid: 1488, task ptask state: 1, task name: unity-files-dae[51592.439989] task pid: 4338, task ppid: 1488, task ptask state: 1, task name: unity-scope-loa[51592.439989] task pid: 13517, task ppid: 1488, task ptask state: 1, task name: gvfsd-network[51592.439990] task pid: 13546, task ppid: 1488, task ptask state: 1, task name: gvfsd-dnssd[51592.439991] task pid: 14423, task ppid: 1488, task ptask state: 1, task name: notify-osd[51592.439992] task pid: 1321, task ppid: 1, task ptask state: 1, task name: agetty[51592.439993] task pid: 1401, task ppid: 1, task ptask state: 1, task name: tpvmlp[51592.439994] task pid: 1484, task ppid: 1, task ptask state: 1, task name: systemd[51592.439994] task pid: 1485, task ppid: 1484, task ptask state: 1, task name: (sd-pam)[51592.439995] task pid: 1736, task ppid: 1, task ptask state: 1, task name: upowerd[51592.439996] task pid: 1846, task ppid: 1, task ptask state: 1, task name: rtkit-daemon[51592.439997] task pid: 1909, task ppid: 1, task ptask state: 1, task name: colord[51592.439997] task pid: 1994, task ppid: 1, task ptask state: 1, task name: udisksd[51592.439998] task pid: 2036, task ppid: 1, task ptask state: 0, task name: fwupd[51592.440017] task pid: 2857, task ppid: 1, task ptask state: 1, task name: systemd-network[51592.440019] task pid: 2, task ppid: 0, task ptask state: 1, task name: kthreadd[51592.440020] task pid: 4, task ppid: 2, task ptask state: 1, task name: kworker/0:0H[51592.440021] task pid: 6, task ppid: 2, task ptask state: 1, task name: ksoftirqd/0[51592.440022] task pid: 7, task ppid: 2, task ptask state: 1, task name: rcu_sched[51592.440022] task pid: 8, task ppid: 2, task ptask state: 1, task name: rcu_bh[51592.440023] task pid: 9, task ppid: 2, task ptask state: 1, task name: migration/0[51592.440024] task pid: 10, task ppid: 2, task ptask state: 1, task name: lru-add-drain[51592.440025] task pid: 11, task ppid: 2, task ptask state: 1, task name: watchdog/0[51592.440026] task pid: 12, task ppid: 2, task ptask state: 1, task name: cpuhp/0[51592.440027] task pid: 13, task ppid: 2, task ptask state: 1, task name: cpuhp/1[51592.440027] task pid: 14, task ppid: 2, task ptask state: 1, task name: watchdog/1[51592.440028] task pid: 15, task ppid: 2, task ptask state: 1, task name: migration/1[51592.440029] task pid: 16, task ppid: 2, task ptask state: 1, task name: ksoftirqd/1[51592.440030] task pid: 18, task ppid: 2, task ptask state: 1, task name: kworker/1:0H[51592.440030] task pid: 19, task ppid: 2, task ptask state: 1, task name: kdevtmpfs[51592.440031] task pid: 20, task ppid: 2, task ptask state: 1, task name: netns[51592.440032] task pid: 22, task ppid: 2, task ptask state: 1, task name: khungtaskd[51592.440033] task pid: 23, task ppid: 2, task ptask state: 1, task name: oom_reaper[51592.440033] task pid: 24, task ppid: 2, task ptask state: 1, task name: writeback[51592.440034] task pid: 25, task ppid: 2, task ptask state: 1, task name: kcompactd0[51592.440035] task pid: 26, task ppid: 2, task ptask state: 1, task name: ksmd[51592.440036] task pid: 27, task ppid: 2, task ptask state: 1, task name: khugepaged[51592.440038] task pid: 28, task ppid: 2, task ptask state: 1, task name: crypto[51592.440039] task pid: 29, task ppid: 2, task ptask state: 1, task name: kintegrityd[51592.440039] task pid: 30, task ppid: 2, task ptask state: 1, task name: bioset[51592.440040] task pid: 31, task ppid: 2, task ptask state: 1, task name: kblockd[51592.440041] task pid: 32, task ppid: 2, task ptask state: 1, task name: ata_sff[51592.440042] task pid: 33, task ppid: 2, task ptask state: 1, task name: md[51592.440043] task pid: 34, task ppid: 2, task ptask state: 1, task name: devfreq_wq[51592.440043] task pid: 35, task ppid: 2, task ptask state: 1, task name: watchdogd[51592.440044] task pid: 39, task ppid: 2, task ptask state: 1, task name: kauditd[51592.440045] task pid: 40, task ppid: 2, task ptask state: 1, task name: kswapd0[51592.440045] task pid: 41, task ppid: 2, task ptask state: 1, task name: vmstat[51592.440046] task pid: 42, task ppid: 2, task ptask state: 1, task name: bioset[51592.440047] task pid: 43, task ppid: 2, task ptask state: 1, task name: ecryptfs-kthrea[51592.440048] task pid: 60, task ppid: 2, task ptask state: 1, task name: kthrotld[51592.440049] task pid: 61, task ppid: 2, task ptask state: 1, task name: acpi_thermal_pm[51592.440049] task pid: 62, task ppid: 2, task ptask state: 1, task name: bioset[51592.440050] task pid: 63, task ppid: 2, task ptask state: 1, task name: bioset[51592.440051] task pid: 64, task ppid: 2, task ptask state: 1, task name: bioset[51592.440052] task pid: 65, task ppid: 2, task ptask state: 1, task name: bioset[51592.440053] task pid: 66, task ppid: 2, task ptask state: 1, task name: bioset[51592.440053] task pid: 67, task ppid: 2, task ptask state: 1, task name: bioset[51592.440054] task pid: 68, task ppid: 2, task ptask state: 1, task name: bioset[51592.440055] task pid: 69, task ppid: 2, task ptask state: 1, task name: bioset[51592.440055] task pid: 70, task ppid: 2, task ptask state: 1, task name: bioset[51592.440076] task pid: 71, task ppid: 2, task ptask state: 1, task name: bioset[51592.440078] task pid: 72, task ppid: 2, task ptask state: 1, task name: bioset[51592.440079] task pid: 73, task ppid: 2, task ptask state: 1, task name: bioset[51592.440079] task pid: 74, task ppid: 2, task ptask state: 1, task name: bioset[51592.440080] task pid: 75, task ppid: 2, task ptask state: 1, task name: bioset[51592.440081] task pid: 76, task ppid: 2, task ptask state: 1, task name: bioset[51592.440081] task pid: 77, task ppid: 2, task ptask state: 1, task name: bioset[51592.440082] task pid: 78, task ppid: 2, task ptask state: 1, task name: bioset[51592.440083] task pid: 79, task ppid: 2, task ptask state: 1, task name: bioset[51592.440084] task pid: 80, task ppid: 2, task ptask state: 1, task name: bioset[51592.440084] task pid: 81, task ppid: 2, task ptask state: 1, task name: bioset[51592.440085] task pid: 82, task ppid: 2, task ptask state: 1, task name: bioset[51592.440086] task pid: 83, task ppid: 2, task ptask state: 1, task name: bioset[51592.440087] task pid: 84, task ppid: 2, task ptask state: 1, task name: bioset[51592.440087] task pid: 85, task ppid: 2, task ptask state: 1, task name: bioset[51592.440088] task pid: 86, task ppid: 2, task ptask state: 1, task name: scsi_eh_0[51592.440089] task pid: 87, task ppid: 2, task ptask state: 1, task name: scsi_tmf_0[51592.440090] task pid: 88, task ppid: 2, task ptask state: 1, task name: scsi_eh_1[51592.440091] task pid: 89, task ppid: 2, task ptask state: 1, task name: scsi_tmf_1[51592.440091] task pid: 94, task ppid: 2, task ptask state: 1, task name: ipv6_addrconf[51592.440092] task pid: 112, task ppid: 2, task ptask state: 1, task name: charger_manager[51592.440093] task pid: 159, task ppid: 2, task ptask state: 1, task name: scsi_eh_2[51592.440094] task pid: 160, task ppid: 2, task ptask state: 1, task name: mpt_poll_0[51592.440095] task pid: 161, task ppid: 2, task ptask state: 1, task name: mpt/0[51592.440096] task pid: 162, task ppid: 2, task ptask state: 1, task name: scsi_tmf_2[51592.440096] task pid: 163, task ppid: 2, task ptask state: 1, task name: scsi_eh_3[51592.440097] task pid: 164, task ppid: 2, task ptask state: 1, task name: scsi_tmf_3[51592.440098] task pid: 165, task ppid: 2, task ptask state: 1, task name: scsi_eh_4[51592.440099] task pid: 166, task ppid: 2, task ptask state: 1, task name: scsi_tmf_4[51592.440099] task pid: 167, task ppid: 2, task ptask state: 1, task name: scsi_eh_5[51592.440100] task pid: 168, task ppid: 2, task ptask state: 1, task name: scsi_tmf_5[51592.440101] task pid: 169, task ppid: 2, task ptask state: 1, task name: scsi_eh_6[51592.440102] task pid: 170, task ppid: 2, task ptask state: 1, task name: scsi_tmf_6[51592.440102] task pid: 171, task ppid: 2, task ptask state: 1, task name: scsi_eh_7[51592.440103] task pid: 172, task ppid: 2, task ptask state: 1, task name: scsi_tmf_7[51592.440104] task pid: 173, task ppid: 2, task ptask state: 1, task name: scsi_eh_8[51592.440105] task pid: 174, task ppid: 2, task ptask state: 1, task name: scsi_tmf_8[51592.440105] task pid: 175, task ppid: 2, task ptask state: 1, task name: scsi_eh_9[51592.440106] task pid: 176, task ppid: 2, task ptask state: 1, task name: scsi_tmf_9[51592.440107] task pid: 177, task ppid: 2, task ptask state: 1, task name: scsi_eh_10[51592.440108] task pid: 178, task ppid: 2, task ptask state: 1, task name: scsi_tmf_10[51592.440108] task pid: 179, task ppid: 2, task ptask state: 1, task name: scsi_eh_11[51592.440109] task pid: 180, task ppid: 2, task ptask state: 1, task name: scsi_tmf_11[51592.440110] task pid: 181, task ppid: 2, task ptask state: 1, task name: scsi_eh_12[51592.440111] task pid: 182, task ppid: 2, task ptask state: 1, task name: scsi_tmf_12[51592.440111] task pid: 183, task ppid: 2, task ptask state: 1, task name: scsi_eh_13[51592.440112] task pid: 184, task ppid: 2, task ptask state: 1, task name: scsi_tmf_13[51592.440133] task pid: 185, task ppid: 2, task ptask state: 1, task name: scsi_eh_14[51592.440134] task pid: 186, task ppid: 2, task ptask state: 1, task name: scsi_tmf_14[51592.440135] task pid: 187, task ppid: 2, task ptask state: 1, task name: scsi_eh_15[51592.440136] task pid: 188, task ppid: 2, task ptask state: 1, task name: scsi_tmf_15[51592.440136] task pid: 189, task ppid: 2, task ptask state: 1, task name: scsi_eh_16[51592.440137] task pid: 190, task ppid: 2, task ptask state: 1, task name: scsi_tmf_16[51592.440138] task pid: 191, task ppid: 2, task ptask state: 1, task name: scsi_eh_17[51592.440139] task pid: 192, task ppid: 2, task ptask state: 1, task name: scsi_tmf_17[51592.440139] task pid: 193, task ppid: 2, task ptask state: 1, task name: scsi_eh_18[51592.440140] task pid: 194, task ppid: 2, task ptask state: 1, task name: scsi_tmf_18[51592.440141] task pid: 195, task ppid: 2, task ptask state: 1, task name: scsi_eh_19[51592.440142] task pid: 196, task ppid: 2, task ptask state: 1, task name: scsi_tmf_19[51592.440142] task pid: 197, task ppid: 2, task ptask state: 1, task name: scsi_eh_20[51592.440143] task pid: 198, task ppid: 2, task ptask state: 1, task name: scsi_tmf_20[51592.440145] task pid: 199, task ppid: 2, task ptask state: 1, task name: scsi_eh_21[51592.440145] task pid: 200, task ppid: 2, task ptask state: 1, task name: scsi_tmf_21[51592.440146] task pid: 201, task ppid: 2, task ptask state: 1, task name: scsi_eh_22[51592.440147] task pid: 202, task ppid: 2, task ptask state: 1, task name: scsi_tmf_22[51592.440148] task pid: 203, task ppid: 2, task ptask state: 1, task name: scsi_eh_23[51592.440148] task pid: 204, task ppid: 2, task ptask state: 1, task name: scsi_tmf_23[51592.440149] task pid: 205, task ppid: 2, task ptask state: 1, task name: scsi_eh_24[51592.440150] task pid: 206, task ppid: 2, task ptask state: 1, task name: scsi_tmf_24[51592.440151] task pid: 207, task ppid: 2, task ptask state: 1, task name: scsi_eh_25[51592.440151] task pid: 208, task ppid: 2, task ptask state: 1, task name: scsi_tmf_25[51592.440152] task pid: 209, task ppid: 2, task ptask state: 1, task name: scsi_eh_26[51592.440153] task pid: 210, task ppid: 2, task ptask state: 1, task name: scsi_tmf_26[51592.440154] task pid: 211, task ppid: 2, task ptask state: 1, task name: scsi_eh_27[51592.440154] task pid: 212, task ppid: 2, task ptask state: 1, task name: scsi_tmf_27[51592.440155] task pid: 213, task ppid: 2, task ptask state: 1, task name: scsi_eh_28[51592.440156] task pid: 214, task ppid: 2, task ptask state: 1, task name: scsi_tmf_28[51592.440157] task pid: 215, task ppid: 2, task ptask state: 1, task name: scsi_eh_29[51592.440157] task pid: 216, task ppid: 2, task ptask state: 1, task name: scsi_tmf_29[51592.440158] task pid: 217, task ppid: 2, task ptask state: 1, task name: scsi_eh_30[51592.440159] task pid: 218, task ppid: 2, task ptask state: 1, task name: scsi_tmf_30[51592.440160] task pid: 219, task ppid: 2, task ptask state: 1, task name: scsi_eh_31[51592.440160] task pid: 220, task ppid: 2, task ptask state: 1, task name: scsi_tmf_31[51592.440161] task pid: 247, task ppid: 2, task ptask state: 1, task name: scsi_eh_32[51592.440162] task pid: 248, task ppid: 2, task ptask state: 1, task name: scsi_tmf_32[51592.440163] task pid: 249, task ppid: 2, task ptask state: 1, task name: bioset[51592.440163] task pid: 251, task ppid: 2, task ptask state: 1, task name: kworker/0:1H[51592.440164] task pid: 253, task ppid: 2, task ptask state: 1, task name: bioset[51592.440165] task pid: 255, task ppid: 2, task ptask state: 1, task name: ttm_swap[51592.440166] task pid: 314, task ppid: 2, task ptask state: 1, task name: jbd2/sda4-8[51592.440167] task pid: 315, task ppid: 2, task ptask state: 1, task name: ext4-rsv-conver[51592.440167] task pid: 416, task ppid: 2, task ptask state: 1, task name: nfit[51592.440168] task pid: 686, task ppid: 2, task ptask state: 1, task name: jbd2/sda1-8[51592.440169] task pid: 687, task ppid: 2, task ptask state: 1, task name: ext4-rsv-conver[51592.440189] task pid: 698, task ppid: 2, task ptask state: 1, task name: jbd2/sda3-8[51592.440190] task pid: 703, task ppid: 2, task ptask state: 1, task name: ext4-rsv-conver[51592.440191] task pid: 1887, task ppid: 2, task ptask state: 1, task name: krfcommd[51592.440192] task pid: 1973, task ppid: 2, task ptask state: 1, task name: kworker/1:1H[51592.440192] task pid: 20445, task ppid: 2, task ptask state: 1, task name: kworker/u257:0[51592.440193] task pid: 20446, task ppid: 2, task ptask state: 1, task name: hci0[51592.440194] task pid: 20447, task ppid: 2, task ptask state: 1, task name: hci0[51592.440195] task pid: 20449, task ppid: 2, task ptask state: 1, task name: kworker/u257:2[51592.440196] task pid: 21088, task ppid: 2, task ptask state: 1, task name: kworker/u256:1[51592.440197] task pid: 21491, task ppid: 2, task ptask state: 1, task name: kworker/1:2[51592.440197] task pid: 21581, task ppid: 2, task ptask state: 1, task name: kworker/u256:2[51592.440198] task pid: 21584, task ppid: 2, task ptask state: 1, task name: kworker/0:2[51592.440199] task pid: 22838, task ppid: 2, task ptask state: 1, task name: kworker/1:1[51592.440200] task pid: 22935, task ppid: 2, task ptask state: 1, task name: kworker/0:0[51592.440201] task pid: 23274, task ppid: 2, task ptask state: 1, task name: kworker/u256:0
- 最后是很有趣的结构体, Linux 下进程控制块PCB的实现:
struct task_struct {#ifdef CONFIG_THREAD_INFO_IN_TASK /* * For reasons of header soup (see current_thread_info()), this * must be the first element of task_struct. */ struct thread_info thread_info;#endif volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ void *stack; atomic_t usage; unsigned int flags; /* per process flags, defined below */ unsigned int ptrace;#ifdef CONFIG_SMP struct llist_node wake_entry; int on_cpu;#ifdef CONFIG_THREAD_INFO_IN_TASK unsigned int cpu; /* current CPU */#endif unsigned int wakee_flips; unsigned long wakee_flip_decay_ts; struct task_struct *last_wakee; int wake_cpu;#endif int on_rq; int prio, static_prio, normal_prio; unsigned int rt_priority; const struct sched_class *sched_class; struct sched_entity se; struct sched_rt_entity rt;#ifdef CONFIG_CGROUP_SCHED struct task_group *sched_task_group;#endif struct sched_dl_entity dl;#ifdef CONFIG_PREEMPT_NOTIFIERS /* list of struct preempt_notifier: */ struct hlist_head preempt_notifiers;#endif#ifdef CONFIG_BLK_DEV_IO_TRACE unsigned int btrace_seq;#endif unsigned int policy; int nr_cpus_allowed; cpumask_t cpus_allowed;#ifdef CONFIG_PREEMPT_RCU int rcu_read_lock_nesting; union rcu_special rcu_read_unlock_special; struct list_head rcu_node_entry; struct rcu_node *rcu_blocked_node;#endif /* #ifdef CONFIG_PREEMPT_RCU */#ifdef CONFIG_TASKS_RCU unsigned long rcu_tasks_nvcsw; bool rcu_tasks_holdout; struct list_head rcu_tasks_holdout_list; int rcu_tasks_idle_cpu;#endif /* #ifdef CONFIG_TASKS_RCU */#ifdef CONFIG_SCHED_INFO struct sched_info sched_info;#endif struct list_head tasks;#ifdef CONFIG_SMP struct plist_node pushable_tasks; struct rb_node pushable_dl_tasks;#endif struct mm_struct *mm, *active_mm; /* per-thread vma caching */ u32 vmacache_seqnum; struct vm_area_struct *vmacache[VMACACHE_SIZE];#if defined(SPLIT_RSS_COUNTING) struct task_rss_stat rss_stat;#endif/* task state */ int exit_state; int exit_code, exit_signal; int pdeath_signal; /* The signal sent when the parent dies */ unsigned long jobctl; /* JOBCTL_*, siglock protected */ /* Used for emulating ABI behavior of previous Linux versions */ unsigned int personality; /* scheduler bits, serialized by scheduler locks */ unsigned sched_reset_on_fork:1; unsigned sched_contributes_to_load:1; unsigned sched_migrated:1; unsigned sched_remote_wakeup:1; unsigned :0; /* force alignment to the next boundary */ /* unserialized, strictly 'current' */ unsigned in_execve:1; /* bit to tell LSMs we're in execve */ unsigned in_iowait:1;#if !defined(TIF_RESTORE_SIGMASK) unsigned restore_sigmask:1;#endif#ifdef CONFIG_MEMCG unsigned memcg_may_oom:1;#ifndef CONFIG_SLOB unsigned memcg_kmem_skip_account:1;#endif#endif#ifdef CONFIG_COMPAT_BRK unsigned brk_randomized:1;#endif unsigned long atomic_flags; /* Flags needing atomic access. */ struct restart_block restart_block; pid_t pid; pid_t tgid;#ifdef CONFIG_CC_STACKPROTECTOR /* Canary value for the -fstack-protector gcc feature */ unsigned long stack_canary;#endif /* * pointers to (original) parent process, youngest child, younger sibling, * older sibling, respectively. (p->father can be replaced with * p->real_parent->pid) */ struct task_struct __rcu *real_parent; /* real parent process */ struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports */ /* * children/sibling forms the list of my natural children */ struct list_head children; /* list of my children */ struct list_head sibling; /* linkage in my parent's children list */ struct task_struct *group_leader; /* threadgroup leader */ /* * ptraced is the list of tasks this task is using ptrace on. * This includes both natural children and PTRACE_ATTACH targets. * p->ptrace_entry is p's link on the p->parent->ptraced list. */ struct list_head ptraced; struct list_head ptrace_entry; /* PID/PID hash table linkage. */ struct pid_link pids[PIDTYPE_MAX]; struct list_head thread_group; struct list_head thread_node; struct completion *vfork_done; /* for vfork() */ int __user *set_child_tid; /* CLONE_CHILD_SETTID */ int __user *clear_child_tid; /* CLONE_CHILD_CLEARTID */ u64 utime, stime;#ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME u64 utimescaled, stimescaled;#endif u64 gtime; struct prev_cputime prev_cputime;#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN seqcount_t vtime_seqcount; unsigned long long vtime_snap; enum { /* Task is sleeping or running in a CPU with VTIME inactive */ VTIME_INACTIVE = 0, /* Task runs in userspace in a CPU with VTIME active */ VTIME_USER, /* Task runs in kernelspace in a CPU with VTIME active */ VTIME_SYS, } vtime_snap_whence;#endif#ifdef CONFIG_NO_HZ_FULL atomic_t tick_dep_mask;#endif unsigned long nvcsw, nivcsw; /* context switch counts */ u64 start_time; /* monotonic time in nsec */ u64 real_start_time; /* boot based time in nsec *//* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */ unsigned long min_flt, maj_flt;#ifdef CONFIG_POSIX_TIMERS struct task_cputime cputime_expires; struct list_head cpu_timers[3];#endif/* process credentials */ const struct cred __rcu *ptracer_cred; /* Tracer's credentials at attach */ const struct cred __rcu *real_cred; /* objective and real subjective task * credentials (COW) */ const struct cred __rcu *cred; /* effective (overridable) subjective task * credentials (COW) */ char comm[TASK_COMM_LEN]; /* executable name excluding path - access with [gs]et_task_comm (which lock it with task_lock()) - initialized normally by setup_new_exec *//* file system info */ struct nameidata *nameidata;#ifdef CONFIG_SYSVIPC/* ipc stuff */ struct sysv_sem sysvsem; struct sysv_shm sysvshm;#endif#ifdef CONFIG_DETECT_HUNG_TASK/* hung task detection */ unsigned long last_switch_count;#endif/* filesystem information */ struct fs_struct *fs;/* open file information */ struct files_struct *files;/* namespaces */ struct nsproxy *nsproxy;/* signal handlers */ struct signal_struct *signal; struct sighand_struct *sighand; sigset_t blocked, real_blocked; sigset_t saved_sigmask; /* restored if set_restore_sigmask() was used */ struct sigpending pending; unsigned long sas_ss_sp; size_t sas_ss_size; unsigned sas_ss_flags; struct callback_head *task_works; struct audit_context *audit_context;#ifdef CONFIG_AUDITSYSCALL kuid_t loginuid; unsigned int sessionid;#endif struct seccomp seccomp;/* Thread group tracking */ u32 parent_exec_id; u32 self_exec_id;/* Protection of (de-)allocation: mm, files, fs, tty, keyrings, mems_allowed, * mempolicy */ spinlock_t alloc_lock; /* Protection of the PI data structures: */ raw_spinlock_t pi_lock; struct wake_q_node wake_q;#ifdef CONFIG_RT_MUTEXES /* PI waiters blocked on a rt_mutex held by this task */ struct rb_root pi_waiters; struct rb_node *pi_waiters_leftmost; /* Deadlock detection and priority inheritance handling */ struct rt_mutex_waiter *pi_blocked_on;#endif#ifdef CONFIG_DEBUG_MUTEXES /* mutex deadlock detection */ struct mutex_waiter *blocked_on;#endif#ifdef CONFIG_TRACE_IRQFLAGS unsigned int irq_events; unsigned long hardirq_enable_ip; unsigned long hardirq_disable_ip; unsigned int hardirq_enable_event; unsigned int hardirq_disable_event; int hardirqs_enabled; int hardirq_context; unsigned long softirq_disable_ip; unsigned long softirq_enable_ip; unsigned int softirq_disable_event; unsigned int softirq_enable_event; int softirqs_enabled; int softirq_context;#endif#ifdef CONFIG_LOCKDEP# define MAX_LOCK_DEPTH 48UL u64 curr_chain_key; int lockdep_depth; unsigned int lockdep_recursion; struct held_lock held_locks[MAX_LOCK_DEPTH]; gfp_t lockdep_reclaim_gfp;#endif#ifdef CONFIG_UBSAN unsigned int in_ubsan;#endif/* journalling filesystem info */ void *journal_info;/* stacked block device info */ struct bio_list *bio_list;#ifdef CONFIG_BLOCK/* stack plugging */ struct blk_plug *plug;#endif/* VM state */ struct reclaim_state *reclaim_state; struct backing_dev_info *backing_dev_info; struct io_context *io_context; unsigned long ptrace_message; siginfo_t *last_siginfo; /* For ptrace use. */ struct task_io_accounting ioac;#if defined(CONFIG_TASK_XACCT) u64 acct_rss_mem1; /* accumulated rss usage */ u64 acct_vm_mem1; /* accumulated virtual memory usage */ u64 acct_timexpd; /* stime + utime since last update */#endif#ifdef CONFIG_CPUSETS nodemask_t mems_allowed; /* Protected by alloc_lock */ seqcount_t mems_allowed_seq; /* Seqence no to catch updates */ int cpuset_mem_spread_rotor; int cpuset_slab_spread_rotor;#endif#ifdef CONFIG_CGROUPS /* Control Group info protected by css_set_lock */ struct css_set __rcu *cgroups; /* cg_list protected by css_set_lock and tsk->alloc_lock */ struct list_head cg_list;#endif#ifdef CONFIG_INTEL_RDT_A int closid;#endif#ifdef CONFIG_FUTEX struct robust_list_head __user *robust_list;#ifdef CONFIG_COMPAT struct compat_robust_list_head __user *compat_robust_list;#endif struct list_head pi_state_list; struct futex_pi_state *pi_state_cache;#endif#ifdef CONFIG_PERF_EVENTS struct perf_event_context *perf_event_ctxp[perf_nr_task_contexts]; struct mutex perf_event_mutex; struct list_head perf_event_list;#endif#ifdef CONFIG_DEBUG_PREEMPT unsigned long preempt_disable_ip;#endif#ifdef CONFIG_NUMA struct mempolicy *mempolicy; /* Protected by alloc_lock */ short il_next; short pref_node_fork;#endif#ifdef CONFIG_NUMA_BALANCING int numa_scan_seq; unsigned int numa_scan_period; unsigned int numa_scan_period_max; int numa_preferred_nid; unsigned long numa_migrate_retry; u64 node_stamp; /* migration stamp */ u64 last_task_numa_placement; u64 last_sum_exec_runtime; struct callback_head numa_work; struct list_head numa_entry; struct numa_group *numa_group; /* * numa_faults is an array split into four regions: * faults_memory, faults_cpu, faults_memory_buffer, faults_cpu_buffer * in this precise order. * * faults_memory: Exponential decaying average of faults on a per-node * basis. Scheduling placement decisions are made based on these * counts. The values remain static for the duration of a PTE scan. * faults_cpu: Track the nodes the process was running on when a NUMA * hinting fault was incurred. * faults_memory_buffer and faults_cpu_buffer: Record faults per node * during the current scan window. When the scan completes, the counts * in faults_memory and faults_cpu decay and these values are copied. */ unsigned long *numa_faults; unsigned long total_numa_faults; /* * numa_faults_locality tracks if faults recorded during the last * scan window were remote/local or failed to migrate. The task scan * period is adapted based on the locality of the faults with different * weights depending on whether they were shared or private faults */ unsigned long numa_faults_locality[3]; unsigned long numa_pages_migrated;#endif /* CONFIG_NUMA_BALANCING */#ifdef CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH struct tlbflush_unmap_batch tlb_ubc;#endif struct rcu_head rcu; /* * cache last used pipe for splice */ struct pipe_inode_info *splice_pipe; struct page_frag task_frag;#ifdef CONFIG_TASK_DELAY_ACCT struct task_delay_info *delays;#endif#ifdef CONFIG_FAULT_INJECTION int make_it_fail;#endif /* * when (nr_dirtied >= nr_dirtied_pause), it's time to call * balance_dirty_pages() for some dirty throttling pause */ int nr_dirtied; int nr_dirtied_pause; unsigned long dirty_paused_when; /* start of a write-and-pause period */#ifdef CONFIG_LATENCYTOP int latency_record_count; struct latency_record latency_record[LT_SAVECOUNT];#endif /* * time slack values; these are used to round up poll() and * select() etc timeout values. These are in nanoseconds. */ u64 timer_slack_ns; u64 default_timer_slack_ns;#ifdef CONFIG_KASAN unsigned int kasan_depth;#endif#ifdef CONFIG_FUNCTION_GRAPH_TRACER /* Index of current stored address in ret_stack */ int curr_ret_stack; /* Stack of return addresses for return function tracing */ struct ftrace_ret_stack *ret_stack; /* time stamp for last schedule */ unsigned long long ftrace_timestamp; /* * Number of functions that haven't been traced * because of depth overrun. */ atomic_t trace_overrun; /* Pause for the tracing */ atomic_t tracing_graph_pause;#endif#ifdef CONFIG_TRACING /* state flags for use by tracers */ unsigned long trace; /* bitmask and counter of trace recursion */ unsigned long trace_recursion;#endif /* CONFIG_TRACING */#ifdef CONFIG_KCOV /* Coverage collection mode enabled for this task (0 if disabled). */ enum kcov_mode kcov_mode; /* Size of the kcov_area. */ unsigned kcov_size; /* Buffer for coverage collection. */ void *kcov_area; /* kcov desciptor wired with this task or NULL. */ struct kcov *kcov;#endif#ifdef CONFIG_MEMCG struct mem_cgroup *memcg_in_oom; gfp_t memcg_oom_gfp_mask; int memcg_oom_order; /* number of pages to reclaim on returning to userland */ unsigned int memcg_nr_pages_over_high;#endif#ifdef CONFIG_UPROBES struct uprobe_task *utask;#endif#if defined(CONFIG_BCACHE) || defined(CONFIG_BCACHE_MODULE) unsigned int sequential_io; unsigned int sequential_io_avg;#endif#ifdef CONFIG_DEBUG_ATOMIC_SLEEP unsigned long task_state_change;#endif int pagefault_disabled;#ifdef CONFIG_MMU struct task_struct *oom_reaper_list;#endif#ifdef CONFIG_VMAP_STACK struct vm_struct *stack_vm_area;#endif#ifdef CONFIG_THREAD_INFO_IN_TASK /* A live task holds one reference. */ atomic_t stack_refcount;#endif/* CPU-specific state of this task */ struct thread_struct thread;/* * WARNING: on x86, 'thread_struct' contains a variable-sized * structure. It *MUST* be at the end of 'task_struct'. * * Do not put anything below here! */};
0 0
- [Linux Project] Linux Kernel Module for Listing Tasks
- A simple kernel module for linux
- Linux kernel & module program
- Build linux kernel Module
- linux kernel module programming
- compiling-linux-kernel-module
- linux kernel、module编译
- Linux kernel module加载
- linux kernel module 实例
- Linux Kernel Project
- [Linux Project] Kernel Modules
- 如何加入linux开源项目-GNOME Project Listing
- Linux Module 的HelloWorld程序(For Kernel-2.4)
- Linux Module 的HelloWorld程序(For Kernel-2.6)
- One linux kernel module example
- Linux Debugging 8 - Kernel Module
- Kgdb调试linux kernel module
- linux kernel module - hello world
- MySQL字段类型
- 创建表时报ORA-01658
- logback配置和使用
- Oracle 从10.2.0.1升级到10.2.0.5
- virtualbox 磁盘扩容
- [Linux Project] Linux Kernel Module for Listing Tasks
- flask -- route修饰器源码
- Proxy代理模式
- 解决浏览器会自动填充用户名密码的问题
- 个性化学习之自适应测试[Adaptive Test]
- Python小结
- 一个简单的html测试tomcat本地服务器的问题处理一
- 输入检查
- android focus查找 方向键如何查找focus