LINUX.ORG.RU

Сообщения repu1sion

 

При компиляции однобайтового массива на 100Мб gcc cъедает 15GB RAM

Есть сишный файл enclose_io_memfs.c с одним единственным массивом. Весь массив забит разными значениями, не нулями.

#include <stdint.h>
#include <stddef.h>

const uint8_t enclose_io_memfs[114798592] = { 104
,115,113,115,104,55,0,0,25,234,210,93,0,0,2,0,239,1,0,0,1,0,17,0,192,0,1,0,4,0,0,0,48,8,227,225,1,0,0,0,27,167,215,6,0,0,0,0,19,167,215,6,0,0,0,0,255,255,255,255,255,255,255,255,107,96,211,6,0,0,0,0,71,69,213,6,0,0,0,0,200,84,215,6,0,0,0,0,157,166,215,6,0,0,0,0,120,218,140,189,7,92
,206,223,251,63,126,119,183,247,78,37,148,138,38,161,97,183,148,22,146,189,147,172,148,202,222,90,146,221,64,70,40,35,73,40,100,100,84,36,69,50,43,217,178,178,202,200,202,250,31,159,243,60,239,175,115,255,188,30,143,191,199,227,233,188,238,171,211,185,207,235,58,215,185,214,25,45,245,240,243,20,75,73,137,216,63,105,81,111,209,159,79,26,230,226,255,125,118,1,253,171,81
...
};

При самой обычной компиляции gcc -c enclose_io_memfs.c gcc 7.4 под убунтой 18.04 (стандартный, x64) съедает 15GB памяти! (1 процесс сс1). Размер *.с файла - 400Мб, размер получившегося *.о файла - где-то чуть больше 100Мб. Но почему он ест 15Gb и как его отучить от этого? --param ggc-min-expand=0 --param ggc-min-heapsize=0 не помогают.

 , , ,

repu1sion
()

qemu не создаёт network interface

Из под Ubuntu 16.04 x86_64 запускаю qemu-system-arm. Насколько я понимаю, он же должен по дефолту создавать виртуальный интерфейс аналогичный поднятому на хосте eth0 ?

Под убунтой есть гигабитная сетёвка, точно рабочая:

02:00.0 Ethernet controller: Qualcomm Atheros AR8121/AR8113/AR8114 Gigabit or Fast Ethernet (rev b0)
	Subsystem: ASUSTeK Computer Inc. AR8121/AR8113/AR8114 Gigabit or Fast Ethernet
	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0, Cache Line Size: 32 bytes
	Interrupt: pin A routed to IRQ 17
	Region 0: Memory at feac0000 (64-bit, non-prefetchable) [size=256K]
	Region 2: I/O ports at ec00 [size=128]
	Capabilities: <access denied>
	Kernel driver in use: ATL1E
	Kernel modules: atl1e

/mnt/ssd/archive/alpine/netboot$ ifconfig
eth0      Link encap:Ethernet  HWaddr 00:23:54:51:e2:53  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:106 errors:0 dropped:0 overruns:0 frame:0
          TX packets:158 errors:0 dropped:0 overruns:0 carrier:14
          collisions:0 txqueuelen:1000 
          RX bytes:17064 (17.0 KB)  TX bytes:16743 (16.7 KB)
Стартую qemu c ядром alpine linux 3.10, сеть не указываю, т.е. по дефолту:
qemu-system-arm -M virt -m 4096 -cpu cortex-a15 -hda alpine.qcow -kernel boot/vmlinuz-vanilla -initrd boot/initramfs-vanilla -append "console=ttyAMA0 ip=dhcp alpine_repo=http://dl-cdn.alpinelinux.org/alpine/edge/main/" -nographic
Приводит к тому что:
[    1.330405] Run /init as init process
Alpine Init 3.4.3-r0
 * Loading boot drivers: [    1.912070] loop: module loaded
[    1.919339] squashfs: version 4.0 (2009/01/31) Phillip Lougher
ok.
 * Mounting boot media: ok.
grep: /sys/class/net/eth*/operstate: No such file or directory
ERROR: IP requested but no network device was found
 * Installing packages to root filesystem: WARNING: Ignoring APKINDEX.1d32b339.tar.gz: No such file or directory
