Articles of kernel

如何将matrix_keypad.h文件用于自定义键盘驱动程序?

我可以用input_dev来模拟一个自定义键盘(来自input.h) //an example with just one key. button_dev = input_allocate_device(); if (!button_dev) { printk(KERN_ERR "button.c: Not enough memory\n"); error = -ENOMEM; goto err_free_irq; } button_dev->evbit[0] = BIT_MASK(EV_KEY); button_dev->keybit[BIT_WORD(BTN_0)] = BIT_MASK(BTN_0); 或者我将不得不使用matrix_keypad头文件?如果是,那么如何?

从内核读取使用procfs的时间戳 – 从内核读取后存储在哪里?

当中断发生在内核和如果我正在读取内核中的时间戳。 我正在通过procfs从内核读取用户的时间戳。 中断时间值将被存储在哪里? 用户应该如何从用户空间读取该值? ssize_t dev_read(struct file *filp,const char *buf,size_t count,loff_t *offset) { if ( count < sizeof(InterruptTime) ) { // Not enough space provided. return 0; // Or some error code maybe. } if (copy_to_user(buf,&InterruptTime,sizeof(InterruptTime)) { return -EFAULT; } else { return sizeof(InterruptTime); // Number of bytes we copied. } } 这是我在/linuxversion/net/core/dev.c中修改的代码 int netif_rx(struct […]

套接字事件如何传播/转换为epoll?

我很好奇epoll_wait()是如何收到一个注册套接字(带有epoll_ctl())准备好读/写的事件。 我相信glibc神奇地处理它。 那么,是否有一个文档描述了如何为套接字触发以下事件? EPOLLPRI EPOLLRDNORM EPOLLRDBAND EPOLLWRNORM EPOLLWRBAND EPOLLMSG EPOLLERR EPOLLHUP EPOLLRDHUP PS最初我试图将枚举EPOLL_EVENTS粘贴到我的盒子的sys / epoll.h中; stackoverflow认为,我不正确格式化代码块,虽然我用pre包装,然后代码标签,任何想法?

Linux内核模块/ IOCTL:不适用于设备的ioctl

我正在编写一个作为伪驱动程序的Linux内核模块(LKM) – 我无法弄清楚如何在LKM( wait.c )和用户级程序( user.c )之间进行IOCTL调用)。 设备驱动程序的幻数是0xBF – LKM不与物理块/字符设备通信,这只是一个练习。 从我所知道的情况来看,调用KERN_IOCTL_CREATE_EVENT的IOCTL格式不正确,幻数也不正确。 我尝试使用的IOCTL调用是: #include <sys/ioctl.h> #define KERN_IOCTL_CREATE_EVENT _IOWR(WAIT_DEVICE_MAGIC, 1, int) int main(){ int ret; int fd; fd = open("/dev/wait", 0); if(fd < 0){ return -1; } ret = ioctl(fd, KERN_IOCTL_CREATE_EVENT, 0); 错误: [fail]: KERN_IOCTL_CREATE_EVENT: Inappropriate ioctl for device 用户模式应用程序可以打开/closures指向设备的文件描述符: /dev/wait但case / switch语句不接受IOCTL调用。 有什么build议么? 这是# uname -a的输出 […]

Hello World是Raspberry Pi 3上常用的时钟框架驱动程序

我正在尝试为通过I2C连接到Raspberry PI 3的时钟编写通用时钟框架驱动程序。 注:我对Linux和内核编程都很新。 更新:成功! 下面的代码适用于Hello World驱动程序,为了让我的驱动程序加载,我必须对设备树进行的唯一更改是添加i2c1节点的子节点(位于arch / arm / boot / dts / bcm2708_common.dts ): i2c1: i2c@7e804000 { compatible = "brcm,bcm2708-i2c"; reg = <0x7e804000 0x1000>; interrupts = <2 21>; clocks = <&clk_core>; #address-cells = <1>; #size-cells = <0>; status = "disabled"; myclock: clock-generator@6a { #clock-cells = <0>; compatible = "dbc,myclock"; reg = <0x6a>; clock-frequency […]

使用可加载的内核模块修改framebuffer(/ dev / graphics / fb0)参数

问题:我必须configurationAndroid平台使用的各种LCD显示器。 几乎在所有情况下都没有关于液晶显示器的免费电气规格。 但是通过经验和逆向工程,参数可以被合理地猜测出来。 我正在尝试使用可加载的内核模块来微调显示参数(任何其他build议也欢迎)。 请在下面find相关信息。 硬件:爱特梅尔SAMA5D31-EK(ARM 5处理器) SW: Andriod Linux(目标),Ubuntu(主机系统),Sourcery CodeBench(交叉编译器)代码片段,从board-dt.c文件 static struct fb_videomode at91_tft_vga_modes[] = { ….. .xres =435; .yres =235; …. } static struct fb_monspecs at91fb_default_monspecs = { ……… .modedb = at91_tft_vga_modes, …… } static struct atmel_lcd_fb_info __initdata ek_lcdc_data = { ………. .default_monspecs = & at91fb_default_monspecs; ……… } 我添加了这个代码,所以可加载的内核模块可以访问lcdc_data结构 extern void set_fb_video(struct fb_videomode […]

for_each_process – 它是否迭代线程和进程?

我想迭代内核中的所有任务(线程和进程),并使用for_each_processmacros打印tid / pid和名称: #define for_each_process(p) \ for (p = &init_task ; (p = next_task(p)) != &init_task ; ) 我怎样才能区分线程和进程? 所以我会这样打印: if (p->real_parent->pid == NULL) printk("PROCESS: name: %s pid: %d \n",p->comm,p->pid); else printk("THREAD: name: %s tid: %d \n",p->comm,p->pid);

编译并build立“android”设备的“iw”?

我需要在Android 4.1设备上安装iw无线包。 但我不知道如何和什么是要安装的软件包的版本! 也是需要linux平台才能做到这一点,或者是足够build立和安装在adbshell上的android root设备。 我看到这个链接,但是当我从adbterminal做到这一点,我看到,混帐和一些贝壳找不到? 怎么做 ? 似乎没有人有任何想法?

如何在Linux内核中打印当前线程堆栈跟踪?

我希望能够在Linux内核中打印一个线程的堆栈跟踪。 具体来说:我想添加代码到特定的函数(例如swap_writepage() ),这将打印线程的完整堆栈跟踪,这个函数被调用。 像这样的东西: int swap_writepage(struct page *page, struct writeback_control *wbc) { /* code goes here to print stack trace */ int ret = 0; if (try_to_free_swap(page)) { unlock_page(page); goto out; } if (frontswap_store(page) == 0) { set_page_writeback(page); unlock_page(page); end_page_writeback(page); goto out; } ret = __swap_writepage(page, wbc, end_swap_bio_write); out: return ret; } 我的故事:最近,Linux内核开发人员在改进内核时采用了面向对象的原则,这是用C语言编写的。由于C不是面向对象的语言,所以开始看起来非常难看,难以理解,可以分析C代码的IDE。 我不想在debugging器下开始运行Linux。 注意:如果你是一个内核开发新手,想要在debugging器下运行Linux,不要付出努力…这将被certificate是徒劳无功的(步调毫无意义)。

在用户空间启用写入组合IO访问

我有一个用户空间驱动程序的PCIe设备。 我通过BAR向设备写入命令,这些命令对延迟敏感,数据量很小(〜64字节),所以我不想使用DMA。 如果我使用ioremap_wc重新映射内核中BAR的物理地址,然后将64字节写入内核中的BAR,则可以看到64字节被写为单个PCIe上的TLP。 如果我允许我的用户空间程序使用MAP_SHARED标志MAP_SHARED区域,然后写入64字节,则在PCIe总线上看到多个TPL,而不是单个事务。 根据内核PAT文档,我应该能够将写入组合的页面导出到用户空间: 希望将某些页面导出到用户空间的驱动程序通过使用mmap界面和其组合来完成 1) pgprot_noncached() 2) io_remap_pfn_range()或remap_pfn_range()或vm_insert_pfn() 通过PAT支持,正在添加一个新的API pgprot_writecombine 。 因此,驱动程序可以继续使用上述顺序,在步骤1中使用pgprot_noncached()或pgprot_writecombine() ,然后使用步骤2。 基于这个文档,从我的mmap处理程序相关的内核代码如下所示: vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); return io_remap_pfn_range(vma, vma->vm_start, info->mem[vma->vm_pgoff].addr >> PAGE_SHIFT, vma->vm_end – vma->vm_start, vma->vm_page_prot); 我的PCIe设备在lspci中显示,BAR按预期标记为可预取: Latency: 0, Cache Line Size: 64 bytes Interrupt: pin A routed to IRQ 11 Region 0: Memory at d8000000 (64-bit, prefetchable) [size=32M] Region 2: Memory […]