标签: linux-kernel

从内核模块的结构中删除填充

我正在使用标准命令编译一个内核模块,其中包含大小为 34 的结构。

make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
Run Code Online (Sandbox Code Playgroud)

将以sizeof(some_structure)36 而不是 34 的形式出现,即编译器正在填充结构。

如何删除此填充?

运行make V=1显示 gcc 编译器选项传递为

make -I../inc -C /lib/modules/2.6.29.4-167.fc11.i686.PAE/build M=/home/vishal/20100426_eth_vishal/organised_eth/src modules

make[1]: Entering directory `/usr/src/kernels/2.6.29.4-167.fc11.i686.PAE'
test -e include/linux/autoconf.h -a -e include/config/auto.conf || (  \
 echo;        \
 echo "  ERROR: Kernel configuration is invalid.";  \
 echo "         include/linux/autoconf.h or include/config/auto.conf are missing."; \
 echo "         Run 'make oldconfig && make prepare' on kernel src to fix it."; \
 echo;        \
 /bin/false)

mkdir -p /home/vishal/20100426_eth_vishal/organised_eth/src/.tmp_versions ; …
Run Code Online (Sandbox Code Playgroud)

gcc makefile packing kernel-module linux-kernel

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

显示子系统中需要 vblank

我不清楚显示面板上垂直空白(vblank )的使用。

有人可以解释一下吗

  • vblank的意义?
  • 如何在显示子系统中使用它?

android linux-kernel vsync

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

ldrex / strex如何使ARM中的atomic_add成为原子操作?

根据http://lxr.free-electrons.com/source/arch/arm/include/asm/atomic.h#L31

 static inline void atomic_add(int i, atomic_t *v)
 41 {
 42         unsigned long tmp;
 43         int result;
 44 
 45         prefetchw(&v->counter);
 46         __asm__ __volatile__("@ atomic_add\n"
 47 "1:     ldrex   %0, [%3]\n"
 48 "       add     %0, %0, %4\n"
 49 "       strex   %1, %0, [%3]\n"
 50 "       teq     %1, #0\n"
 51 "       bne     1b"
 52         : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)
 53         : "r" (&v->counter), "Ir" (i)
 54         : "cc");
 55 }
Run Code Online (Sandbox Code Playgroud)

可以抢占,怎么能叫“原子”呢?

arm atomic inline-assembly linux-kernel load-link-store-conditional

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

用于从 USB 设备获取连续 HID 报告的 Linux 命令/工具

lsusb -v给出 USB 设备的设备描述符信息。Linux 中是否有任何命令/工具可以为我们提供来自 USB HID 设备的连续 HID 输入报告?

android hid linux-kernel

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

生成 Linux 模块的 tarball?

我正在开发一个嵌入式 Linux 发行版,目前我必须与我的团队共享内核及其内核模块。通常我会使用 Yocto/Openembedded 框架,但现在我只能使用 Linux Makefile。有没有办法生成内核模块的 tarball?

linux kernel linux-kernel

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

Linux 中的 create_singlethread_workqueue

我对 Linux 内核开发非常陌生,并且在理解其功能时感到困惑create_singlethread_workqueue()。任何人都可以提供一个基本示例,说明它到底做什么create_singlethread_workqueue()以及它的工作是什么INIT_WORK。从我读到的解释来看,它说它为处理器创建一个队列并初始化工作。但无法理解什么是工作,也无法理解如何通过基本示例来理解。

linux linux-device-driver linux-kernel

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

从内核模块杀死用户空间程序

我只是想知道是否有一种方法可以从内核模块杀死用户空间程序。我知道kill命令不起作用,因为它是从用户空间到内核空间的系统调用。

c kernel-module linux-kernel

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

向 Linux 内核添加一个简单的系统调用

我刚刚向 Linux 内核添加了一个系统调用。它只需要一个char*参数名称并打印 Hello name。

这是系统调用代码:

asmlinkage long sys_hello(char* name) { printk("Hello %s \n", name); return 0; }

这是应该运行系统调用进行测试的代码:

int main() 
{
    long int amma  = syscall(318,"Winston");
    printf("Returned %lu \n" ,amma);  
    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行这个时,我得到了一个被杀死的输出。关于解决这个问题有什么想法吗?提前致谢。

ubuntu system-calls linux-kernel kill-process

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

如何下载 Torvalds Linux Kernel master、(重新)编译它并使用 QEMU 启动它?

几天来,我正在研究一个小项目,以探索内核编程。然而,我在网上看了很多关于内核编译的问题,并在之前问过一个问题,但我在某些时候仍然感到迷茫。

如果我需要进行一些内核编程,我认为使用 Linus Torvalds 的 Linux 源代码将是最好的起点。所以我做了以下操作(来自 MacOS High Sierra):

  • 下载内核源代码:https://github.com/torvalds/linux
  • 解压它
  • 启动终端并运行:
    • vagrant init
    • vagrant up
    • vagrant ssh
  • 连接后,我输入:
    • cd /vagrant/linux 为了进入Linux源解压文件夹
    • make menuconfig 我只是按了确定/保存
    • sudo make -j 4 && sudo make modules_install -j 4 && sudo make install -j 4

现在,我遇到了一个小错误:

agrant @vagrant-ubuntu-trusty-64:/vagrant/Kernel-Programming/linx-kernel$ sudo make -j 4 && sudo make modules_install -j 4 && sudo make install -j 4
  CHK include/config/kernel.release
CHK     include/generated/uapi/linux/version.h
CHK     include/generated/utsrelease.h
CHK     scripts/mod/devicetable-offsets.h
CHK     include/generated/timeconst.h
CHK     include/generated/bounds.h
CHK     include/generated/asm-offsets.h
CALL    scripts/checksyscalls.sh …
Run Code Online (Sandbox Code Playgroud)

linux qemu linux-kernel macos-high-sierra

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

如何为 sysfs 属性创建大量类似的函数?

我的 FPGA 中有一个通用 AXI 从设备,带有多个 I/O 寄存器。我想使用 sysfs 接口访问我的寄存器。对于我想要访问的每个寄存器,我创建一个_show和 一个_store函数,但这会需要很多代码。

static ssize_t writereg0_store(struct device *dev, struct device_attribute                *attr, const char *buf, size_t count) {
    struct axi_register_driver *drv = dev_get_drvdata(dev);
    u32 val;

    if (kstrtou32(buf, 10, &val) != 0)
        return -EINVAL;

    iowrite32(val, drv->reg_base + WRITE_OFFSET + 0);

    return count;

}

static ssize_t writereg0_show(struct device *dev, struct device_attribute *attr, char *buf) {
    struct axi_register_driver *drv = dev_get_drvdata(dev);

    u32 reg;
    reg = ioread32(drv->reg_base + WRITE_OFFSET + 0);

    return sprintf(buf, "0x%x\n", …
Run Code Online (Sandbox Code Playgroud)

c linux linux-device-driver linux-kernel sysfs

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