OK: 0 MiB in 0 packages
ok.
grep: /sysroot/etc/inittab: No such file or directory
/sbin/init not found in new root. Launching emergency recovery shell
Type exit to continue boot.
В /sys/clas/net есть только lo.

В документации написано: By default QEMU will create a SLiRP user network backend and an appropriate virtual network device for the guest (eg an E1000 PCI card for most x86 PC guests), as if you had typed -net nic -net user on your command line
Я так и не понял - я должен ему указать, что у меня девайс не е1000, а atl1e , или какого рожна ему надо.

Если кто может указать что не так - буду очень благодарен.

 , ,

repu1sion
()

wifi ad-hoc intel3945(linux) dlinkDWA510(windows)

на десктопе стоит длинковская сетевуха под виндой на ноуте слака 12.2, kernel 2.6.28.4. iwlist: root@pulsextensa:/etc# iwlist wlan0 scan wlan0 Scan completed : Cell 01 - Address: 02:1C:BF:00:00:4B ESSID:«pulsenet» Mode:Ad-Hoc Channel:7 Frequency:2.442 GHz (Channel 7) Quality=92/100 Signal level:-38 dBm Noise level=-80 dBm Encryption key:off IE: Unknown: 000870756C73656E6574 IE: Unknown: 010482848B96 IE: Unknown: 030107 IE: Unknown: 06020000 IE: Unknown: 2A0100 IE: Unknown: 32080C1218243048606C Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s 48 Mb/s; 54 Mb/s Extra:tsf=00000002b33471fb Extra: Last beacon: 235ms ago

сеть заводится после хитрого финта ушами: #iwconfig wlan0 essid pulsenet - лампочка вайфая начинает быстро-быстро мигать - пинга нет затем через несколько секунд #iwconfig wlan0 essid any (вместо any можно также подставить любой другой идентификатор) - и вуаля пинг есть, лампочка уже не сходит с ума всё тип-топ. wireless-tools - 29-e. Кто виноват и что делать?

repu1sion
()

не работает ulimit -c 0 из скрипта

из консоли - работает.

но если запустить

# sh ulim.sh

где ulim.sh выглядит примерно так:

----------------------------------------- #!/bin/bash

ulimit -a

ulimit -c 0

ulimit -d 0

ulimit -n 16000

-----------------------------------------

то из всего этого срабатывает только ulimit -a. Почему и как побороть?

P.S. Всё это из под рута.

repu1sion
()

opera 10 и flash

opera 10. flash-plugin установлен для файрфокса, а также положен в папку с плагинами оперы, в которой правильно указан путь к этой папке. таки вместо флеша имею это "Hello, you either have JavaScript turned off or an old version of Adobe's Flash Player." Вопрос. Оно в принципе не будет работать и надо какую-то старую конкретную версию оперы и конкретную версию флеш-плеера или всё таки его можно завести?

repu1sion
()

маленькая програмка чтобы вытащить числа из лога

пару недель назад столкнулся с такой проблемой. был лог, и из этого лога нужно было вытащить числа, сложить и посчитать среднее арифметическое. я не нашёл никакой тулзы или редактора который бы мог сделать это автоматом и не нужно было клацать на калькуляторе 150 чисел вручную (хотя не исключено что вим это умеет). вот кусок лога: [demod/stv362/s362lock.c:189][0] s362_Lock() Status[2] Time[500ms] [demod/stv362/s362lock.c:189][0] s362_Lock() Status[2] Time[400ms] [demod/stv362/s362lock.c:189][0] s362_Lock() Status[2] Time[1800ms] [demod/stv362/s362lock.c:189][0] s362_Lock() Status[2] Time[500ms] мне нужно было вытащить эти самые миллисекунды. я решил не заморачиваться поисками и написал такую простенькую программку, которая это делает. в данный момент нет поддержки связанных списков для файлов неопределённого размера, не поддерживается обработка того, что время попадается 2 раза в строке, и нет защиты от переполнения unsigned int переменной. В общем-то хотелось бы послушать какие ещё тут могут быть бока, а также про неоптимальность алгоритма и т.д. и т.п. ;)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


char *version="0.53";
#define CHARS_PER_STRING 300
//#define DEBUG_ENABLE


FILE * file_ptr;
int times[300];  // strings in file

