Удаление отступов из структуры в модуле ядра

Я собираю модуль ядра, содержащий структуру размером 34, используя стандартную команду.

make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules

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 ; rm -f /home/vishal/20100426_eth_vishal/organised_eth/src/.tmp_versions/*

make -f scripts/Makefile.build obj=/home/vishal/20100426_eth_vishal/organised_eth/src

  gcc -Wp,-MD,/home/vishal/20100426_eth_vishal/organised_eth/src/.eth_main.o.d  -nostdinc -isystem /usr/lib/gcc/i586-redhat-linux/4.4.0/include -Iinclude  -I/usr/src/kernels/2.6.29.4-167.fc11.i686.PAE/arch/x86/include -include include/linux/autoconf.h -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Os -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i686 -mtune=generic -Wa,-mtune=generic32 -ffreestanding -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Iarch/x86/include/asm/mach-generic -Iarch/x86/include/asm/mach-default -Wframe-larger-than=1024 -fno-stack-protector -fno-omit-frame-pointer -fno-optimize-sibling-calls -g -pg -Wdeclaration-after-statement -Wno-pointer-sign -fwrapv -fno-dwarf2-cfi-asm -DTX_DESCRIPTOR_IN_SYSTEM_MEMORY -DRX_DESCRIPTOR_IN_SYSTEM_MEMORY -DTX_BUFFER_IN_SYSTEM_MEMORY -DRX_BUFFER_IN_SYSTEM_MEMORY -DALTERNATE_DESCRIPTORS -DEXT_8_BYTE_DESCRIPTOR -O0 -Wall -DT_ETH_1588_051 -DALTERNATE_DESCRIPTORS -DEXT_8_BYTE_DESCRIPTOR -DNETHERNET_INTERRUPTS -DETH_IEEE1588_TESTS -DSNAPTYPSEL_TMSTRENA_TEVENTENA_TESTS -DT_ETH_1588_140_147 -DLOW_DEBUG_PRINTS -DMEDIUM_DEBUG_PRINTS -DHIGH_DEBUG_PRINTS -DMODULE -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(eth_main)"  -D"KBUILD_MODNAME=KBUILD_STR(conxt_eth)"  -c -o /home/vishal/20100426_eth_vishal/organised_eth/src/eth_main.o /home/vishal/20100426_eth_vishal/organised_eth/src/eth_main.c 

3 ответа

Решение

#pragma pack может работать

Если вы используете GCC, вы можете использовать упакованный атрибут в вашей структуре для предотвращения заполнения:

struct foo
{
    void * bar;
}
__attribute__( ( packed ) );

Я подозреваю, что GCC заставляет всю структуру быть выровненной по 32-битной границе, поэтому ее размер кратен 4.

Представьте себе следующее. struct foo {

пустота * бар; некоторые другие вещи.....};

struct foo my_foo_array [10];

Тогда, если sizeof(struct foo) не кратен 4, тогда. my_foo_array[0].bar имеет другое выравнивание памяти для my_foo_array[1].bar. Процессору потребуется выполнить 2 32-битных доступа к памяти, чтобы получить доступ ко всем четырем байтам my_foo_array[1].bar. Процессоры x86 выполнят эту повторную сборку неверно выровненных 32-битных значений, но большинство других процессоров вызовут некоторую форму исключения ошибки шины, что не очень хорошо

Атрибут упакованного сигнала указывает, как элементы структуры упакованы относительно друг друга, но при нормальной работе начало структуры должно быть размещено на 32-битном выровненном адресе.

Я надеюсь, что это объясняет вещи немного лучше.

Другие вопросы по тегам