Сейчас на форуме: tyns777 (+5 невидимых) |
![]() |
eXeL@B —› Программирование —› Работа с сетевой картой на аппаратном уровне |
Посл.ответ | Сообщение |
|
Создано: 04 сентября 2007 14:45 · Личное сообщение · #1 |
|
Создано: 04 сентября 2007 20:04 · Личное сообщение · #2 Freecod, задачу ты IMHO ставишь в корне не верно. Что бы заботать с железом напрямую тебе надо читать data sheet железа. Для многих чипов эти спецификации опубликованы, и для ещё большего написаны драйвера. Если интересно - смотри в ядро линукса - drivers/net/. Главный вопрос вот в чём - ты пишешь свою операционку? Если да, то тебе надо писать драйвер который реализует абстрактный интерфейс, а если нет, то твоя OS уже использует железо и ты не сможешь просто так отправить пакет. В любом случае разговор об "отправки файла" не идёт т.к. железо оперирует пакетами. Если ты сидишь под windows, то можешь разговаривать с картой через NDIS - это как раз тот слой который делает абстракцию от железа. Если хочешь писать сам, то копать нужно в сторону ndis intermediate driver или protocol driver. Если тебе надо rootkit, то качни чью-нить реализацию kernel mode sockets и используй. ![]() |
|
Создано: 05 сентября 2007 06:16 · Личное сообщение · #3 Нет-нет, просто процесс познания сопряжённый с напрягом со стороны преподователя ОСей =) Работа в Win, не через API или прерывания, а напрямую. Спецификация COM была на лекциях, а вот с сетевой картой всё неизвестно. Хотя вроде как должно быть аналогично. Кое-какую инфу уже нашёл, но если найдутся сорсы, буду рад. ![]() |
|
Создано: 05 сентября 2007 07:24 · Личное сообщение · #4 Freecod пишет: а вот с сетевой картой всё неизвестно Где учишся, если не секрет? Впервые слышу чтобы студентам давали задание такой сложности, как передача файла напрямую через сетевуху. Вот список того, что тебе понадобиться реализовать: 1 - network io driver (собственно драйвер сетевухи) 2 - ARP 3 - IP 4 - TCP 5 - FTP/HTTP (собственно передача файла). Для упрощения я бы советовал не заморачиваться с полноценным tcp/ip, а сделать реализацию ARP ответа (в виде зашитого заранее пакета), упрощенный IP (без фрагментации и сборки пакетов), упрощенный UDP (допустимо не подсчитывать чексуму пакетов) и TFTP собственно для передачи файла. Только заранее спроси у своего препода конкретную модель сетевухи на которой это все должно работать, если будет что-либо совместимое с NE2000 то тебе повезло, если nForce чипы - то полная жопа (по ним нет никакой документации). ----- PGP key ![]() |
|
Создано: 05 сентября 2007 08:06 · Личное сообщение · #5 Факультет компьютерных технологий в крупном универсетете "с претензиями" =) Но это задание как бы "сверху" обязательного COM, для дополнительных ++ Мне всё это представлялось проще... на сервере программа посылает кадр(ы) с именем, размером файла клиенту на другую машину, потом идёт поток байт файла. Клиент это всё льёт в буфер, а потом создаёт файл. Соеденены машины как я понял напрямую. Здесь как я понимаю возникают отличия от COM с его посылкой данных через кабель в "никуда" и приёмом из "ниоткуда". Или нет? Рядом бродят мысли про MAC-адрес, пересылку пакетов в "нормальной" сети конкретному адресату, но всё смутно... Буду благодарен за ссылки по теме. ![]() |
|
Создано: 05 сентября 2007 08:23 · Личное сообщение · #6 Ознокомился с вопросом ещё ближе. Особенно порадовала фраза: Производители сетевых карт никогда не утруждали себя разработкой стандартного протокола управления картой на аппаратном уровне. Они просто выпускали драйвера для Windows, и в большинстве случаев потребителю этого было достаточно.
Все веселее и веселее. Начинаю думать, что ну их в * эти плюсы =\ ![]() |
|
Создано: 05 сентября 2007 10:23 · Личное сообщение · #7 Freecod пишет: Мне всё это представлялось проще... на сервере программа посылает кадр(ы) с именем, размером файла клиенту на другую машину, потом идёт поток байт файла. Ну, если компы соединены проводом напрямую, то можно и так слать, даже не заморачиваясь с ethernet хедером. Переводишь сетевуху в promiscous mide и можешь принимать любые пакеты произвольного формата. Короче проблема сводиться собственно к работе с сетевухой. И если неизвестно на какой именно сетевухе должно работать, то можно за это даже не браться. Для ne2000 и realtek чипов я тебе могу найти примеры. Для intel чипов можно написать по датащитам. Для nvidia - только реверсить виндовые драйвера. ----- PGP key ![]() |
|
Создано: 05 сентября 2007 12:00 · Личное сообщение · #8 |
|
Создано: 05 сентября 2007 12:11 · Личное сообщение · #9 |
|
Создано: 05 сентября 2007 13:06 · Личное сообщение · #10 |
|
Создано: 05 сентября 2007 19:14 · Поправил: s0larian · Личное сообщение · #11 Freecod, ёлки, тебе же ntldr растолковал - всё упирается в модель сетевухи. Тебе дали железо? Под какой операционкой ты это всё собираешься делать? Ты вообще представляешь себе как отладить кусок kernel mode кода? Вот ветвь линуксовых исходников: htt_://www.linuxhq.com/kernel/v2.6/22/drivers/net/index.html Freecod пишет: Здесь как я понимаю возникают отличия от COM с его посылкой данных через кабель в "никуда" и приёмом из "ниоткуда". Или нет? Рядом бродят мысли про MAC-адрес, пересылку пакетов в "нормальной" сети конкретному адресату, но всё смутно... IMHO самая простая модель будет послыть broadcast frames. Каждый комп включённый в hub/switch будет их получать. Если хочешь, то можно реализовать и unicast но тогда тебе нужет ARP или его аналог. htt_://en.wikipedia.org/wiki/Ethernet htt_://en.wikipedia.org/wiki/Address_Resolution_Protocol htt_://en.wikipedia.org/wiki/Internet_Protocol Чуть теории - если железо современное, то тебе придётся разбираться с PCI шиной (контроллером) и DMA transfers. Сетевухе понадобиться packet descriptor ring... Если старая и использует programmed IO, то будешь забивать пакет в регистр по несколько байтов. Короче много всего. Самая большая беда, думаю, будет это всё отладить под виндузами: обычный драйвер загружать нельзя, железо надо откоконфигурировать... Если будешь писать NDIS драйвер, то вначале попаришься с этой спецификацией... Если под линуксом - то проще. Компилишь kernel module и вперёд. Будешь разбираться с io control calls и procfs ![]() Короче, тут много подходов и много часов работы. Спрашивай более конкретно. ![]() |
![]() |
eXeL@B —› Программирование —› Работа с сетевой картой на аппаратном уровне |