标签: kernel

在虚拟盒中调试客户操作系统的工具

我刚刚在virtualbox.org上发布了同样的问题.http://forums.virtualbox.org/viewtopic.php?f=9&t=26702&p=119139#p119139

如果没有违反任何规则,我会更加关注它,因为stackoverflow承诺更有活力!

"嗨,我做了一些搜索,找不到任何工具来从虚拟框中的早期启动调试来宾系统.虽然,我遇到了JCP,一个java中的x86模拟器,它不是那么强大和美观但是有一个调试模式在可以查看物理内存的地方,CPU可以注册其他内容.它还可以逐步执行CPU指令并设置断点,观察点和条件点.虚拟盒中有这样的东西吗?

我认为拥有它并且能够在运行时检查系统会很棒.了解PC架构或作为开发内核的工具.

在你认为它的好主意(我认为是)的情况下如何实现?我有兴趣开发这样的东西,并想知道它是否可行,如果还没有实现的话."

EDT:现代x86是否能够在cpu周期之后中断其执行并将执行地址传递给另一个代码来执行此操作?是的,可以设置陷阱标志以使处理器处于逐步执行模式.x86将执行一条指令并调用INT 3.

debugging assembly kernel virtualbox emulation

12
推荐指数
2
解决办法
1万
查看次数

在核心生成期间压缩核心文件

在linux 2.6.x中,有没有办法在核心转储生成过程中压缩核心文件?基本上,存储空间在我们的系统中是有限的,因此我们无法生成完整的核心文件然后gzip相同.

问候,Prabhakar

linux kernel

12
推荐指数
1
解决办法
8395
查看次数

为什么使用Visual Studio构建驱动程序"不好"?

Microsoft Visual Studio的链接器有一个/DRIVER专门用于构建驱动程序标志:

使用/DRIVER链接器选项构建Windows NT内核模式驱动程序.

不过,微软表示:

您不能使用Microsoft Visual Studio提供的编译器或链接器来构建驱动程序.

这引出了一个问题:

为什么我不能使用Visual Studio编译/链接驱动程序?

DDK/WDK工具生成的输出是否与Visual Studio生成的输出不同?
如果是这样,它有什么不同?


编辑:

请注意,我在谈论使用Visual Studio的编译器链接器,而不是库!

我在VS的编译器和链接器中使用了WDK头文件和库,但是Microsoft 特别指出我需要避免这种情况:

您不能使用Microsoft Visual Studio提供的编译器链接器来构建驱动程序.

他们甚至没有提到标题和库,所以当然这不是我的问题.

为什么?

kernel build driver visual-studio visual-c++

12
推荐指数
1
解决办法
1042
查看次数

为什么我们需要list_for_each_safe()来删除内核链表中的节点?

我正在学习如何使用list.h中的内核链表API .

我了解到我需要list_for_each_safe()在删除节点时使用list_del()而不是使用list_for_each().

代码list_for_each_safe():

#define list_for_each_safe(pos, n, head) \
    for (pos = (head)->next, n = pos->next; pos != (head); \
        pos = n, n = pos->next)
Run Code Online (Sandbox Code Playgroud)

代码list_for_each():

    for (pos = (head)->next; pos != (head); pos = pos->next)
Run Code Online (Sandbox Code Playgroud)

我注意到它们都非常相似,只是_safe版本需要额外的参数用作"临时存储"(在此声明为list.h).

我知道什么时候应用函数correcly,_safe版本删除,正常版本访问,但我很好奇额外的论点如何使它"安全"?

请考虑以下内容,我将删除链接列表中的每个节点list_for_each_safe():

struct kool_list{
    int to;
    struct list_head list;
    int from;
    };

struct kool_list *tmp;
struct list_head *pos, *q;
struct kool_list mylist; …
Run Code Online (Sandbox Code Playgroud)

c foreach kernel linked-list linux-kernel

12
推荐指数
1
解决办法
1万
查看次数

mmap比ioremap慢

我正在开发运行Linux 2.6.37的ARM设备.我试图尽可能快地切换IO引脚.我制作了一个小内核模块和一个用户空间应用程序.我尝试了两件事:

  1. 使用直接从内核空间操作GPIO控制寄存器ioremap.
  2. mmap() GPIO控制寄存器无需缓存并从用户空间使用它们.

两种方法都有效,但第二种方法比第一种方法慢3倍(在示波器上观察).我想我禁用了所有缓存机制.

当然,我想要充分利用这两个领域:从内核空间的速度来看,用户空间的灵活性和易开发性.

有谁知道为什么mmap()可能比这慢ioremap()

这是我的代码:

内核模块代码

static int ti81xx_usmap_mmap(struct file* pFile, struct vm_area_struct* pVma)
{
  pVma->vm_flags |= VM_RESERVED;
  pVma->vm_page_prot = pgprot_noncached(pVma->vm_page_prot);

  if (io_remap_pfn_range(pVma, pVma->vm_start, pVma->vm_pgoff,
                          pVma->vm_end - pVma->vm_start, pVma->vm_page_prot))
     return -EAGAIN;

  pVma->vm_ops = &ti81xx_usmap_vm_ops;
  return 0;
}

