struct file_operations中unlocked_ioctl和ioctl
http://blog.chinaunix.net/uid-20543672-id-3015637.html
ioctl受到大内核锁保护,unlocked_ioctl是无锁直接执行的。unlocked_ioctl优先级高于ioctl,如果存在unlocked_ioctl,则执行unlocked_ioctl,否则才执行ioctl。这个优先级的产生明显是为了过渡。
内核空间和用户空间交换数据
https://blog.csdn.net/yxtxiaotian/article/details/83987798
在内核空间和用户空间交换数据时,get_user和put_user是两个常用的函数。相对于copy_to_user和copy_from_user(将在另一篇博客 linux内核中的copy_to_user和copy_from_user 中分析),这两个函数主要用于完成一些简单类型变量(char、int、long等)的拷贝任务,对于一些复合类型的变量,比如数据结构或者数组类型,get_user和put_user函数还是无法胜任,这两个函数内部将对指针指向的对象长度进行检查,在arm平台上只支持长度为1,2,4,8的变量。
驱动绑定设备名
驱动ioctl函数中绑定的设备是事先通过注册设备名、Major_num等属性进行绑定。
kretprobe
https://blog.csdn.net/luckyapple1028/article/details/54782659
kprobes
https://blog.csdn.net/luckyapple1028/article/details/52972315
CONFIG_STRICT_DEVMEM
http://oliveryang.net/2017/03/linux-kernel-memory-hacking/
系统默认打开了 CONFIG_STRICT_DEVMEM 编译选项,从而限制了 /dev/mem (/dev/mem设备可以用来访问物理内存)驱动的使用。CONFIG_STRICT_DEVMEM的限制主要依赖于devmem_is_allowed的返回值。
不重新编译内核,利用kretprobe使得devmem_is_allowed函数返回永远是 1,便可以轻松绕过这个限制。
misc_register、 register_chrdev区别
https://blog.csdn.net/lanmanck/article/details/4713978
SGX调试模式读写内存
SGX-Step的做法是使用isgx注册的access_process_vm
//access_process_vm will use the ”struct vm_operations_struct” defined by the isgx driver
(apvm_t) kallsyms_lookup_name("access_process_vm"));
kallsyms_lookup_name
kallsyms_lookup_name()在kernel/kallsyms.c文件中定义的,要使用它必须启用CONFIG_KALLSYMS编译内核
kallsyms_lookup_name()接受一个字符串格式内核函数名,返回那个内核函数的地址。
kallsyms_lookup_name("函数名");
http://blog.chinaunix.net/uid-24467128-id-3919206.html
TLB刷新
__flush_tlb_all刷新控制寄存器%%cr3为0, TLB中的所有项将自动失效
https://blog.csdn.net/kernel_details/article/details/1484641