Re: What does .section do ?
A .section directive is used to tag bits of code (following the directive upto the next .section) with a section name. The linker will collect all code in a particular named section together, so it is concatenated into one area of memory, and the linker is usually given a command file which tells it which sections to combine, the properties of each section (code, read-only, read-write, initialised,...), and where/which order to put them in the binary generated by the linker. When you compile and link on Windows/Linux/.., the compiler driver generates thr linker command file automatically (or generates sections corresponding to the linker defaults), so that the linker produces the what the c startup code expects.
In your case, it appears that the linker is doing what you want (because it is putting the .reset section with the .init section). If you want to eliminate the warning, you should either change the section name in the directive to .init, or tell the linker to combine the .reset section with the .init section. How you do this depends on your linker: you need to RTM.
For it to work sensibly, if you are collecting code into a section you need to make sure that each tagged part it is complete function with start and return, because the linker will simply concatenate the bits of code tagged with one name together in some arbitrary order. While this would be fine for data, it isn't a generally a successful strategy to assume that a randomly assembled sequence of little bits of code will always work together correctly.
Assuming this is going to be put into ROM, something like the .init section should probably have code located at wherever your processor reset vector is, setup hardware, and either start your RTOS or jump to your c initialisation routine then to main().
HTH
Barny