Questions tagged «kernel»

在计算中,内核是一种计算机程序,用于管理来自软件的输入/输出请求,并将其转换为用于中央处理器和计算机其他电子组件的数据处理指令。内核是现代计算机操作系统的基本组成部分。该标签用于有关在操作系统内核的上下文中运行的代码的一般问题。

28
操作系统开发有哪些入门资源?[关闭]
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 5年前关闭。 我一直想做的一件事就是开发自己的操作系统(不一定像Linux或Windows那样花哨,但比我已经做过的简单启动加载程序要好)。 我很难找到使您摆脱编写简单的“ Hello World” OS的资源/指南。 我知道很多人可能会建议我看一下Linux或BSD。但是此类系统的代码库很大(大概)很大,我不知道从哪里开始。 有什么建议么? 更新:为了使通过Google登陆本文的人们更加容易,这里提供了一些操作系统开发资源: 编写自己的操作系统(感谢亚当) Linux从零开始(感谢John) SharpOS(C#操作系统)(感谢lomaxx) Minix3和Minix2(感谢Mike) OS Dev Wiki和论坛(感谢Steve) BonaFide(感谢Steve) 布兰(感谢史蒂夫) 推出自己的玩具UNIX克隆操作系统(感谢Steve) 破碎的刺操作系统开发系列 其他资源: 我找到了一个很好的资源,名为MikeOS,“ MikeOS是一个学习工具,用于演示简单OS的工作方式。它使用16位实模式进行BIOS访问,因此不需要复杂的驱动程序” 更新了11/14/08 我在Freebyte的...免费和非免费操作系统指南中找到了一些资源,这些资源链接到OSKit和ExOS库等工具包。这些对于开始OS开发非常有用。 更新于2/23/09 Ric Tokyo在这个问题上推荐了nanoos。Nanoos是用C ++编写的操作系统。 更新3/9/09 Dinah为有抱负的OS开发人员提供了一些有用的Stack Overflow讨论:创建自定义操作系统的障碍讨论了在开发OS时可能遇到的陷阱,而OS开发是一个更笼统的讨论。 更新了7/9/09 LB提供了指向Pintos项目的链接,该项目是为学生学习OS开发而设计的教育OS。 更新时间:2009年7月27日(仍然有效!) 我偶然发现了Berkley 的在线OS课程,其中包含23个讲座。 TomOS是MikeOS的分支,其中包括一点内存管理器和鼠标支持。作为MikeOS,它被设计为一个教育项目。它是用NASM汇编程序编写的。 更新了8/4/09 我找到了幻灯片和其他材料,以及上面列出的在线伯克利讲座。 更新了8/23/09 在stackoverflow上标记了osdev的所有问题 OS / 161是用c编写的学术OS,可在模拟硬件上运行。此操作系统在Nachos中类似。感谢Novelocrat! …




4
cscope或ctags为什么要选择一个?[关闭]
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使其成为Stack Overflow 的主题。 10个月前关闭。 改善这个问题 我主要使用vim / gvim作为编辑器,并且正在考虑结合使用lxr(Linux交叉参考)和cscope或ctags来探索内核源代码。但是,我从未使用过cscope或ctags,并且想听听为什么考虑到我将vim用作主要编辑器时,一个人可能会选择一个而不是另一个。
130 vim  kernel  ctags  cscope 



6
__gxx_personality_v0的作用是什么?
这是一个来自OS开发站点的二手问题,但是由于我在任何地方都找不到合适的解释,这使我感到好奇。 使用gcc编译和链接独立的C ++程序时,有时会发生如下链接错误: out/kernel.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0' 这显然是因为该符号是在libstdc ++中定义的,而在独立环境中则缺少该符号。解决问题仅需在以下位置定义此符号: void *__gxx_personality_v0; 哪个很好,但是我不喜欢魔术般工作的东西...所以问题是,这个符号的目的是什么?
103 c++  gcc  linker  kernel 

1
[N…M]在C聚合初始化程序中是什么意思?
从sys.c第123行: void *sys_call_table[__NR_syscalls] = { [0 ... __NR_syscalls-1] = sys_ni_syscall, #include <asm/unistd.h> }; sys_call_table是指向数组的通用指针,我可以看到这一点。但是,表示法是什么: [0 ... __NR_syscalls-1] 什么是...? 编辑: 我在这里学到了另一个C技巧:#include <asm/unistd.h>将被预处理并替换为其内容并分配给[0 ... _NR_syscalls-1]。
101 c  linux  kernel 


3
在新的Linux内核中,上下文切换要慢得多
我们希望将服务器上的操作系统从Ubuntu 10.04 LTS升级到Ubuntu 12.04 LTS。不幸的是,运行已变为可运行线程的等待时间似乎从2.6内核大大增加到3.2内核。实际上,我们难以置信的延迟数字。 让我更具体地介绍一下测试。我们有一个运行两个线程的程序。第一个线程获取当前时间(使用RDTSC进行滴答),然后每秒发送一次条件变量信号。第二个线程等待条件变量,并在发出信号时唤醒。然后,它获取当前时间(使用RDTSC进行滴答)。计算第二个线程中的时间和第一个线程中的时间之间的时差,并将其显示在控制台上。此后,第二个线程再次等待条件变量。大约经过一秒钟后,第一个线程将再次发出信号。 因此,简而言之,我们每秒通过条件变量等待时间测量获得线程到线程的通信。 在内核2.6.32中,此延迟约为2.8-3.5 us,这是合理的。在内核3.2.0中,此延迟已增加到40-100 us左右。我排除了两台主机之间的硬件差异。它们在相同的硬件上运行(双插槽X5687 {Westmere-EP}处理器以3.6 GHz运行,具有超线程,speedstep和所有C状态均已关闭)。测试应用程序更改了线程的亲和力,以便在同一套接字的独立物理内核上运行它们(即,第一个线程在Core 0上运行,第二个线程在Core 1上运行),因此在该线程上不会发生线程跳动核心或套接字之间的跳动/通信。 这两台主机之间的唯一区别是,一台主机运行的内核版本为2.6.32-28(快速上下文切换框),而另一台则运行最新的Ubuntu 12.04 LTS内核为3.2.0-23版本(慢上下文)。开关盒)。所有BIOS设置和硬件均相同。 内核中是否有任何变化可以解释线程调度运行需要多长时间的可笑速度减慢? 更新: 如果您想在您的主机和Linux构建上运行测试,我已将代码发布到pastebin供您阅读。编译: g++ -O3 -o test_latency test_latency.cpp -lpthread 运行(假设您至少有一个双核计算机): ./test_latency 0 1 # Thread 1 on Core 0 and Thread 2 on Core 1 更新2:在大量搜索内核参数,发布有关内核更改和个人研究的文章之后,我已经弄清了问题所在,并发布了解决方案作为对此问题的解答。

8
Linux进程状态
在Linux中,当需要从磁盘读取块时,进程状态会发生什么变化?被封锁了吗?如果是这样,如何选择另一个流程来执行?
89 linux  process  kernel  cpu  states 

2
什么是vdso和vsyscall?
我做了 sudo cat /proc/1/maps -vv 我试图弄清楚输出,可以看到很多共享库都按预期映射到了内存映射段。 7f3c00137000-7f3c00179000 r-xp 00000000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c00179000-7f3c00379000 ---p 00042000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c00379000-7f3c0037a000 r--p 00042000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c0037a000-7f3c0037b000 rw-p 00043000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c0037b000-7f3c00383000 r-xp 00000000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00383000-7f3c00583000 ---p 00008000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00583000-7f3c00584000 r--p 00008000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00584000-7f3c00585000 rw-p …
89 c  linux  linux-kernel  kernel  vdso 

7
有没有办法弄清楚正在使用Linux内核模块的原因?
如果加载内核模块并使用列出加载的模块lsmod,则可以获取该模块的“使用计数”(其他模块的数量以及对该模块的引用)。但是,有没有办法弄清楚正在使用什么模块? 问题是我正在开发的模块坚持认为其使用计数为1,因此无法使用rmmod其卸载,但是其“ by”列为空。这意味着每次我想重新编译并重新加载模块时,都必须重新引导计算机(或者,至少,我找不到其他方法来卸载它)。

3
上下文切换内部
我想借助这个问题来学习并弥补我的知识空白。 因此,用户正在运行一个线程(内核级),并且现在正在调用yield(我认为是系统调用)。现在,调度程序必须将当前线程的上下文保存在TCB中(该线程存储在内核中的某个位置),并选择另一个线程来运行并加载其上下文并跳转至CS:EIP。为了缩小范围,我正在研究在x86体系结构上运行的Linux。现在,我想详细介绍一下: 因此,首先我们有一个系统调用: 1)的wrapper函数yield会将系统调用参数推入堆栈。推送返回地址,并通过将系统调用号推送到某个寄存器(例如EAX)引发中断。 2)中断将CPU模式从用户更改为内核,并跳转到中断向量表,并从那里跳转到内核中的实际系统调用。 3)我猜想调度程序现在被调用,现在它必须将当前状态保存在TCB中。这是我的困境。因为,调度器将使用内核堆栈,而不是用于执行其操作(这意味着该用户堆栈SS和SP已被改变),它是如何存储的用户的状态,而不会在该过程修改任何寄存器。我在论坛上已经读到有一些用于保存状态的特殊硬件说明,但是调度程序如何访问它们,谁来运行这些说明以及何时运行? 4)现在,调度程序将状态存储到TCB中并加载另一个TCB。 5)当调度程序运行原始线程时,控件返回到包装器函数,该函数清除堆栈并恢复线程。 附带问题:调度程序是否以仅内核线程(即只能运行内核代码的线程)运行?每个内核线程或每个进程是否有单独的内核堆栈?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.