static void ti81xx_usmap_test_gpio(void)
{
  u32* pGpIoRegisters = ioremap_nocache(TI81XX_GPIO0_BASE, 0x400);
  const u32 pin = 1 << 24;
  int i;

  /* I should use IO read/write functions instead of pointer deferencing, 
   * but portability isn't …
Run Code Online (Sandbox Code Playgroud)

linux kernel mmap gpio

12
推荐指数
1
解决办法
6004
查看次数

在内核套接字编程中模拟select()和poll()的效果

我正在开发的一个Linux内核驱动程序是在内核中使用网络通信(sock_create(),sock->ops->bind()等等).

问题是将有多个套接字从中接收数据.所以,我需要的东西,将模拟select()poll()在内核空间.由于这些函数使用文件描述符,我不能使用系统调用,除非我使用系统调用来创建套接字,但这似乎是不必要的,因为我在内核中工作.

所以我想sock->sk_data_ready在我自己的handler(custom_sk_data_ready())中包装默认处理程序,这将解锁一个信号量.然后我可以编写自己的kernel_select()函数来尝试锁定信号量并进行阻塞等待直到它打开.这样,内核函数就会进入休眠状态,直到信号量被解锁为止custom_sk_data_ready().一旦kernel_select()获得锁定,它就会解锁并调用custom_sk_data_ready()重新锁定它.所以唯一额外的初始化是custom_sk_data_ready()在绑定套接字之前运行,这样第一次调用custom_select()就不会错误地触发.

我看到一个可能的问题.如果发生多个接收,则多次调用custom_sk_data_ready()将尝试解锁信号量.因此,为了不丢失多个调用并跟踪sock正在使用的调用,必须有一个表或指向正在使用的套接字的指针列表.并且custom_sk_data_ready()必须在表/列表中标记它传递的套接字.

这种方法听起来好吗?或者,在使用标准系统调用时,我是否应该努力解决用户/内核空间问题?

初步调查结果:

sock结构中的所有回调函数都在中断上下文中调用.这意味着他们无法入睡.为了允许主内核线程在就绪套接字列表上休眠,使用互斥锁,但custom_sk_data_ready()必须像互斥锁上的自旋锁一样(mutex_trylock()重复调用).这也意味着任何动态分配都必须使用该GFP_ATOMIC标志.


附加可能性:

对于每个打开的套接字,用sk_data_ready()自定义的套接字替换每个套接字(custom_sk_data_ready())并创建一个worker(struct work_struct)和工作队列(struct workqueue_struct).process_msg()每个工人都将使用一个常用功能.创建一个内核模块级全局列表,其中每个列表元素都有一个指向套接字的指针并包含工作者结构.当数据在套接字上准备就绪时,custom_sk_data_ready()将执行并找到具有相同套接字的匹配列表元素,然后queue_work()使用list元素的工作队列和worker 进行调用.然后process_msg()调用该函数,并且可以通过struct work_struct *参数的内容(地址)找到匹配的列表元素,或者使用container_of()宏来获取包含工作者结构的列表结构的地址.

哪种技术最健全?

sockets linux networking kernel system-calls

12
推荐指数
1
解决办法
2652
查看次数

为什么munmap需要长度作为参数?

我在想,为什么映射内存的大小是一个参数传入的,因为从同一个地址开始不能有多个映射(可​​能吗?),为什么linux内核不会记录起始地址,长度一起,但让用户空间程序记住它们.

我的意思是,为什么不是这样,只需使用起始地址作为主键来存储信息树.

linux kernel mmap

12
推荐指数
2
解决办法
6217
查看次数

如何使一个Linux内核函数可用于ftrace function_graph tracer?

我想在内核启动过程中使用ftrace跟踪一个函数,function_graph以了解它的作用,但是它不可用available_filter_functions.

我试图将其导出EXPORT_SYMBOL(),猜测它会使它可用,但事实并非如此.

你有解决方案吗 ?

有关信息,功能我想跟踪是persistent_ram_init_ringbufferpersistent_ram_early_init在内核的Android 3.4.

我仔细阅读了文档,但没有发现任何内容,grep没有帮助更多......

谢谢

linux android kernel ftrace

12
推荐指数
1
解决办法
4415
查看次数

如何在linux内核中使用lockdep功能进行死锁检测

我有一个Linux内核驱动程序和一个与之交互的用户应用程序.内核驱动程序中存在死锁.我在Linux内核中遇到了这个名为" lockdep "的功能.我能够配置它并重新编译我的内核(我确实在/ proc中看到了lockdep文件夹).但我不知道如何推断此工具的输出或如何使用此工具调试驱动程序.任何帮助将非常感谢.谢谢!

c linux kernel deadlock linux-kernel

12
推荐指数
1
解决办法
2万
查看次数

打破用户空间意味着什么?

这可能是一个简单的问题但是,我听说在内核上工作的唯一规则就是不要破坏"用户空间".所以我想知道这意味着什么:打破用户空间以及它是如何发生的?

编辑

我已经向我指出,这个问题并不适合@lurker的Stack Over Flow,因此我会将其移至超级用户,因为@lurker建议.(见下文)

"有关通用计算硬件和软件的问题是Stack Overflow的主题,除非它们直接涉及主要用于编程的工具.您可以获得超级用户的帮助." - 潜伏者,jww,SilentKiller

linux kernel

12
推荐指数
1
解决办法
7092
查看次数