Articles of linux kernel

在Process Stack中有thread_struct的意义

想知道为什么thread_struct是Linux中Process Stack的一部分。 罗伯特·洛夫说,它可能在进程栈的最低内存地址。 1)为什么我们需要把它放在Process Stack的第一位? 2)如果我们需要把它放在进程堆栈的固定地址(最低内存地址) – 这是否意味着进程堆栈的大小是固定的?

在NETLINK消息中添加MPLS属性

最新的Linux Kernel 4.1.4支持MPLS数据通路,我们可以通过NETLINK Socket在内核中编写MPLS路由表。 在socket.h中定义了一个新的地址族AF_MPLS。 我试了一些代码来写 – req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); req.n.nlmsg_flags = NLM_F_REQUEST|NLM_F_CREATE; req.n.nlmsg_type = RTM_NEWROUTE; req.r.rtm_family = AF_MPLS; req.r.rtm_table = RT_TABLE_MAIN; req.r.rtm_protocol = RTPROT_BOOT; req.r.rtm_scope = RT_SCOPE_UNIVERSE; req.r.rtm_type = RTN_UNICAST; 但是我无法弄清楚如何在Netlink属性中添加MPLS标签。 请帮我一下

关于Linux中的设备文件

据我所知,Linux中的设备文件不过是用户与实际设备通信的用户界面。 是否有任何其他使用设备文件? 这也意味着如果用户不需要与真实设备通信,我们不需要设备文件? 他们也倾向于将每个真实的设备build模为字符或块或networking设备。 这是真的?

uclinux和设备驱动程序的必要性

通常无MMU的系统也没有MPU(内存保护单元),用户和内核模式之间也没有区别。 在这种情况下,假设我们有一个MMUless的系统和一些映射到CPU地址空间的硬件,那么在内核中是否有设备驱动程序是非常有意义的,如果所有的硬件资源都可以从用户空间访问? 内核代码是否对内存拥有更多的控制权,然后是用户代码?

请问使用Linux Kernel支持最新的程序?

有许多Linux发行版。 所有这些都有一个共同点:内核。 而Linux程序遍布所有这些程序。 如果我从内核做一个简约的发行版,现在的Linux程序是否会运行? 什么定义了分布的差异? 我是这个东西的初学者,不要苛刻,如果这是一个愚蠢的问题。 谢谢

如何用可加载模块修改Linuxnetworking堆栈?

对于一个项目,我们要修改所有在networking栈上移动的数据。 理想情况下,这应该与协议无关,并应无缝融入“正常”networking堆栈。 基本上,每个数据位必须首先在我们的设备上路由,然后再传递给networking堆栈的其余部分。 在这幅图中,设备应该位于第二层和第三层之间的某处。 我的第一个想法是修改socket.c中的代码( 该图显示了networking数据的常用内核stream程 ),在继续进行正常操作之前先将数据写入我们的设备,但是最好能够加载此function以一个内核模块为例),所以用户可以把它关掉,如果他想。 所以我的问题是:有什么办法可以编写内核模块插入到networking堆栈来获取和修改传入和传出的数据? 提前感谢!

Mmap不能分配超过2GB的连续数据

我在用大量内存的64位机器上用mmap分配超过2GB的连续内存时遇到了困难。 下面的代码愉快地运行。 但是,当连续mmap'ed页面的数量增加到略高于2GB mmap在我的机器上失败。 #include <sys/mman.h> #include <stdio.h> #include <signal.h> #include <stdlib.h> #include <time.h> #include <errno.h> #include <unistd.h> #define PAGE_SIZE (4*1024) #define START_ADDRESS 0x8000000 #define START_ADDRESS2 0x800000000 #define N_ITERATIONS 524288 // one more iteration and mmap fails //#define N_ITERATIONS 524289 void allocate(void* base_address) { int i; for (i = 0; i < N_ITERATIONS; ++i) { […]

getnameinfo – 在Linux中它是什么系统调用?

有一个函数https://linux.die.net/man/3/getnameinfo我怎么知道它的系统调用是什么? Linux系统调用表中没有这样的function。 还是只存在于C库?

为什么ioctl调用不会传递给sys_ioctl?

我有内核模块(4.4.32内核),它通过分配它的ioctl处理程序来struct file_operations的unlocked_ioctl指针来实现ioctl调用。 所有的工作正常,但我被给予程序(仅用于二进制),编译为2.6或2.4内核,如果我在我的4.4.32上启动这个程序不会使内核注册到我的模块的ioctl调用。 因为这个程序是在较旧的内核上编译的,所以它使用了旧的ioctl接口,即file_operations结构中的ioctl指针,而不是unlocked_ioctl 。 较旧的程序创build一个与用户进行视觉交互的控制台,并且必须从根控制台以root身份运行。 我对该程序进行了testing,并检查程序是否接收到第二个ioctl的ENOTTY ,所以我编写了testing程序,使相同的ioctl调用到故障程序所执行的内核模块。 我已经validation了stracelogging的跟踪对于这两个ioctl的两个程序是相同的,也就是说,用相同的参数调用这个跟踪。 我的testing程序的相关部分是: /*————————— ((( STEP 1 ))) —————————*/ hsdfd1 = open(PCIHSD0, O_RDWR); if (hsdfd1 < 0) { fprintf(stderr, "Error on OPEN, can't open [%s] [%s]", PCIHSD0, strerror(errno)); exit(1); } /*————————— ((( STEP 2 ))) —————————*/ uint8_t xsts; err = ioctl(hsdfd1, HSDGETXSTS, &xsts); if (err < 0) { […]

linux内核源代码中__section()是什么意思?

我在一些操作系统内核中看到下面的代码。 但是我不明白__section的使用方式,不知道这个代码是什么意思。 #define KEEP_PAGER(sym) \ extern const unsigned long ____keep_pager_##sym; \ const unsigned long ____keep_pager_##sym \ __section("__keep_meta_vars_pager") = (unsigned long)&sym