int FileScan(FILE* file_ptr, const char * sequence)
{
	unsigned int i;
	unsigned int sequence_size=0;
	unsigned int total=0;
	unsigned char have_sequence=0;
	char tmp_string[CHARS_PER_STRING];   //array to contain one string
	char * tmp_str_ptr;
  char digit[10];
  int digit_cnt=0;
	unsigned int strings_seq_cnt=0;     //strings with sequence found
	unsigned int strings_total_cnt=0;   //total number of strings in file

	sequence_size=strlen(sequence);
  
#ifdef DEBUG_ENABLE
	printf ("sequence: %s \n", sequence);
	printf("size of seq %d\n", sequence_size);
#endif

	//working till the EOF, one iteration == one string have read
	while ( fgets(tmp_string,CHARS_PER_STRING,file_ptr) != NULL )
	{
		tmp_str_ptr=tmp_string;
		have_sequence=0;
  		while (*tmp_str_ptr)
  		{
    			if (*tmp_str_ptr == *sequence)
    			{
      				if ( !strncmp(tmp_str_ptr,sequence,sequence_size) ) //if we found Time[
      				{
#ifdef DEBUG_ENABLE
					printf("seq found\n");
#endif
		        		tmp_str_ptr += sequence_size ;   //set pointer to time digits
        				while (*tmp_str_ptr >= '0' && *tmp_str_ptr <= '9')
        				{
	  					if (digit_cnt >= 10)
	  					{
	  						printf("[error] value found is too big. \n");
							return 1;
	  					}
          					digit[digit_cnt]=*tmp_str_ptr;
          					tmp_str_ptr++;
          					digit_cnt++;
	  					have_sequence=1;
        				}
#ifdef DEBUG_ENABLE
					printf ("digit %d \n",digit_cnt);
#endif
      				}
    			}
    			tmp_str_ptr++;
  		}

		if (have_sequence)
		{
			times[strings_seq_cnt]=atoi(digit);
			strings_seq_cnt++;
		}
  		for (i=0; i<10; i++)
    			digit[i]='a';
  		strings_total_cnt++;  //increased for every cycle iteration, contains number of strings in file
  		digit_cnt=0;

	}

	for (i=0; i<strings_seq_cnt; i++)
 	{
   		total+=times[i];
   		printf ("string: %d time : %d \n",i+1,times[i]);
 	}
 	printf ("strings total:         %d \n",strings_total_cnt);
	printf ("strings with sequence: %d \n",strings_seq_cnt);
	printf ("time sum:              %d \n",total);
 	if (strings_seq_cnt)
		total/=strings_seq_cnt;
	printf ("time~: %d\n",total);

	return 0;
}


int main (int argc , char* argv[])
{
	unsigned int i;

#ifdef DEBUG_ENABLE
	printf("timefromlog started. version: %s\n",version);
	printf("argc=%d\n",argc);
	for (i=0; i<argc; i++)
	{
		printf("argv[%d]: %s\n",i,argv[i]);
	}

#endif
	//parsing input without getopt() ! 
	if (argc == 2)
	{
		if ( !(strcmp(argv[1],"--help") ) )  
			printf ("this is a help for timefromlog program.\nfirst param: filename to search in.\nsecond param: sequence digits start after.\n --help    - this help\n --version - program version\n");
		else if ( !(strcmp(argv[1],"--version") ) )  
			printf ("version: %s  \n", version);
		else
			printf("incorrect params. run program with --help\n");
		return 1;
	}       
	else if (argc != 3)
	{
		printf("incorrect params. run program with --help\n");
		return 1;
	}

	file_ptr=fopen(argv[1],"r");
	if (!file_ptr)
	{
		printf("[error] : can't open file\n");
		return 1;
	}
	else 
		printf("[working] : file opened\n");

	FileScan(file_ptr, argv[2]);
	
	if ( !fclose(file_ptr) )
		printf("[working] : file closed successfully\n");
	else 
		printf("[error] : file can not be closed\n");
  

  return 0;
}

repu1sion
()

vim and ctags

есть 5 различных реализаций одной и той же функции. По Ctrl+] vim переходит на первую. Как мне добиться чтобы он переходил и на остальные или выдавал список что мы нашли 5 дефинишнов такой функции?

repu1sion
()

RSS подписка на новые темы