Tag: linux kernel

如何知道哪个进程分配内存?

我想知道进程分配内存的区域。 我知道我可以使用 cat /proc/pid/status 并且 cat /proc/zoneinfo 这两个命令都没有回答进程分配给内存的位置。 还有其他命令吗? 如果有可以在内核中实现它?

为什么printf显示unsigned int的负值?

可能重复: 带有负值的无符号长整数 我编写了一个内核模块,它可以中断任何系统调用,打印其当前的user_id和传递给系统调用函数的输入参数。 其中一个是sys_ioctl(),如下所示: asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd,unsigned long arg); 这意味着所有输入参数都是无符号的int数。 但是当我打印输入参数时,我得到以下输出: fd=21, cmd=-1072143871 and arg=3202983648 fd=21, cmd=-1072143871 and arg=3202983648 fd=21, cmd=-1072143871 and arg=3202983648 ———- 这是我的函数定义: asmlinkage long our_sys_ioctl(unsigned int fd , unsigned int cmd , unsigned long arg) { uid_t gtuid ; gtuid = getuid_call(); printk (“our_sys_ioctl —> uid = […]

如何获取属于进程的所有页面的列表(linux)

有没有办法获取Linux内核中进程拥有的所有页面的列表? 我需要在这些页面上调用’page_free()’。 请告诉我!!

如何优化U-boot到内核切换代码?

平台:Xilinx Zynq SoC上的ARM Cortex A9上的Linux。 我问了一个问题: 为什么内核启动太晚了 基本上我试图理解,然后最小化这两个事件之间的延迟: [Sat Apr 12 19:33:50.692 2014] Starting kernel … [Sat Apr 12 19:33:50.692 2014] [Sat Apr 12 19:33:51.298 2014] Booting Linux on physical CPU 0x0 第一行告诉控件现在正在给内核,而第二行告诉控件现在是内核并且正在由CPU执行。 从u-boot到内核的这种切换对我们的应用程序来说花费了太多时间。 为了理解这两个事件之间发生了什么,我在下面插入了printf语句: 1- bootm.c 我把以下行放在函数static void boot_jump_linux(bootm_headers_t *images, int flag) } if (!fake) {printf(“above kernel_entry in boot_jump_linux in bootm.c\n”); kernel_entry(0, machid, r2); […]

如何从LKM获取Linux内核的数据段

我正在编写一个涉及tasklist_lock , __bss_start的内核模块。 这些符号不会导出。 我很确定即使没有导出,我们也可以使用kernsym_lookup_name()从文本部分访问符号 参考linux 3.2.28上的自定义模块如何调用print_cpu_info? $ vim System.map … 80017be0 T register_undef_hook 80017c28 T unregister_undef_hook 80017c70 T do_unexp_fiq … 806eb000 D mmlist_lock 806eb040 D tasklist_lock 806eb080 d softirq_vec …. T代表文本符号。 D和d表示数据段符号。 我可以使用kallsyms_lookup_name()访问register_undef_hook()和unregister_undef_hook() kallsyms_lookup_name() 。 但不是tasklist_lock 。 请分享您的知识,以便从内核模块(LKM)访问tasklist_lock 。

我是否可以通过一个进程中的PTE指示物理内存碎片在其他进程中创建适当的PTE?

当我们在Linux中使用函数mmap (,,, MAP_ANON | MAP_SHARED); 然后,对于进程之间的碎片物理内存(分配)的相同区域,分配虚拟内存页(PTE)。 即这些PTE从一个进程的页表复制到另一个进程的页表(具有相同的物理地址分配内存片段序列),这是真的吗? 但是mmap ()需要在fork ()之前完成。 如果我们已经有两个工作进程(即fork () ),那么我们需要为mmap()使用一个文件 。 哪两个函数用于复制两个已经建立的进程之间的PTE机制来创建共享内存? 我可以使用PTE / SGL(分散 – 收集列表)指示已经分配的物理内存片段,通过使用linux-kernel在其他进程中创建适当的PTE,以及如何做到这一点? 我想了解mmap()在较低级别的工作原理。

尝试映射大页面时mmap失败(1GB)

我做了什么:1。用root启用大页面(我的系统支持1MB大页面) $echo 20 > /proc/sys/vm/nr_hugepages 2.将庞大的页面文件系统安装到/ mnt / hugepages $mount -t hugetlbfs nodev /mnt/hugepages 3.在巨大的页面文件系统中创建一个文件 $touch /mnt/hugepages/hello 然后使用mmap将大页面映射到地址0,如下面的代码所示 #define FILE_NAME “/mnt/hugepages/hello” #define PROTECTION (PROT_READ | PROT_WRITE) // page flag #define LENGTH (1024*1024*1024) // huge page size #define FLAGS (MAP_SHARED) //page flag #define ADDR (void *) (0x0UL) //starting address of the page fd = open(FILE_NAME, O_CREAT […]

内核非对称加密中的crypto_akcipher_set_pub_key总是返回错误

我正在研究一个内核模块,它使用内核crypto api的非对称密码,内核版本为4.8.0。 我通过openssl生成非对称密钥对,将它们转换为DER格式(我知道它是BER的一个子集),并将代码编入我的模块。 私钥工作得很好,但是公钥在crypto_akcipher_set_pub_key中总是失败,即使我尝试了更多其他密钥对。 dmesg只是打印: [16891.604718] next_op: pc=0/10 dp=0/161 C=0 J=0 [16891.604721] – match? 30 30 00 [16891.604724] – TAG: 30 158 CONS [16891.604726] next_op: pc=2/10 dp=3/161 C=1 J=0 [16891.604727] – match? 30 02 32 [16891.604729] ASN1: Unexpected tag [m=2 d=4 ot=02 t=30 l=158] [16891.604730] set key error! -74,,,,,0 这是我的问题: A)dmesg是否意味着公钥是错误的? 如何生成内核加密兼容密钥对? B)我找不到内核非对称密码的可用rsa密钥对,即使在Linux / crypto […]

从内核空间中的文件指针获取fd

给定一个struct文件,是否可以在linux内核空间中获取相关的文件描述符? 我正在尝试使用sys_chmod或sys_fchmod更改权限。 一个接受文件描述符,另一个需要来自用户空间的文件名。 我可以弄清楚如何获取文件名但是如何将其转换为用户空间指针? 谢谢

copy_from_user警告大小不可certificate是正确的?

我在编译我的内核模块时遇到了一个警告,我无法解决这个问题。 首先来看看这个简化的代码: #define READ_CHUNK 100u static int _procfs_write(struct file *file, const char *buf, unsigned long count, void *data) { char command[READ_CHUNK]; unsigned long left = count; while (left > 0) { unsigned int amount = left<READ_CHUNK?left:READ_CHUNK; if (copy_from_user(command, buf, amount)) return -EFAULT; buf += amount; left -= amount; /* process buffer */ } return count; […]